LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwppbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwoKcHVibGljIGNsYXNzIE9wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0Q2FzZQp7CiAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLmVkaXRvci5pbnRlcm5hbC5XU0RMRWRpdG9yIjsKCiAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKICB7CiAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShPcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5jbGFzcywgIk9wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlIik7CiAgfQoKICBwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCiAgewogICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CiAgICBhc3NlcnRUcnVlKHByb2plY3QuZXhpc3RzKCkpOwogICAgcHJvamVjdC5vcGVuKG51bGwpOwogICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVByb2plY3QuREVQVEhfSU5GSU5JVEUsIG51bGwpOwogICAgam9pbkF1dG9CdWlsZCgpOwogICAgcmV0dXJuIHByb2plY3Q7CiAgfQoKICBwcm90ZWN0ZWQgdm9pZCBqb2luQXV0b0J1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KICB7CiAgICBib29sZWFuIGludGVycnVwdGVkID0gdHJ1ZTsKICAgIHdoaWxlIChpbnRlcnJ1cHRlZCkKICAgIHsKICAgICAgdHJ5CiAgICAgIHsKICAgICAgICBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwogICAgICAgIGludGVycnVwdGVkID0gZmFsc2U7CiAgICAgIH0KICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCiAgICAgIHsKICAgICAgICBpbnRlcnJ1cHRlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIHByb3RlY3RlZCBJRWRpdG9yUGFydCBvcGVuRWRpdG9yKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgU3RyaW5nIGVkaXRvcmlkKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KICB7CiAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CiAgICByZXR1cm4gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCBlZGl0b3JpZCwgdHJ1ZSk7CiAgfQoKICBwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZUVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3IpCiAgewogICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwogICAgcmV0dXJuIHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7CiAgfQoKICBwdWJsaWMgdm9pZCB0ZXN0T3BlblN0b2NrUXVvdGVXU0RMKCkgdGhyb3dzIEV4Y2VwdGlvbgogIHsKICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KE9wZW5TdG9ja1F1b3RlV1NETFNldHVwLlBST0pFQ1RfTkFNRSk7CiAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KChJRmlsZSlwcm9qZWN0LmZpbmRNZW1iZXIoIlN0b2NrUXVvdGUud3NkbCIpKTsKICAgIHN0YXJ0TWVhc3VyaW5nKCk7CiAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gb3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgRURJVE9SX0lEKTsKICAgIHN0b3BNZWFzdXJpbmcoKTsKICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwogICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKICAgIGNsb3NlRWRpdG9yKGVkaXRvclBhcnQpOwogIH0KfQo=