LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8dHJhY3p5ay5hbmRyZWFzQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgInBjaC5oIg0KDQojaW5jbHVkZSAiQ29udmVyc2F0aW9uLmgiDQoNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpBcHBsaWNhdGlvbk1vZGVsOjpDb3JlOw0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpDb3JlOw0KDQp1c2luZyBuYW1lc3BhY2UgUmluZ0NsaWVudFVXUDsNCg0KQ29udmVyc2F0aW9uOjpDb252ZXJzYXRpb24oKQ0Kew0KICAgIG1lc3NhZ2VzTGlzdF8gPSByZWYgbmV3ICBWZWN0b3I8Q29udmVyc2F0aW9uTWVzc2FnZV4+KCk7DQp9DQoNCnZvaWQNCkNvbnZlcnNhdGlvbjo6YWRkTWVzc2FnZShTdHJpbmdeIGRhdGUsIGJvb2wgZnJvbUNvbnRhY3QsIFN0cmluZ14gcGF5bG9hZCkNCnsNCiAgICBDb252ZXJzYXRpb25NZXNzYWdlXiBtZXNzYWdlID0gcmVmIG5ldyBDb252ZXJzYXRpb25NZXNzYWdlKCk7DQogICAgbWVzc2FnZS0+RGF0ZSA9IGRhdGU7DQogICAgbWVzc2FnZS0+RnJvbUNvbnRhY3QgPSBmcm9tQ29udGFjdDsNCiAgICBtZXNzYWdlLT5QYXlsb2FkID0gcGF5bG9hZDsNCiAgICBzdGQ6OnN0cmluZyBvd25lcigoZnJvbUNvbnRhY3QpID8gImZyb20gY29udGFjdCIgOiAiIGZyb20gbWUiKTsNCiAgICBNU0dfKCJ7Q29udmVyc2F0aW9uOjphZGRNZXNzYWdlfSIpOw0KICAgIE1TR18oIm93bmVyID0gIiArIG93bmVyKTsNCg0KICAgIC8qIGFkZCBtZXNzYWdlIHRvIF9tZXNzYWdlc0xpc3RfICovDQogICAgbWVzc2FnZXNMaXN0Xy0+QXBwZW5kKG1lc3NhZ2UpOw0KDQogICAgLy8gVE9ETyBzdG9yZSBtZXNzYWdlIG9uIHRoZSBkaXNrDQp9DQoNCkpzb25PYmplY3ReDQpDb252ZXJzYXRpb25NZXNzYWdlOjpUb0pzb25PYmplY3QoKQ0Kew0KICAgIEpzb25PYmplY3ReIG1lc3NhZ2VPYmplY3QgPSByZWYgbmV3IEpzb25PYmplY3QoKTsNCiAgICBtZXNzYWdlT2JqZWN0LT5TZXROYW1lZFZhbHVlKGRhdGVLZXksIEpzb25WYWx1ZTo6Q3JlYXRlU3RyaW5nVmFsdWUoRGF0ZSkpOw0KICAgIG1lc3NhZ2VPYmplY3QtPlNldE5hbWVkVmFsdWUoZnJvbUNvbnRhY3RLZXksIEpzb25WYWx1ZTo6Q3JlYXRlQm9vbGVhblZhbHVlKEZyb21Db250YWN0KSk7DQogICAgbWVzc2FnZU9iamVjdC0+U2V0TmFtZWRWYWx1ZShwYXlsb2FkS2V5LCBKc29uVmFsdWU6OkNyZWF0ZVN0cmluZ1ZhbHVlKFBheWxvYWQpKTsNCg0KICAgIEpzb25PYmplY3ReIGpzb25PYmplY3QgPSByZWYgbmV3IEpzb25PYmplY3QoKTsNCiAgICBqc29uT2JqZWN0LT5TZXROYW1lZFZhbHVlKG1lc3NhZ2VLZXksIG1lc3NhZ2VPYmplY3QpOw0KDQogICAgcmV0dXJuIGpzb25PYmplY3Q7DQp9