LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KZGVsZWdhdGUgdm9pZCBTZWxlY3RJbmRleChpbnQgaW5kZXgpOw0KZGVsZWdhdGUgdm9pZCBMb2FkUHJvZmlsZUltYWdlKCk7DQoNCm5hbWVzcGFjZSBDb25maWd1cmF0aW9uDQp7DQoNCi8qIGRlbGVnYXRlcyAqLw0KDQpwdWJsaWMgcmVmIGNsYXNzIFVzZXJQcmVmZXJlbmNlcyBzZWFsZWQNCnsNCnB1YmxpYzoNCiAgICAvKiBzaW5nbGV0b24gKi8NCiAgICBzdGF0aWMgcHJvcGVydHkgVXNlclByZWZlcmVuY2VzXiBpbnN0YW5jZQ0KICAgIHsNCiAgICAgICAgVXNlclByZWZlcmVuY2VzXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgVXNlclByZWZlcmVuY2VzXiBpbnN0YW5jZV8gPSByZWYgbmV3IFVzZXJQcmVmZXJlbmNlcygpOw0KICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIHByb3BlcnRpZXMgKi8NCiAgICBwcm9wZXJ0eSBpbnQgICAgICAgIFBSRUZfQUNDT1VOVF9JTkRFWDsNCiAgICBwcm9wZXJ0eSBib29sICAgICAgIFBSRUZfUFJPRklMRV9QSE9UTzsNCg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KICAgIHZvaWQgICAgICAgICAgICAgICAgc2F2ZSgpOw0KICAgIHZvaWQgICAgICAgICAgICAgICAgbG9hZCgpOw0KICAgIFN0cmluZ14gICAgICAgICAgICAgU3RyaW5naWZ5KCk7DQogICAgdm9pZCAgICAgICAgICAgICAgICBEZXN0cmluZ2lmeShTdHJpbmdeIGRhdGEpOw0KDQppbnRlcm5hbDoNCg0KICAgIC8qIGV2ZW50cyAqLw0KICAgIGV2ZW50IFNlbGVjdEluZGV4XiBzZWxlY3RJbmRleDsNCiAgICBldmVudCBMb2FkUHJvZmlsZUltYWdlXiBsb2FkUHJvZmlsZUltYWdlOw0KcHJpdmF0ZToNCiAgICBVc2VyUHJlZmVyZW5jZXMoKSB7IFBSRUZfUFJPRklMRV9QSE9UTyA9IGZhbHNlOyB9Ow0KDQp9Ow0KDQp9DQp9