LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOjpDb2xsZWN0aW9uczsNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KZGVsZWdhdGUgdm9pZCBOZXdBY2NvdW50U2VsZWN0ZWQoKTsNCmRlbGVnYXRlIHZvaWQgTm9BY2NvdW50U2VsZWN0ZWQoKTsNCmRlbGVnYXRlIHZvaWQgVXBkYXRlU2Nyb2xsVmlldygpOw0KDQpuYW1lc3BhY2UgVmlld01vZGVsIHsNCnB1YmxpYyByZWYgY2xhc3MgQWNjb3VudHNWaWV3TW9kZWwgc2VhbGVkDQp7DQppbnRlcm5hbDoNCiAgICAvKiBzaW5nbGV0b24gKi8NCiAgICBzdGF0aWMgcHJvcGVydHkgQWNjb3VudHNWaWV3TW9kZWxeIGluc3RhbmNlDQogICAgew0KICAgICAgICBBY2NvdW50c1ZpZXdNb2RlbF4gZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgc3RhdGljIEFjY291bnRzVmlld01vZGVsXiBpbnN0YW5jZV8gPSByZWYgbmV3IEFjY291bnRzVmlld01vZGVsKCk7DQogICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VfOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogZnVuY3Rpb25zICovDQogICAgdm9pZCBhZGQoc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nJiByaW5nSUQsIHN0ZDo6c3RyaW5nJiBhY2NvdW50VHlwZSwgc3RkOjpzdHJpbmcmIGFjY291bnRJRCwgc3RkOjpzdHJpbmcmIGRldmljZUlkKTsNCiAgICB2b2lkIGNsZWFyQWNjb3VudExpc3QoKTsNCg0KICAgIC8qIHByb3BlcnRpZXMgKi8NCiAgICBwcm9wZXJ0eSBBY2NvdW50XiBzZWxlY3RlZEFjY291bnQNCiAgICB7DQogICAgICAgIEFjY291bnReIGdldCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SXRlbV87DQogICAgICAgIH0NCiAgICAgICAgdm9pZCBzZXQoQWNjb3VudF4gdmFsdWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIG9sZEl0ZW1fID0gY3VycmVudEl0ZW1fOw0KICAgICAgICAgICAgY3VycmVudEl0ZW1fID0gdmFsdWU7DQogICAgICAgICAgICBpZiAodmFsdWUpDQogICAgICAgICAgICAgICAgbmV3QWNjb3VudFNlbGVjdGVkKCk7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgbm9BY2NvdW50U2VsZWN0ZWQoKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByb3BlcnR5IFZlY3RvcjxBY2NvdW50Xj5eIGFjY291bnRzTGlzdA0KICAgIHsNCiAgICAgICAgVmVjdG9yPEFjY291bnRePl4gZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGFjY291bnRzTGlzdF87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBldmVudHMgKi8NCiAgICBldmVudCBOZXdBY2NvdW50U2VsZWN0ZWReIG5ld0FjY291bnRTZWxlY3RlZDsNCiAgICBldmVudCBOb0FjY291bnRTZWxlY3RlZF4gbm9BY2NvdW50U2VsZWN0ZWQ7DQogICAgZXZlbnQgVXBkYXRlU2Nyb2xsVmlld14gdXBkYXRlU2Nyb2xsVmlldzsNCg0KcHJpdmF0ZToNCiAgICBBY2NvdW50c1ZpZXdNb2RlbCgpOyAvLyBzaW5nbGV0b24NCiAgICBWZWN0b3I8QWNjb3VudF4+XiBhY2NvdW50c0xpc3RfOw0KICAgIEFjY291bnReIGN1cnJlbnRJdGVtXzsNCiAgICBBY2NvdW50XiBvbGRJdGVtXzsNCg0KfTsNCn0NCn0NCg==