LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAxMyBDRUEgTElTVC4KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICoKICogQ29udHJpYnV0b3JzOgogKgkJUulnaXMgQ0hFVlJFTDogY2hldnJlbC5yZWdpcyA8YXQ+IGdtYWlsLmNvbQogKgkJQ0VBIExJU1QgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwuZGlhZ3JhbS5wYXJhbWV0cmljLnBvbGljaWVzOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwppbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7CmltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uRWRpdFBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50TWF0Y2hlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuU3BlY2lhbGl6YXRpb25UeXBlOwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlcXVlc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5zeXNtbC5jb25zdHJhaW50cy5Db25zdHJhaW50QmxvY2s7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sLmRpYWdyYW0uY29tbW9uLmVkaXQucGFydC5CbG9ja1Byb3BlcnR5Q29tcG9zaXRlRWRpdFBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sLmRpYWdyYW0ucGFyYW1ldHJpYy5jb21tYW5kcy5DdXN0b21CaW5kaW5nQ29ubmVjdG9yQ3JlYXRlQ29tbWFuZDsKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwuZGlhZ3JhbS5wYXJhbWV0cmljLmNvbW1hbmRzLkN1c3RvbVBhcmFtZXRyaWNDb250ZXh0TGlua1Jlb3JpZW50Q29tbWFuZDsKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwuZGlhZ3JhbS5wYXJhbWV0cmljLmNvbW1hbmRzLlJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdFdpdGhHcmFwaGljYWw7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sLmRpYWdyYW0ucGFyYW1ldHJpYy5lZGl0LnBhcnQuQ3VzdG9tQmxvY2tDb21wb3NpdGVFZGl0UGFydFROOwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5zeXNtbC5kaWFncmFtLnBhcmFtZXRyaWMuZWRpdC5wYXJ0LkN1c3RvbUNvbnN0cmFpbnRCbG9ja1Byb3BlcnR5Q29tcG9zaXRlRWRpdFBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sLmRpYWdyYW0ucGFyYW1ldHJpYy5lZGl0LnBvbGljeS5EaWFncmFtU2VtYW50aWNFZGl0UG9saWN5OwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5zeXNtbC5zZXJ2aWNlLnR5cGVzLm1hdGNoZXIuUGFydFByb3BlcnR5TWF0Y2hlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwuc2VydmljZS50eXBlcy5tYXRjaGVyLlJlZmVyZW5jZVByb3BlcnR5TWF0Y2hlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwuc2VydmljZS50eXBlcy5tYXRjaGVyLlZhbHVlUHJvcGVydHlNYXRjaGVyOwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy51bWwuZGlhZ3JhbS5jbGF6ei5lZGl0LnBhcnRzLkNvbnRleHRMaW5rRWRpdFBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnVtbC5kaWFncmFtLmNvbW1vbi5lZGl0LnBhcnQuQ29uc3RyYWludFBhcmFtZXRlckFmZml4ZWROb2RlRWRpdFBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnVtbC5kaWFncmFtLmNvbW1vbi5lZGl0LnBhcnQuUG9ydEFmZml4ZWROb2RlRWRpdFBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnVtbC50b29scy51dGlscy5VTUxVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3M7CmltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5FbGVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKCnB1YmxpYyBjbGFzcyBDdXN0b21QYXJhbWV0cmljU2VtYW50aWNQb2xpY3kgZXh0ZW5kcyBEaWFncmFtU2VtYW50aWNFZGl0UG9saWN5IHsKCglAT3ZlcnJpZGUKCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSB7CgkJCWlmICgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSByZXF1ZXN0KS5nZXRFbGVtZW50VHlwZSgpLmdldEVDbGFzcygpID09IFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFByb3BlcnR5KCkpIHsKCQkJCS8vIENvdWxkIGNyZWF0ZSBhIENvbnN0cmFpbnRQYXJhbWV0ZXIgb24gdGhlIGRpYWdyYW0gZnJhbWUgb25seSBpZiBob3N0IGVsZW1lbnQgaXMgYSBDb25zdHJhaW50QmxvY2sKCQkJCUVsZW1lbnQgc2VtYW50aWNPd25lciA9IFVNTFV0aWwucmVzb2x2ZVVNTEVsZW1lbnQodGhpcy5nZXRIb3N0KCkpOwoJCQkJaWYgKHNlbWFudGljT3duZXIgaW5zdGFuY2VvZiBDbGFzcyAmJiBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHNlbWFudGljT3duZXIsIENvbnN0cmFpbnRCbG9jay5jbGFzcykgPT0gbnVsbCkgewoJCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwoJCQkJfQoJCQkJLy8gQ291bGQgbm90IGNyZWF0ZSBQYXJ0L1JlZmVyZW5jZS9WYWx1ZQoJCQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVFbGVtZW50UmVxdWVzdCAmJiAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSByZXF1ZXN0KS5nZXRFbGVtZW50VHlwZSgpIGluc3RhbmNlb2YgU3BlY2lhbGl6YXRpb25UeXBlKSB7CgkJCQkJSUVsZW1lbnRNYXRjaGVyIG1hdGNoZXIgPSAoKFNwZWNpYWxpemF0aW9uVHlwZSkgKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgcmVxdWVzdCkuZ2V0RWxlbWVudFR5cGUoKSkuZ2V0TWF0Y2hlcigpOwoJCQkJCWlmIChtYXRjaGVyIGluc3RhbmNlb2YgUGFydFByb3BlcnR5TWF0Y2hlcikgewoJCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKCQkJCQl9CgkJCQkJaWYgKG1hdGNoZXIgaW5zdGFuY2VvZiBSZWZlcmVuY2VQcm9wZXJ0eU1hdGNoZXIpIHsKCQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7CgkJCQkJfQoJCQkJCWlmIChtYXRjaGVyIGluc3RhbmNlb2YgVmFsdWVQcm9wZXJ0eU1hdGNoZXIpIHsKCQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBzdXBlci5nZXRTZW1hbnRpY0NvbW1hbmQocmVxdWVzdCk7Cgl9CgoJQE92ZXJyaWRlCglwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7CgkJaWYgKHJlcS5nZXRFbGVtZW50VHlwZSgpLmdldEVDbGFzcygpID09IFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3RvcigpKSB7CgkJCWlmIChnZXRIb3N0KCkgaW5zdGFuY2VvZiBDdXN0b21CbG9ja0NvbXBvc2l0ZUVkaXRQYXJ0VE4pIHsKCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwoJCQl9CgkJCWlmIChnZXRIb3N0KCkgaW5zdGFuY2VvZiBDdXN0b21Db25zdHJhaW50QmxvY2tQcm9wZXJ0eUNvbXBvc2l0ZUVkaXRQYXJ0KSB7CgkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKCQkJfQoJCQlpZiAoZ2V0SG9zdCgpIGluc3RhbmNlb2YgQ29uc3RyYWludFBhcmFtZXRlckFmZml4ZWROb2RlRWRpdFBhcnQpIHsKCQkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDdXN0b21CaW5kaW5nQ29ubmVjdG9yQ3JlYXRlQ29tbWFuZChyZXEpKTsKCQkJfQoJCQlpZiAoZ2V0SG9zdCgpIGluc3RhbmNlb2YgUG9ydEFmZml4ZWROb2RlRWRpdFBhcnQpIHsKCQkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDdXN0b21CaW5kaW5nQ29ubmVjdG9yQ3JlYXRlQ29tbWFuZChyZXEpKTsKCQkJfQoJCQlpZiAoZ2V0SG9zdCgpIGluc3RhbmNlb2YgQmxvY2tQcm9wZXJ0eUNvbXBvc2l0ZUVkaXRQYXJ0KSB7CgkJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ3VzdG9tQmluZGluZ0Nvbm5lY3RvckNyZWF0ZUNvbW1hbmQocmVxKSk7CgkJCX0KCQl9CgkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKCX0KCgkvKioKCSAqIE1ldGhvZCBnZXRSZW9yaWVudFJlZlJlbGF0aW9uc2hpcFRhcmdldENvbW1hbmQuIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0aGUKCSAqIENvbm5lY3Rpb25FZGl0UGFydCBjdXJyZW50IGhhcyBhbiBhZGQgdGhlIG5ldyBUYXJnZXRFZGl0UGFydAoJICoKCSAqIEBwYXJhbSByZXF1ZXN0CgkgKiBAcmV0dXJuIENvbW1hbmQKCSAqLwoJQE92ZXJyaWRlCglwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcFNvdXJjZUNvbW1hbmQoCgkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewoKCQlFZGl0UGFydCB0YXJnZXQgPSByZXF1ZXN0LmdldFRhcmdldCgpOwoJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBDdXN0b21CbG9ja0NvbXBvc2l0ZUVkaXRQYXJ0VE4pIHsKCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7CgkJfQoJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBDdXN0b21Db25zdHJhaW50QmxvY2tQcm9wZXJ0eUNvbXBvc2l0ZUVkaXRQYXJ0KSB7CgkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwoJCX0KCgkJb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uRVAgPSAocmVxdWVzdCkuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCk7CgoJCWlmIChjb25uZWN0aW9uRVAgaW5zdGFuY2VvZiBDb25uZWN0aW9uRWRpdFBhcnQpIHsKCQkJaWYgKCEoKENvbm5lY3Rpb25FZGl0UGFydCkgY29ubmVjdGlvbkVQKS5pc1NlbWFudGljQ29ubmVjdGlvbigpKSB7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCX0KCgkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSBjb25uZWN0aW9uRVAuZ2V0U291cmNlKCk7CgkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSBjb25uZWN0aW9uRVAuZ2V0VGFyZ2V0KCk7CgkJRU9iamVjdCByZWZlcmVuY2VPd25lciA9IFZpZXdVdGlsCgkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSk7CgkJRU9iamVjdCBvbGRUYXJnZXQgPSBWaWV3VXRpbAoJCQkJLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkpOwoJCUVPYmplY3QgbmV3VGFyZ2V0ID0gVmlld1V0aWwKCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSByZXF1ZXN0LmdldFRhcmdldCgpLmdldE1vZGVsKCkpOwoKCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7CgoJCVJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCBzZW1SZXF1ZXN0ID0gbmV3IFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdFdpdGhHcmFwaGljYWwoCgkJCQllZGl0aW5nRG9tYWluLCByZWZlcmVuY2VPd25lciwgbmV3VGFyZ2V0LCBvbGRUYXJnZXQsCgkJCQlSZW9yaWVudFJlcXVlc3QuUkVPUklFTlRfU09VUkNFLAoJCQkJcmVxdWVzdC5nZXRUYXJnZXQoKSwgdGFyZ2V0RWRpdFBhcnQpOwoKCQlzZW1SZXF1ZXN0LmFkZFBhcmFtZXRlcnMocmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKSk7CgkJcmV0dXJuIGdldFNlbWFudGljQ29tbWFuZChzZW1SZXF1ZXN0KTsKCX0KCgoKCS8qKgoJICogTWV0aG9kIGdldFJlb3JpZW50UmVmUmVsYXRpb25zaGlwVGFyZ2V0Q29tbWFuZC4gUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRoZQoJICogQ29ubmVjdGlvbkVkaXRQYXJ0IGN1cnJlbnQgaGFzIGFuIGFkZCB0aGUgbmV3IFRhcmdldEVkaXRQYXJ0CgkgKgoJICogQHBhcmFtIHJlcXVlc3QKCSAqIEByZXR1cm4gQ29tbWFuZAoJICovCglAT3ZlcnJpZGUKCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwVGFyZ2V0Q29tbWFuZCgKCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7CgoJCUVkaXRQYXJ0IHRhcmdldCA9IHJlcXVlc3QuZ2V0VGFyZ2V0KCk7CgkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEN1c3RvbUJsb2NrQ29tcG9zaXRlRWRpdFBhcnRUTikgewoJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKCQl9CgkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEN1c3RvbUNvbnN0cmFpbnRCbG9ja1Byb3BlcnR5Q29tcG9zaXRlRWRpdFBhcnQpIHsKCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7CgkJfQoKCQlvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb25FUCA9IChyZXF1ZXN0KS5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKTsKCgkJaWYgKGNvbm5lY3Rpb25FUCBpbnN0YW5jZW9mIENvbm5lY3Rpb25FZGl0UGFydCkgewoJCQlpZiAoISgoQ29ubmVjdGlvbkVkaXRQYXJ0KSBjb25uZWN0aW9uRVApLmlzU2VtYW50aWNDb25uZWN0aW9uKCkpIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgkJfQoKCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IGNvbm5lY3Rpb25FUC5nZXRTb3VyY2UoKTsKCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGNvbm5lY3Rpb25FUC5nZXRUYXJnZXQoKTsKCQlFT2JqZWN0IHJlZmVyZW5jZU93bmVyID0gVmlld1V0aWwKCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBzb3VyY2VFZGl0UGFydC5nZXRNb2RlbCgpKTsKCQlFT2JqZWN0IG9sZFRhcmdldCA9IFZpZXdVdGlsCgkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSk7CgkJRU9iamVjdCBuZXdUYXJnZXQgPSBWaWV3VXRpbAoJCQkJLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIHJlcXVlc3QuZ2V0VGFyZ2V0KCkuZ2V0TW9kZWwoKSk7CgoJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQoJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKCgkJUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0IHNlbVJlcXVlc3QgPSBuZXcgUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0V2l0aEdyYXBoaWNhbCgKCQkJCWVkaXRpbmdEb21haW4sIHJlZmVyZW5jZU93bmVyLCBuZXdUYXJnZXQsIG9sZFRhcmdldCwKCQkJCVJlb3JpZW50UmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQsCgkJCQlzb3VyY2VFZGl0UGFydCwgcmVxdWVzdC5nZXRUYXJnZXQoKSk7CgoJCXNlbVJlcXVlc3QuYWRkUGFyYW1ldGVycyhyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpKTsKCgkJcmV0dXJuIGdldFNlbWFudGljQ29tbWFuZChzZW1SZXF1ZXN0KTsKCX0KCglAT3ZlcnJpZGUKCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVmUmVsYXRpb25zaGlwU291cmNlQ29tbWFuZCgKCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7CgoJCWlmIChyZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpIGluc3RhbmNlb2YgQ29udGV4dExpbmtFZGl0UGFydCkgewoJCQlvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb25FUCA9IHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCk7CgoJCQlpZiAoY29ubmVjdGlvbkVQIGluc3RhbmNlb2YgQ29ubmVjdGlvbkVkaXRQYXJ0KSB7CgkJCQlpZiAoISgoQ29ubmVjdGlvbkVkaXRQYXJ0KSBjb25uZWN0aW9uRVApLmlzU2VtYW50aWNDb25uZWN0aW9uKCkpIHsKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCQkJfQoKCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSBjb25uZWN0aW9uRVAuZ2V0U291cmNlKCk7CgkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gY29ubmVjdGlvbkVQLmdldFRhcmdldCgpOwoJCQlFT2JqZWN0IHJlZmVyZW5jZU93bmVyID0gVmlld1V0aWwKCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSk7CgkJCUVPYmplY3Qgb2xkVGFyZ2V0ID0gVmlld1V0aWwKCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSk7CgkJCUVPYmplY3QgbmV3VGFyZ2V0ID0gVmlld1V0aWwKCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgcmVxdWVzdC5nZXRUYXJnZXQoKS5nZXRNb2RlbCgpKTsKCgkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQoJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7CgoJCQlSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3RXaXRoR3JhcGhpY2FsIHNlbVJlcXVlc3QgPSBuZXcgUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0V2l0aEdyYXBoaWNhbCgKCQkJCQllZGl0aW5nRG9tYWluLCByZWZlcmVuY2VPd25lciwgbmV3VGFyZ2V0LCBvbGRUYXJnZXQsCgkJCQkJUmVvcmllbnRSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSwKCQkJCQlzb3VyY2VFZGl0UGFydCwgdGFyZ2V0RWRpdFBhcnQpOwoJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ3VzdG9tUGFyYW1ldHJpY0NvbnRleHRMaW5rUmVvcmllbnRDb21tYW5kKHNlbVJlcXVlc3QpKTsKCQl9CgkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVmUmVsYXRpb25zaGlwVGFyZ2V0Q29tbWFuZChyZXF1ZXN0KTsKCX0KCglAT3ZlcnJpZGUKCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVmUmVsYXRpb25zaGlwVGFyZ2V0Q29tbWFuZCgKCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7CgkJaWYgKHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBDb250ZXh0TGlua0VkaXRQYXJ0KSB7CgkJCW9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbkVQID0gcmVxdWVzdC5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKTsKCgkJCWlmIChjb25uZWN0aW9uRVAgaW5zdGFuY2VvZiBDb25uZWN0aW9uRWRpdFBhcnQpIHsKCQkJCWlmICghKChDb25uZWN0aW9uRWRpdFBhcnQpIGNvbm5lY3Rpb25FUCkuaXNTZW1hbnRpY0Nvbm5lY3Rpb24oKSkgewoJCQkJCXJldHVybiBudWxsOwoJCQkJfQoJCQl9CgoJCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IGNvbm5lY3Rpb25FUC5nZXRTb3VyY2UoKTsKCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSBjb25uZWN0aW9uRVAuZ2V0VGFyZ2V0KCk7CgkJCUVPYmplY3QgcmVmZXJlbmNlT3duZXIgPSBWaWV3VXRpbAoJCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBzb3VyY2VFZGl0UGFydC5nZXRNb2RlbCgpKTsKCQkJRU9iamVjdCBvbGRUYXJnZXQgPSBWaWV3VXRpbAoJCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpKTsKCQkJRU9iamVjdCBuZXdUYXJnZXQgPSBWaWV3VXRpbAoJCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSByZXF1ZXN0LmdldFRhcmdldCgpLmdldE1vZGVsKCkpOwoKCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCgkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKCgkJCVJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdFdpdGhHcmFwaGljYWwgc2VtUmVxdWVzdCA9IG5ldyBSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3RXaXRoR3JhcGhpY2FsKAoJCQkJCWVkaXRpbmdEb21haW4sIHJlZmVyZW5jZU93bmVyLCBuZXdUYXJnZXQsIG9sZFRhcmdldCwKCQkJCQlSZW9yaWVudFJlcXVlc3QuUkVPUklFTlRfVEFSR0VULAoJCQkJCXNvdXJjZUVkaXRQYXJ0LCB0YXJnZXRFZGl0UGFydCk7CgkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDdXN0b21QYXJhbWV0cmljQ29udGV4dExpbmtSZW9yaWVudENvbW1hbmQoc2VtUmVxdWVzdCkpOwoJCX0KCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWZSZWxhdGlvbnNoaXBUYXJnZXRDb21tYW5kKHJlcXVlc3QpOwoJfQoKCn0K