LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIFJlZCBIYXQsIEluYy4KICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCiAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqIFJlZCBIYXQsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoKICogQGF1dGhvciBCb2IgQnJvZHQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnBhY2thZ2Ugb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci51aS5hZGFwdGVycy5wcm9wZXJ0aWVzOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuQWN0aXZpdHk7CmltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5CcG1uMlBhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5EYXRhSW5wdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5EYXRhT2JqZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIuRGF0YU9iamVjdFJlZmVyZW5jZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLkRhdGFPdXRwdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5JbnB1dE91dHB1dFNwZWNpZmljYXRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5NdWx0aUluc3RhbmNlTG9vcENoYXJhY3RlcmlzdGljczsKaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLlByb2Nlc3M7CmltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5TdWJQcm9jZXNzOwppbXBvcnQgb3JnLmVjbGlwc2UuYnBtbjIubW9kZWxlci5jb3JlLmFkYXB0ZXJzLkV4dGVuZGVkUHJvcGVydGllc0FkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUuYWRhcHRlcnMuRmVhdHVyZURlc2NyaXB0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5icG1uMi5tb2RlbGVyLmNvcmUubW9kZWwuQnBtbjJNb2RlbGVyRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmJwbW4yLm1vZGVsZXIuY29yZS51dGlscy5Nb2RlbFV0aWw7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CgovKioKICogQGF1dGhvciBCb2IgQnJvZHQKICoKICovCnB1YmxpYyBjbGFzcyBNdWx0aUluc3RhbmNlTG9vcENoYXJhY3RlcmlzdGljc1Byb3BlcnRpZXNBZGFwdGVyIGV4dGVuZHMgRXh0ZW5kZWRQcm9wZXJ0aWVzQWRhcHRlcjxNdWx0aUluc3RhbmNlTG9vcENoYXJhY3RlcmlzdGljcz4gewoKCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIExPT1BfREFUQV9JTlBVVF9SRUYgPSBCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5zdGFuY2VMb29wQ2hhcmFjdGVyaXN0aWNzX0xvb3BEYXRhSW5wdXRSZWYoKTsKCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIElOUFVUX0RBVEFfSVRFTSA9IEJwbW4yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnN0YW5jZUxvb3BDaGFyYWN0ZXJpc3RpY3NfSW5wdXREYXRhSXRlbSgpOwoJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgTE9PUF9EQVRBX09VVFBVVF9SRUYgPSBCcG1uMlBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5zdGFuY2VMb29wQ2hhcmFjdGVyaXN0aWNzX0xvb3BEYXRhT3V0cHV0UmVmKCk7Cglwcm90ZWN0ZWQgZmluYWwgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBPVVRQVVRfREFUQV9JVEVNID0gQnBtbjJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUluc3RhbmNlTG9vcENoYXJhY3RlcmlzdGljc19PdXRwdXREYXRhSXRlbSgpOwoJCgkvKioKCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQoJICogQHBhcmFtIG9iamVjdAoJICovCglwdWJsaWMgTXVsdGlJbnN0YW5jZUxvb3BDaGFyYWN0ZXJpc3RpY3NQcm9wZXJ0aWVzQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgTXVsdGlJbnN0YW5jZUxvb3BDaGFyYWN0ZXJpc3RpY3Mgb2JqZWN0KSB7CgkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCk7CgoJCXNldEZlYXR1cmVEZXNjcmlwdG9yKExPT1BfREFUQV9JTlBVVF9SRUYsIG5ldyBMb29wQ2hhcmFjdGVyaXN0aWNzRGF0YUlvRmVhdHVyZURlc2NyaXB0b3IodGhpcywgb2JqZWN0LCBMT09QX0RBVEFfSU5QVVRfUkVGKSk7CgkJc2V0UHJvcGVydHkoTE9PUF9EQVRBX0lOUFVUX1JFRiwgVUlfSVNfTVVMVElfQ0hPSUNFLCBCb29sZWFuLlRSVUUpOwoJCXNldFByb3BlcnR5KExPT1BfREFUQV9JTlBVVF9SRUYsIFVJX0NBTl9FRElULCBCb29sZWFuLlRSVUUpOwoJCXNldFByb3BlcnR5KExPT1BfREFUQV9JTlBVVF9SRUYsIFVJX0NBTl9DUkVBVEVfTkVXLCBCb29sZWFuLlRSVUUpOwoJCQovLwkJc2V0RmVhdHVyZURlc2NyaXB0b3IoSU5QVVRfREFUQV9JVEVNLCBuZXcgTG9vcENoYXJhY3RlcmlzdGljc0RhdGFJb0ZlYXR1cmVEZXNjcmlwdG9yKGFkYXB0ZXJGYWN0b3J5LG9iamVjdCwgSU5QVVRfREFUQV9JVEVNKSk7Ci8vCQlzZXRQcm9wZXJ0eShJTlBVVF9EQVRBX0lURU0sIFVJX0lTX01VTFRJX0NIT0lDRSwgQm9vbGVhbi5UUlVFKTsKCgkJc2V0RmVhdHVyZURlc2NyaXB0b3IoTE9PUF9EQVRBX09VVFBVVF9SRUYsIG5ldyBMb29wQ2hhcmFjdGVyaXN0aWNzRGF0YUlvRmVhdHVyZURlc2NyaXB0b3IodGhpcywgb2JqZWN0LCBMT09QX0RBVEFfT1VUUFVUX1JFRikpOwoJCXNldFByb3BlcnR5KExPT1BfREFUQV9PVVRQVVRfUkVGLCBVSV9JU19NVUxUSV9DSE9JQ0UsIEJvb2xlYW4uVFJVRSk7CgkJc2V0UHJvcGVydHkoTE9PUF9EQVRBX09VVFBVVF9SRUYsIFVJX0NBTl9FRElULCBCb29sZWFuLlRSVUUpOwoJCXNldFByb3BlcnR5KExPT1BfREFUQV9PVVRQVVRfUkVGLCBVSV9DQU5fQ1JFQVRFX05FVywgQm9vbGVhbi5UUlVFKTsKCi8vCQlzZXRGZWF0dXJlRGVzY3JpcHRvcihPVVRQVVRfREFUQV9JVEVNLCBuZXcgTG9vcENoYXJhY3RlcmlzdGljc0RhdGFJb0ZlYXR1cmVEZXNjcmlwdG9yKGFkYXB0ZXJGYWN0b3J5LG9iamVjdCwgT1VUUFVUX0RBVEFfSVRFTSkpOwovLwkJc2V0UHJvcGVydHkoT1VUUFVUX0RBVEFfSVRFTSwgVUlfSVNfTVVMVElfQ0hPSUNFLCBCb29sZWFuLlRSVUUpOwoJfQoKCS8qKgoJICogVGhpcyBjbGFzcyBjYWxjdWxhdGVzIHRoZSBMb29wIElucHV0L091dHB1dCBjb2xsZWN0aW9ucyBhbmQgSW5wdXQvT3V0cHV0IHBhcmFtZXRlcnMgdGhhdCBhcmUgaW4gc2NvcGUgZm9yIHRoZSAKCSAqIEFjdGl2aXR5IHRoYXQgb3ducyB0aGlzIE11bHRpLUluc3RhbmNlIExvb3AgQ2hhcmFjdGVyaXN0aWNzIG9iamVjdC4gRnJvbSB0aGUgQlBNTjIgc3BlYzoKCSAqIAoJICogTG9vcCBEYXRhIElucHV0L091dHB1dCAodGhlIGNvbGxlY3Rpb24pOgoJICogICAgRm9yIFRhc2tzIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGEgRGF0YSBJbnB1dC9PdXRwdXQgd2hpY2ggaXMgcGFydCBvZiB0aGUgQWN0aXZpdHmScyBJbnB1dE91dHB1dFNwZWNpZmljYXRpb24uCgkgKiAgICBGb3IgU3ViLVByb2Nlc3NlcyBpdCBpcyBhIHJlZmVyZW5jZSB0byBhIGNvbGxlY3Rpb24tdmFsdWVkIERhdGEgT2JqZWN0IGluIHRoZSBjb250ZXh0IHRoYXQgaXMgdmlzaWJsZSB0byB0aGUKCSAqICAgIFN1Yi1Qcm9jZXNzZXMuCgkgKiAgICAKCSAqIElucHV0L091dHB1dCBQYXJhbWV0ZXIgKHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXIpOgoJICogICBUaGlzIERhdGEgSW5wdXQvT3V0cHV0IGNhbiBiZSB0aGUgc291cmNlL3RhcmdldCBvZiBEYXRhSW5wdXQvT3V0cHV0QXNzb2NpYXRpb24gdG8gYSBkYXRhIGlucHV0L291dHB1dCBvZiB0aGUKCSAqICAgQWN0aXZpdHmScyBJbnB1dE91dHB1dFNwZWNpZmljYXRpb24uCgkgKiAgIFRoZSB0eXBlIG9mIHRoaXMgRGF0YSBJbnB1dC9PdXRwdXQgTVVTVCBiZSB0aGUgc2NhbGFyIG9mIHRoZSB0eXBlIGRlZmluZWQgZm9yIHRoZSBsb29wRGF0YUlucHV0L091dHB1dC4KCSAqLwoJcHJvdGVjdGVkIGNsYXNzIExvb3BDaGFyYWN0ZXJpc3RpY3NEYXRhSW9GZWF0dXJlRGVzY3JpcHRvciBleHRlbmRzIEZlYXR1cmVEZXNjcmlwdG9yPE11bHRpSW5zdGFuY2VMb29wQ2hhcmFjdGVyaXN0aWNzPiB7CgoJCXB1YmxpYyBMb29wQ2hhcmFjdGVyaXN0aWNzRGF0YUlvRmVhdHVyZURlc2NyaXB0b3IoCgkJCQlFeHRlbmRlZFByb3BlcnRpZXNBZGFwdGVyPE11bHRpSW5zdGFuY2VMb29wQ2hhcmFjdGVyaXN0aWNzPiBvd25lciwKCQkJCU11bHRpSW5zdGFuY2VMb29wQ2hhcmFjdGVyaXN0aWNzIG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKCQkJc3VwZXIob3duZXIsIG9iamVjdCwgZmVhdHVyZSk7CgkJfQoKCQlAT3ZlcnJpZGUKCQlwdWJsaWMgRU9iamVjdCBjcmVhdGVGZWF0dXJlKFJlc291cmNlIHJlc291cmNlLCBFQ2xhc3MgZWNsYXNzKSB7CgkJCUVPYmplY3QgdmFsdWUgPSBzdXBlci5jcmVhdGVGZWF0dXJlKHJlc291cmNlLCBlY2xhc3MpOwoJCQkvLyBpZiB0aGUgbmV3IG9iamVjdCBpcyB0aGUgY29sbGVjdGlvbiByZWZlcmVuY2UsIHdlIG5lZWQgdG8gYXR0YWNoIGl0IHRvIHRoZQoJCQkvLyBhY3Rpdml0eSdzIElucHV0T3V0cHV0U3BlY2lmaWNhdGlvbi4KCQkJaWYgKGZlYXR1cmU9PUxPT1BfREFUQV9JTlBVVF9SRUYgfHwgZmVhdHVyZT09TE9PUF9EQVRBX09VVFBVVF9SRUYpIHsKCQkJCUFjdGl2aXR5IGNvbnRhaW5lciA9IChBY3Rpdml0eSlNb2RlbFV0aWwuZ2V0Q29udGFpbmVyKG9iamVjdCk7CgkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGNvbnRhaW5lci5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoImlvU3BlY2lmaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCgkJCQlpZiAoZiE9bnVsbCkgewoJCQkJCUlucHV0T3V0cHV0U3BlY2lmaWNhdGlvbiBpb1NwZWNpZmljYXRpb24gPSAoSW5wdXRPdXRwdXRTcGVjaWZpY2F0aW9uKWNvbnRhaW5lci5lR2V0KGYpOwoJCQkJCWlmIChpb1NwZWNpZmljYXRpb249PW51bGwpIHsKCQkJCQkJaW9TcGVjaWZpY2F0aW9uID0gQnBtbjJNb2RlbGVyRmFjdG9yeS5jcmVhdGVGZWF0dXJlKGNvbnRhaW5lciwgZiwgSW5wdXRPdXRwdXRTcGVjaWZpY2F0aW9uLmNsYXNzKTsKCQkJCQl9CgkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0YUlucHV0KQoJCQkJCQlpb1NwZWNpZmljYXRpb24uZ2V0RGF0YUlucHV0cygpLmFkZCgoRGF0YUlucHV0KXZhbHVlKTsKCQkJCQllbHNlCgkJCQkJCWlvU3BlY2lmaWNhdGlvbi5nZXREYXRhT3V0cHV0cygpLmFkZCgoRGF0YU91dHB1dCl2YWx1ZSk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHZhbHVlOwoJCX0KCQkKCQlAT3ZlcnJpZGUKCQlwdWJsaWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRDaG9pY2VPZlZhbHVlcygpIHsKCQkJSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBjaG9pY2VzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKCQkJCgkJCUFjdGl2aXR5IGNvbnRhaW5lciA9IChBY3Rpdml0eSlNb2RlbFV0aWwuZ2V0Q29udGFpbmVyKG9iamVjdCk7CgkJCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOwoJCQlpZiAoZmVhdHVyZSA9PSBMT09QX0RBVEFfSU5QVVRfUkVGIHx8IGZlYXR1cmUgPT0gTE9PUF9EQVRBX09VVFBVVF9SRUYpIHsKLy8JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFRhc2spCgkJCQl7CgkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBjb250YWluZXIuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJpb1NwZWNpZmljYXRpb24iKTsgLy8kTk9OLU5MUy0xJAoJCQkJCWlmIChmIT1udWxsKSB7CgkJCQkJCUlucHV0T3V0cHV0U3BlY2lmaWNhdGlvbiBpb1NwZWNpZmljYXRpb24gPSAoSW5wdXRPdXRwdXRTcGVjaWZpY2F0aW9uKWNvbnRhaW5lci5lR2V0KGYpOwoJCQkJCQlpZiAoaW9TcGVjaWZpY2F0aW9uIT1udWxsKSB7CgkJCQkJCQlpZiAoZmVhdHVyZSA9PSBMT09QX0RBVEFfSU5QVVRfUkVGKQoJCQkJCQkJCXZhbHVlcy5hZGRBbGwoaW9TcGVjaWZpY2F0aW9uLmdldERhdGFJbnB1dHMoKSk7CgkJCQkJCQllbHNlCgkJCQkJCQkJdmFsdWVzLmFkZEFsbChpb1NwZWNpZmljYXRpb24uZ2V0RGF0YU91dHB1dHMoKSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9Ci8vCQkJCWVsc2UgCgkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3ViUHJvY2VzcykgewoJCQkJCS8vIENvbGxlY3QgYWxsIERhdGFPYmplY3RzIGZyb20gUHJvY2VzcyBhbmQgU3ViUHJvY2VzcyBhbmNlc3RvcnMKCQkJCQkvLyBEYXRhT2JqZWN0cyBhcmUgRmxvd0VsZW1lbnRzLCBzbyB3ZSB3aWxsIGhhdmUgdG8gd2VlZCB0aG9zZSBvdXQgZnJvbSBvdGhlciBGbG93RWxlbWVudHMuCgkJCQkJTGlzdDxFT2JqZWN0PiBmbG93RWxlbWVudHMgPSBNb2RlbFV0aWwuY29sbGVjdEFuY2VzdG9yT2JqZWN0cyhvYmplY3QsICJmbG93RWxlbWVudHMiLCBuZXcgQ2xhc3NbXSB7UHJvY2Vzcy5jbGFzcywgU3ViUHJvY2Vzcy5jbGFzc30pOyAvLyROT04tTkxTLTEkCgkJCQkJZm9yIChFT2JqZWN0IGZlIDogZmxvd0VsZW1lbnRzKSB7CgkJCQkJCWlmIChmZSBpbnN0YW5jZW9mIERhdGFPYmplY3RSZWZlcmVuY2UpIHsKCQkJCQkJCWZlID0gKChEYXRhT2JqZWN0UmVmZXJlbmNlKWZlKS5nZXREYXRhT2JqZWN0UmVmKCk7CgkJCQkJCX0KCQkJCQkJaWYgKCEoZmUgaW5zdGFuY2VvZiBEYXRhT2JqZWN0KSkgewoJCQkJCQkJZmUgPSBudWxsOwoJCQkJCQl9CgkJCQkJCWlmIChmZSE9bnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKGZlKSkKCQkJCQkJCXZhbHVlcy5hZGQoZmUpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlIHsKCQkJCS8vIElOUFVUX0RBVEFfSVRFTSBvciBPVVRQVVRfREFUQV9JVEVNIGZlYXR1cmUKCQkJCS8vIFRPRE86IFRoaXMgcGFydCBvZiB0aGUgc3BlYyBpcyB1bmNsZWFyIHRvIG1lLiBJdCBsb29rcyBsaWtlIHRoZSBEYXRhIElucHV0L091dHB1dCBJdGVtcyBuZWVkIHRvCgkJCQkvLyBiZSBjb250YWluZWQgaW4gdGhlIE1JIExvb3AgQ2hhcmFjdGVyaXN0aWNzLiBTb21ldGhpbmcgbGlrZSB0aGlzOgoJCQkJLy8KCQkJCS8vIDxtdWx0aUluc3RhbmNlTG9vcENoYXJhY3RlcmlzdGljcyBpZD0iTUlfNiI+CgkJCQkvLyAgICAgPGxvb3BEYXRhSW5wdXRSZWY+RGF0YU9iamVjdF8zPC9icG1uMjpsb29wRGF0YUlucHV0UmVmPgoJCQkJLy8gICAgIDxpbnB1dERhdGFJdGVtIHhzaTp0eXBlPSJicG1uMjp0RGF0YUlucHV0IiBpZD0iRGF0YUlucHV0XzEiIGl0ZW1TdWJqZWN0UmVmPSJJdGVtRGVmaW5pdGlvbl8xIiBuYW1lPSJpbnB1dF9wYXJhbSIvPgoJCQkJLy8gPC9tdWx0aUluc3RhbmNlTG9vcENoYXJhY3RlcmlzdGljcz4KCQkJfQoJCQkKCQkJaWYgKHZhbHVlcyE9bnVsbCkgewoJCQkJZm9yIChPYmplY3QgcCA6IHZhbHVlcykgewoJCQkJCWNob2ljZXMucHV0KCBnZXRDaG9pY2VTdHJpbmcocCksIHApOwoJCQkJfQoJCQl9CgkJCXN1cGVyLnNldENob2ljZU9mVmFsdWVzKGNob2ljZXMpOwoJCQlyZXR1cm4gc3VwZXIuZ2V0Q2hvaWNlT2ZWYWx1ZXMoKTsKCQl9Cgl9Cn0K