LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8YW5kcmVhcy50cmFjenlrQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KDQpuYW1lc3BhY2UgUmluZ0NsaWVudFVXUA0Kew0KDQpuYW1lc3BhY2UgVmlkZW8NCnsNCg0KcmVmIGNsYXNzIFJhdGU7DQpyZWYgY2xhc3MgUmVzb2x1dGlvbjsNCnJlZiBjbGFzcyBEZXZpY2U7DQoNCnB1YmxpYyByZWYgY2xhc3MgU2l6ZSBzZWFsZWQNCnsNCmludGVybmFsOg0KICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICB3aWR0aCAgICAgICAgICAgICAgICAgICAoKTsNCiAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgaGVpZ2h0ICAgICAgICAgICAgICAgICAgKCk7DQoNCiAgICB2b2lkIHNldFdpZHRoICAgICAgICAgICAgICAgKCB1bnNpZ25lZCBpbnQgd2lkdGggICAgKTsNCiAgICB2b2lkIHNldEhlaWdodCAgICAgICAgICAgICAgKCB1bnNpZ25lZCBpbnQgaGVpZ2h0ICAgKTsNCg0KcHVibGljOg0KICAgIFNpemUoKSB7IH07DQogICAgU2l6ZSh1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgpOg0KICAgICAgICBtX1dpZHRoKHcpLA0KICAgICAgICBtX0hlaWdodChoKSB7IH07DQogICAgU2l6ZShTaXplXiByaHMpOg0KICAgICAgICBtX1dpZHRoKHJocy0+bV9XaWR0aCksDQogICAgICAgIG1fSGVpZ2h0KHJocy0+bV9IZWlnaHQpIHsgfTsNCg0KcHJpdmF0ZToNCiAgICB1bnNpZ25lZCBpbnQgbV9XaWR0aDsNCiAgICB1bnNpZ25lZCBpbnQgbV9IZWlnaHQ7DQoNCn07DQoNCnB1YmxpYyByZWYgY2xhc3MgUmF0ZSBzZWFsZWQNCnsNCmludGVybmFsOg0KICAgIFN0cmluZ14gICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgKCk7DQogICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHZhbHVlICAgICAgICAgICAoKTsNCg0KICAgIHZvaWQgc2V0TmFtZSAgICAgICAgICAgICAgICAoICAgU3RyaW5nXiAgICAgICAgIG5hbWUgICk7DQogICAgdm9pZCBzZXRWYWx1ZSAgICAgICAgICAgICAgICggICB1bnNpZ25lZCBpbnQgICAgdmFsdWUgKTsNCg0KcHJpdmF0ZToNCiAgICBTdHJpbmdeICAgICAgICAgICAgICAgICAgICAgbV9uYW1lOw0KICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBtX3ZhbHVlOw0KDQp9Ow0KDQpwdWJsaWMgcmVmIGNsYXNzIENoYW5uZWwgc2VhbGVkDQp7DQppbnRlcm5hbDoNCiAgICBTdHJpbmdeICAgICAgICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAoKTsNCiAgICBSZXNvbHV0aW9uXiAgICAgICAgICAgICAgICAgY3VycmVudFJlc29sdXRpb24gICAoKTsNCiAgICBWZWN0b3I8UmVzb2x1dGlvbl4+XiAgICAgICAgcmVzb2x1dGlvbkxpc3QgICAgICAoKTsNCg0KICAgIHZvaWQgc2V0TmFtZSAgICAgICAgICAgICAgICAoICAgU3RyaW5nXiAgICAgbmFtZSAgICAgICAgICAgICApOw0KICAgIHZvaWQgc2V0Q3VycmVudFJlc29sdXRpb24gICAoICAgUmVzb2x1dGlvbl4gY3VycmVudFJlc29sdXRpb24pOw0KDQpwdWJsaWM6DQogICAgQ2hhbm5lbCgpOw0KDQpwcml2YXRlOg0KICAgIFN0cmluZ14gICAgICAgICAgICAgICAgICAgICBtX25hbWU7DQogICAgUmVzb2x1dGlvbl4gICAgICAgICAgICAgICAgIG1fY3VycmVudFJlc29sdXRpb247DQogICAgVmVjdG9yPFJlc29sdXRpb25ePl4gICAgICAgIG1fdmFsaWRSZXNvbHV0aW9uczsNCg0KfTsNCg0KcHVibGljIHJlZiBjbGFzcyBSZXNvbHV0aW9uIHNlYWxlZA0Kew0KaW50ZXJuYWw6DQogICAgU3RyaW5nXiAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAoKTsNCiAgICBSYXRlXiAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlUmF0ZSAgICAgICgpOw0KICAgIFZlY3RvcjxSYXRlXj5eICAgICAgICAgICAgICByYXRlTGlzdCAgICAgICAgKCk7DQogICAgU2l6ZV4gICAgICAgICAgICAgICAgICAgICAgIHNpemUgICAgICAgICAgICAoKTsNCiAgICBTdHJpbmdeICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICAgICAgICAgICgpOw0KDQogICAgYm9vbCBzZXRBY3RpdmVSYXRlICAgICAgICAgICggICBSYXRlXiAgIHJhdGUgICAgKTsNCiAgICB2b2lkIHNldFdpZHRoICAgICAgICAgICAgICAgKCAgIGludCAgICAgd2lkdGggICApOw0KICAgIHZvaWQgc2V0SGVpZ2h0ICAgICAgICAgICAgICAoICAgaW50ICAgICBoZWlnaHQgICk7DQogICAgdm9pZCBzZXRGb3JtYXQgICAgICAgICAgICAgICggICBTdHJpbmdeIGZvcm1hdCAgKTsNCg0KcHVibGljOg0KICAgIFJlc29sdXRpb24oKTsNCiAgICBSZXNvbHV0aW9uKFNpemVeIHNpemUpOw0KDQpwcml2YXRlOg0KICAgIFJhdGVeICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRSYXRlOw0KICAgIFZlY3RvcjxSYXRlXj5eICAgICAgICAgICAgICBtX3ZhbGlkUmF0ZXM7DQogICAgU2l6ZV4gICAgICAgICAgICAgICAgICAgICAgIG1fc2l6ZTsNCiAgICBTdHJpbmdeICAgICAgICAgICAgICAgICAgICAgbV9mb3JtYXQ7DQoNCn07DQoNCnB1YmxpYyByZWYgY2xhc3MgRGV2aWNlIHNlYWxlZA0Kew0KaW50ZXJuYWw6DQogICAgY2xhc3MgUHJlZmVyZW5jZU5hbWVzIHsNCiAgICBwdWJsaWM6DQogICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgY2hhciogUkFURSAgICA9ICJyYXRlIiAgIDsNCiAgICAgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyKiBOQU1FICAgID0gIm5hbWUiICAgOw0KICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIqIENIQU5ORUwgPSAiY2hhbm5lbCI7DQogICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgY2hhciogU0laRSAgICA9ICJzaXplIiAgIDsNCiAgICB9Ow0KDQogICAgVmVjdG9yPENoYW5uZWxePl4gICAgICAgICAgIGNoYW5uZWxMaXN0ICAgICAoKTsNCiAgICBTdHJpbmdeICAgICAgICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICgpOw0KICAgIFN0cmluZ14gICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgKCk7DQogICAgQ2hhbm5lbF4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgICAgICAgICAoKTsNCg0KICAgIGJvb2wgc2V0Q3VycmVudENoYW5uZWwgICAgICAoICAgQ2hhbm5lbF4gY2hhbm5lbCAgICApOw0KICAgIHZvaWQgc2V0TmFtZSAgICAgICAgICAgICAgICAoICAgU3RyaW5nXiBuYW1lICAgICAgICApOw0KICAgIA0KDQpwdWJsaWM6DQogICAgRGV2aWNlKFN0cmluZ14gaWQpOw0KICAgIHZvaWQgU2V0RGV2aWNlUHJvcGVydGllcyhTdHJpbmdeIGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmF0ZSk7DQoNCiAgICB2b2lkIHNhdmUgICAgICAgICAgICAgICAgICAgKCk7DQogICAgYm9vbCBpc0FjdGl2ZSAgICAgICAgICAgICAgICgpOw0KDQpwcml2YXRlOg0KICAgIFN0cmluZ14gICAgICAgICAgICAgICAgICAgICBtX2RldmljZUlkICAgICAgICA7DQogICAgU3RyaW5nXiAgICAgICAgICAgICAgICAgICAgIG1fbmFtZSAgICAgICAgICAgIDsNCiAgICBDaGFubmVsXiAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50Q2hhbm5lbCAgOw0KICAgIFZlY3RvcjxDaGFubmVsXj5eICAgICAgICAgICBtX2NoYW5uZWxzICAgICAgICA7DQogICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1fcmVxdWlyZVNhdmUgICAgIDsNCg0KfTsNCg0KfSAvKiBuYW1lc3BhY2UgVmlkZW8gKi8NCn0gLyogbmFtZXNwYWNlIFJpbmdDbGllbnRVV1AgKi8=