LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnNlYXJjaC5jb3JlLnRlc3RzOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwppbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHRMaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5TZWFyY2hSZXN1bHRFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwppbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2hFdmVudDsKCgovKioKICogQGF1dGhvciBUaG9tYXMgTeRkZXIKICoKICovCnB1YmxpYyBjbGFzcyBUZXN0U2VhcmNoUmVzdWx0IGV4dGVuZHMgVGVzdENhc2UgewoJCglwdWJsaWMgdm9pZCB0ZXN0QWRkTWF0Y2goKSB7CgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCkgcXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCk7CgkJCgkJU3RyaW5nIG9iamVjdD0gIm9iamVjdCI7IC8vJE5PTi1OTFMtMSQKCQkKCQlNYXRjaCBtYXRjaDE9IG5ldyBNYXRjaChvYmplY3QsIDAsIDApOwoJCXJlc3VsdC5hZGRNYXRjaChtYXRjaDEpOwoJCWFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TWF0Y2hDb3VudCgpLCAxKTsKCQlNYXRjaCBtYXRjaDI9IG5ldyBNYXRjaChvYmplY3QsIDAsIDApOwoJCXJlc3VsdC5hZGRNYXRjaChtYXRjaDIpOwoJCWFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TWF0Y2hDb3VudCgpLCAyKTsKCQlyZXN1bHQuYWRkTWF0Y2gobWF0Y2gxKTsKCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldE1hdGNoQ291bnQoKSwgMik7Cgl9CgoJcHVibGljIHZvaWQgdGVzdEFkZE1hdGNoRGlmZmVyZW50U3RhcnQoKSB7CgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCkgcXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCk7CgkJCgkJU3RyaW5nIG9iamVjdD0gIm9iamVjdCI7IC8vJE5PTi1OTFMtMSQKCQkKCQlNYXRjaCBtYXRjaDE9IG5ldyBNYXRjaChvYmplY3QsIDIsIDApOwoJCXJlc3VsdC5hZGRNYXRjaChtYXRjaDEpOwoJCWFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TWF0Y2hDb3VudCgpLCAxKTsKCQlNYXRjaCBtYXRjaDI9IG5ldyBNYXRjaChvYmplY3QsIDEsIDEpOwoJCXJlc3VsdC5hZGRNYXRjaChtYXRjaDIpOwoJCU1hdGNoIG1hdGNoMz0gbmV3IE1hdGNoKG9iamVjdCwgMCwgMik7CgkJcmVzdWx0LmFkZE1hdGNoKG1hdGNoMyk7CgkJTWF0Y2hbXSBtYXRjaGVzPSByZXN1bHQuZ2V0TWF0Y2hlcyhvYmplY3QpOwoJCWFzc2VydFRydWUoIm1hdGNoZXNbMF0iLCBtYXRjaGVzWzBdID09IG1hdGNoMyk7CgkJYXNzZXJ0VHJ1ZSgibWF0Y2hlc1sxXSIsIG1hdGNoZXNbMV0gPT0gbWF0Y2gyKTsKCQlhc3NlcnRUcnVlKCJtYXRjaGVzWzJdIiwgbWF0Y2hlc1syXSA9PSBtYXRjaDEpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3RBZGRNYXRjaERpZmZlcmVudFN0YXJ0SW5PcmRlcigpIHsKCQlJU2VhcmNoUXVlcnkgcXVlcnk9IG5ldyBOdWxsUXVlcnkoKTsKCQlBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0PSAoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0KSBxdWVyeS5nZXRTZWFyY2hSZXN1bHQoKTsKCQkKCQlTdHJpbmcgb2JqZWN0PSAib2JqZWN0IjsgLy8kTk9OLU5MUy0xJAoJCQoJCU1hdGNoIG1hdGNoMT0gbmV3IE1hdGNoKG9iamVjdCwgMCwgMCk7CgkJcmVzdWx0LmFkZE1hdGNoKG1hdGNoMSk7CgkJYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRNYXRjaENvdW50KCksIDEpOwoJCU1hdGNoIG1hdGNoMj0gbmV3IE1hdGNoKG9iamVjdCwgMSwgMSk7CgkJcmVzdWx0LmFkZE1hdGNoKG1hdGNoMik7CgkJTWF0Y2ggbWF0Y2gzPSBuZXcgTWF0Y2gob2JqZWN0LCAyLCAyKTsKCQlyZXN1bHQuYWRkTWF0Y2gobWF0Y2gzKTsKCQlNYXRjaFtdIG1hdGNoZXM9IHJlc3VsdC5nZXRNYXRjaGVzKG9iamVjdCk7CgkJYXNzZXJ0VHJ1ZSgibWF0Y2hlc1swXSIsIG1hdGNoZXNbMF0gPT0gbWF0Y2gxKTsKCQlhc3NlcnRUcnVlKCJtYXRjaGVzWzFdIiwgbWF0Y2hlc1sxXSA9PSBtYXRjaDIpOwoJCWFzc2VydFRydWUoIm1hdGNoZXNbMl0iLCBtYXRjaGVzWzJdID09IG1hdGNoMyk7Cgl9CgoJcHVibGljIHZvaWQgdGVzdEFkZE1hdGNoRGlmZmVyZW50TGVuZ3RoKCkgewoJCUlTZWFyY2hRdWVyeSBxdWVyeT0gbmV3IE51bGxRdWVyeSgpOwoJCUFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQ9IChBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQpIHF1ZXJ5LmdldFNlYXJjaFJlc3VsdCgpOwoJCQoJCVN0cmluZyBvYmplY3Q9ICJvYmplY3QiOyAvLyROT04tTkxTLTEkCgkJCgkJTWF0Y2ggbWF0Y2gxPSBuZXcgTWF0Y2gob2JqZWN0LCAxLCAxKTsKCQlyZXN1bHQuYWRkTWF0Y2gobWF0Y2gxKTsKCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldE1hdGNoQ291bnQoKSwgMSk7CgkJTWF0Y2ggbWF0Y2gyPSBuZXcgTWF0Y2gob2JqZWN0LCAxLCAwKTsKCQlyZXN1bHQuYWRkTWF0Y2gobWF0Y2gyKTsKCQlNYXRjaFtdIG1hdGNoZXM9IHJlc3VsdC5nZXRNYXRjaGVzKG9iamVjdCk7CgkJYXNzZXJ0VHJ1ZSgibWF0Y2hlc1swXSIsIG1hdGNoZXNbMF0gPT0gbWF0Y2gyKTsKCQlhc3NlcnRUcnVlKCJtYXRjaGVzWzFdIiwgbWF0Y2hlc1sxXSA9PSBtYXRjaDEpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0QWRkTWF0Y2hPcmRlclByZXNlcnZpbmcoKSB7CgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCkgcXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCk7CgkJCgkJU3RyaW5nIG9iamVjdD0gIm9iamVjdCI7IC8vJE5PTi1OTFMtMSQKCQkKCQlNYXRjaCBtYXRjaDE9IG5ldyBNYXRjaChvYmplY3QsIDEsIDApOwoJCXJlc3VsdC5hZGRNYXRjaChtYXRjaDEpOwoJCWFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TWF0Y2hDb3VudCgpLCAxKTsKCQlNYXRjaCBtYXRjaDI9IG5ldyBNYXRjaChvYmplY3QsIDEsIDApOwoJCXJlc3VsdC5hZGRNYXRjaChtYXRjaDIpOwoJCU1hdGNoW10gbWF0Y2hlcz0gcmVzdWx0LmdldE1hdGNoZXMob2JqZWN0KTsKCQlhc3NlcnRUcnVlKCJtYXRjaGVzWzBdIiwgbWF0Y2hlc1swXSA9PSBtYXRjaDEpOwoJCWFzc2VydFRydWUoIm1hdGNoZXNbMV0iLCBtYXRjaGVzWzFdID09IG1hdGNoMik7Cgl9CgoKCQoJcHVibGljIHZvaWQgdGVzdEFkZE1hdGNoZXMoKSB7CgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCkgcXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCk7CgkJCgkJU3RyaW5nIG9iamVjdD0gIm9iamVjdCI7IC8vJE5PTi1OTFMtMSQKCQkKCQlNYXRjaCBtYXRjaDE9IG5ldyBNYXRjaChvYmplY3QsIDAsIDApOwoJCU1hdGNoIG1hdGNoMj0gbmV3IE1hdGNoKG9iamVjdCwgMCwgMCk7CgkJcmVzdWx0LmFkZE1hdGNoZXMobmV3IE1hdGNoW10geyBtYXRjaDEsIG1hdGNoMiB9KTsKCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldE1hdGNoQ291bnQoKSwgMik7CgkJcmVzdWx0LmFkZE1hdGNoKG1hdGNoMSk7CgkJYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRNYXRjaENvdW50KCksIDIpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVNYXRjaCgpIHsKCQlJU2VhcmNoUXVlcnkgcXVlcnk9IG5ldyBOdWxsUXVlcnkoKTsKCQlBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0PSAoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0KSBxdWVyeS5nZXRTZWFyY2hSZXN1bHQoKTsKCQkKCQlTdHJpbmcgb2JqZWN0PSAib2JqZWN0IjsgLy8kTk9OLU5MUy0xJAoJCQoJCU1hdGNoIG1hdGNoMT0gbmV3IE1hdGNoKG9iamVjdCwgMCwgMCk7CgkJcmVzdWx0LmFkZE1hdGNoKG1hdGNoMSk7CgkJTWF0Y2ggbWF0Y2gyPSBuZXcgTWF0Y2gob2JqZWN0LCAwLCAwKTsKCQlyZXN1bHQuYWRkTWF0Y2gobWF0Y2gyKTsKCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldE1hdGNoQ291bnQoKSwgMik7CgkJCgkJcmVzdWx0LnJlbW92ZU1hdGNoKG1hdGNoMSk7CgkJYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRNYXRjaENvdW50KCksIDEpOwoJCXJlc3VsdC5yZW1vdmVNYXRjaChtYXRjaDEpOwoJCWFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TWF0Y2hDb3VudCgpLCAxKTsKCQkKCX0KCQoJcHVibGljIHZvaWQgdGVzdFJlbW92ZU1hdGNoZXMoKSB7CgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCkgcXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCk7CgkJCgkJU3RyaW5nIG9iamVjdD0gIm9iamVjdCI7IC8vJE5PTi1OTFMtMSQKCQkKCQlNYXRjaCBtYXRjaDE9IG5ldyBNYXRjaChvYmplY3QsIDAsIDApOwoJCU1hdGNoIG1hdGNoMj0gbmV3IE1hdGNoKG9iamVjdCwgMCwgMCk7CgkJcmVzdWx0LmFkZE1hdGNoZXMobmV3IE1hdGNoW10geyBtYXRjaDEsIG1hdGNoMiB9KTsKCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldE1hdGNoQ291bnQoKSwgMik7CgkJCgkJcmVzdWx0LnJlbW92ZU1hdGNoZXMobmV3IE1hdGNoW10geyBtYXRjaDEsIG1hdGNoMiB9KTsKCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldE1hdGNoQ291bnQoKSwgMCk7CgkJCgl9CgoJcHVibGljIHZvaWQgdGVzdE1hdGNoRXZlbnQoKSB7CgkJZmluYWwgYm9vbGVhbiBbXSB3YXNBZGRlZD0geyBmYWxzZSB9OwoJCWZpbmFsIGJvb2xlYW4gW10gd2FzUmVtb3ZlZD0geyBmYWxzZSB9OwoJCgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCkgcXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCk7CgkJCgkJcmVzdWx0LmFkZExpc3RlbmVyKG5ldyBJU2VhcmNoUmVzdWx0TGlzdGVuZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHNlYXJjaFJlc3VsdENoYW5nZWQoU2VhcmNoUmVzdWx0RXZlbnQgZSkgewoJCQkJaWYgKGUgaW5zdGFuY2VvZiBNYXRjaEV2ZW50KSB7CgkJCQkJTWF0Y2hFdmVudCBldnQ9IChNYXRjaEV2ZW50KSBlOwoJCQkJCWlmIChldnQuZ2V0S2luZCgpID09IE1hdGNoRXZlbnQuQURERUQpIHsKCQkJCQkJd2FzQWRkZWRbMF09IHRydWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJd2FzUmVtb3ZlZFswXT0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9KTsKCQkKCQlTdHJpbmcgb2JqZWN0PSAib2JqZWN0IjsgLy8kTk9OLU5MUy0xJAoJCQoJCU1hdGNoIG1hdGNoMT0gbmV3IE1hdGNoKG9iamVjdCwgMCwgMCk7CgkJcmVzdWx0LmFkZE1hdGNoKG1hdGNoMSk7CgkJYXNzZXJ0VHJ1ZSh3YXNBZGRlZFswXSk7CgkJd2FzQWRkZWRbMF09IGZhbHNlOwoJCXJlc3VsdC5hZGRNYXRjaChtYXRjaDEpOwoJCWFzc2VydEZhbHNlKHdhc0FkZGVkWzBdKTsKCQkKCQlNYXRjaCBtYXRjaDI9IG5ldyBNYXRjaChvYmplY3QsIDAsIDApOwoJCXJlc3VsdC5hZGRNYXRjaChtYXRjaDIpOwoJCWFzc2VydFRydWUod2FzQWRkZWRbMF0pOwoJCXdhc0FkZGVkWzBdPSBmYWxzZTsKCQkKCQlyZXN1bHQucmVtb3ZlTWF0Y2gobWF0Y2gyKTsKCQlhc3NlcnRUcnVlKHdhc1JlbW92ZWRbMF0pOwoJCXdhc1JlbW92ZWRbMF09IGZhbHNlOwoJCQoJCXJlc3VsdC5yZW1vdmVNYXRjaChtYXRjaDIpOwoJCWFzc2VydEZhbHNlKHdhc1JlbW92ZWRbMF0pOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0QmF0Y2hlZE1hdGNoRXZlbnQoKSB7CgkJZmluYWwgYm9vbGVhbiBbXSB3YXNBZGRlZD0geyBmYWxzZSB9OwoJCWZpbmFsIGJvb2xlYW4gW10gd2FzUmVtb3ZlZD0geyBmYWxzZSB9OwoJCgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCkgcXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCk7CgkJCgkJcmVzdWx0LmFkZExpc3RlbmVyKG5ldyBJU2VhcmNoUmVzdWx0TGlzdGVuZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHNlYXJjaFJlc3VsdENoYW5nZWQoU2VhcmNoUmVzdWx0RXZlbnQgZSkgewoJCQkJaWYgKGUgaW5zdGFuY2VvZiBNYXRjaEV2ZW50KSB7CgkJCQkJTWF0Y2hFdmVudCBldnQ9IChNYXRjaEV2ZW50KSBlOwoJCQkJCWlmIChldnQuZ2V0S2luZCgpID09IE1hdGNoRXZlbnQuQURERUQpIHsKCQkJCQkJd2FzQWRkZWRbMF09IHRydWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJd2FzUmVtb3ZlZFswXT0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9KTsKCQkKCQlTdHJpbmcgb2JqZWN0PSAib2JqZWN0IjsgLy8kTk9OLU5MUy0xJAoJCQoJCU1hdGNoIG1hdGNoMT0gbmV3IE1hdGNoKG9iamVjdCwgMCwgMCk7CgkJcmVzdWx0LmFkZE1hdGNoZXMobmV3IE1hdGNoW10geyBtYXRjaDEgfSk7CgkJYXNzZXJ0VHJ1ZSh3YXNBZGRlZFswXSk7CgkJd2FzQWRkZWRbMF09IGZhbHNlOwoJCXJlc3VsdC5hZGRNYXRjaGVzKG5ldyBNYXRjaFtdIHsgbWF0Y2gxIH0pOwoJCWFzc2VydEZhbHNlKHdhc0FkZGVkWzBdKTsKCQkKCQlNYXRjaCBtYXRjaDI9IG5ldyBNYXRjaChvYmplY3QsIDAsIDApOwoJCXJlc3VsdC5hZGRNYXRjaGVzKG5ldyBNYXRjaFtdIHsgbWF0Y2gyIH0pOwoJCWFzc2VydFRydWUod2FzQWRkZWRbMF0pOwoJCXdhc0FkZGVkWzBdPSBmYWxzZTsKCQkKCQlyZXN1bHQucmVtb3ZlTWF0Y2hlcyhuZXcgTWF0Y2hbXSB7IG1hdGNoMiB9KTsKCQlhc3NlcnRUcnVlKHdhc1JlbW92ZWRbMF0pOwoJCXdhc1JlbW92ZWRbMF09IGZhbHNlOwoJCQoJCXJlc3VsdC5yZW1vdmVNYXRjaGVzKG5ldyBNYXRjaFtdIHsgbWF0Y2gyIH0pOwoJCWFzc2VydEZhbHNlKHdhc1JlbW92ZWRbMF0pOwoJfQp9Cg==