LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8YW5kcmVhcy50cmFjenlrQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KI2luY2x1ZGUgInZpZGVvbWFuYWdlcl9pbnRlcmZhY2UuaCINCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KZGVsZWdhdGUgdm9pZCBXcml0ZVZpZGVvRnJhbWUoU3RyaW5nXiwgdWludDhfdCosIGludCwgaW50KTsNCmRlbGVnYXRlIHZvaWQgQ2xlYXJSZW5kZXJUYXJnZXQoKTsNCg0KbmFtZXNwYWNlIFZpZGVvDQp7DQoNCmNsYXNzIFZpZGVvUmVuZGVyZXINCnsNCnB1YmxpYzoNCiAgICBzdGQ6OnN0cmluZyBpZDsNCiAgICBzdGQ6Om11dGV4IHZpZGVvX211dGV4Ow0KICAgIERSaW5nOjpTaW5rVGFyZ2V0IHRhcmdldDsNCiAgICBEUmluZzo6U2lua1RhcmdldDo6RnJhbWVCdWZmZXJQdHIgZGFlbW9uRnJhbWVQdHJfOw0KICAgIGludCB3aWR0aDsNCiAgICBpbnQgaGVpZ2h0Ow0KDQogICAgdm9pZCBiaW5kU2lua0Z1bmN0aW9ucygpOw0KDQogICAgRFJpbmc6OlNpbmtUYXJnZXQ6OkZyYW1lQnVmZmVyUHRyIHJlcXVlc3RGcmFtZUJ1ZmZlcihzdGQ6OnNpemVfdCBieXRlcyk7DQogICAgdm9pZCBvbk5ld0ZyYW1lKERSaW5nOjpTaW5rVGFyZ2V0OjpGcmFtZUJ1ZmZlclB0ciBidWYpOw0KDQp9Ow0KDQpyZWYgY2xhc3MgVmlkZW9SZW5kZXJlcldyYXBwZXIgc2VhbGVkDQp7DQppbnRlcm5hbDoNCiAgICBWaWRlb1JlbmRlcmVyV3JhcHBlcigpIHsNCiAgICAgICAgcmVuZGVyZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZpZGVvUmVuZGVyZXI+KCk7DQogICAgICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7DQogICAgfTsNCg0KICAgIHN0ZDo6bXV0ZXggcmVuZGVyX211dGV4Ow0KICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGZyYW1lX2N2Ow0KDQogICAgc3RkOjpzaGFyZWRfcHRyPFZpZGVvUmVuZGVyZXI+IHJlbmRlcmVyOw0KICAgIGJvb2wgaXNSZW5kZXJpbmc7DQp9Ow0KDQpwdWJsaWMgcmVmIGNsYXNzIFZpZGVvUmVuZGVyZXJNYW5hZ2VyIHNlYWxlZA0Kew0KaW50ZXJuYWw6DQogICAgdm9pZCBzdGFydGVkRGVjb2RpbmcoU3RyaW5nXiBpZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsNCiAgICB2b2lkIHJlZ2lzdGVyU2lua1RhcmdldChTdHJpbmdeIHNpbmtJRCwgY29uc3QgRFJpbmc6OlNpbmtUYXJnZXQmIHRhcmdldCk7DQoNCiAgICAvKiBldmVudHMgKi8NCiAgICBldmVudCBXcml0ZVZpZGVvRnJhbWVeIHdyaXRlVmlkZW9GcmFtZTsNCiAgICBldmVudCBDbGVhclJlbmRlclRhcmdldF4gY2xlYXJSZW5kZXJUYXJnZXQ7DQoNCiAgICBWaWRlb1JlbmRlcmVyV3JhcHBlcl4gcmVuZGVyZXIoU3RyaW5nXiBpZCk7DQogICAgTWFwPFN0cmluZ14sVmlkZW9SZW5kZXJlcldyYXBwZXJePl4gcmVuZGVyZXJzOw0KDQpwdWJsaWM6DQogICAgVmlkZW9SZW5kZXJlck1hbmFnZXIoKTsNCg0KICAgIHZvaWQgcmFpc2VXcml0ZVZpZGVvRnJhbWUoU3RyaW5nXiBpZCk7DQogICAgdm9pZCByYWlzZUNsZWFyUmVuZGVyVGFyZ2V0KCk7DQoNCiAgICB2b2lkIHJlbW92ZVJlbmRlcmVyKFN0cmluZ14gaWQpOw0KDQpwcml2YXRlOg0KDQp9Ow0KDQp9IC8qIG5hbWVzcGFjZSBWaWRlbyAqLw0KfSAvKiBuYW1lc3BhY2UgUmluZ0NsaWVudFVXUCAqLw==