LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAicGNoLmgiDQoNCiNpbmNsdWRlICJBY2NvdW50LmgiDQoNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpBcHBsaWNhdGlvbk1vZGVsOjpDb3JlOw0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpDb3JlOw0KDQp1c2luZyBuYW1lc3BhY2UgUmluZ0NsaWVudFVXUDsNCg0KQWNjb3VudDo6QWNjb3VudChTdHJpbmdeIG5hbWUsDQogICAgICAgICAgICAgICAgIFN0cmluZ14gcmluZ0lELA0KICAgICAgICAgICAgICAgICBTdHJpbmdeIGFjY291bnRUeXBlLA0KICAgICAgICAgICAgICAgICBTdHJpbmdeIGFjY291bnRJRCwNCiAgICAgICAgICAgICAgICAgU3RyaW5nXiBkZXZpY2VJZCkNCnsNCiAgICBuYW1lXyA9IG5hbWU7DQogICAgcmluZ0lEXyA9IHJpbmdJRDsNCiAgICBhY2NvdW50VHlwZV8gPSBhY2NvdW50VHlwZTsNCiAgICBhY2NvdW50SURfID0gYWNjb3VudElEOw0KICAgIF9kZXZpY2VJZCA9IGRldmljZUlkOw0KfQ0KDQp2b2lkDQpBY2NvdW50OjpOb3RpZnlQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nXiBwcm9wZXJ0eU5hbWUpDQp7DQogICAgQ29yZUFwcGxpY2F0aW9uVmlld14gdmlldyA9IENvcmVBcHBsaWNhdGlvbjo6TWFpblZpZXc7DQogICAgdmlldy0+Q29yZVdpbmRvdy0+RGlzcGF0Y2hlci0+UnVuQXN5bmMoDQogICAgICAgIENvcmVEaXNwYXRjaGVyUHJpb3JpdHk6OkhpZ2gsDQogICAgICAgIHJlZiBuZXcgRGlzcGF0Y2hlZEhhbmRsZXIoW3RoaXMsIHByb3BlcnR5TmFtZV0oKQ0KICAgIHsNCiAgICAgICAgUHJvcGVydHlDaGFuZ2VkKHRoaXMsIHJlZiBuZXcgUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKHByb3BlcnR5TmFtZSkpOw0KICAgIH0pKTsNCn0=