LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBDb3B5cmlnaHQgKEMpIDIwMTYgYnkgU2F2b2lyLWZhaXJlIExpbnV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIEF1dGhvcjogSuRnZXIgTmljb2xhcyA8bmljb2xhcy5qYWdlckBzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqDQoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoNCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqDQoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoNCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoNCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojaW5jbHVkZSAicGNoLmgiDQoNCiNpbmNsdWRlICJDYWxsc1ZpZXdNb2RlbC5oIg0KDQp1c2luZyBuYW1lc3BhY2UgUmluZ0NsaWVudFVXUDsNCnVzaW5nIG5hbWVzcGFjZSBWaWV3TW9kZWw7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OkNvcmU7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6Q29yZTsNCg0KQ2FsbHNWaWV3TW9kZWw6OkNhbGxzVmlld01vZGVsKCkNCnsNCiAgICBDYWxsc0xpc3RfID0gcmVmIG5ldyBWZWN0b3I8Q2FsbF4+KCk7DQoNCiAgICAvKiBjb25uZWN0IHRvIGRlbGVnYXRlcy4gKi8NCg0KICAgIFJpbmdEOjppbnN0YW5jZS0+aW5jb21pbmdDYWxsICs9IHJlZiBuZXcgUmluZ0NsaWVudFVXUDo6SW5jb21pbmdDYWxsKFsmXSgNCiAgICBTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBjYWxsSWQsIFN0cmluZ14gZnJvbSkgew0KICAgICAgICBhdXRvIGNhbGwgPSBhZGROZXdDYWxsKGFjY291bnRJZCwgY2FsbElkLCBmcm9tKTsNCiAgICAgICAgY2FsbFJlY2lldmVkKGNhbGwpOw0KICAgIH0pOw0KDQogICAgUmluZ0Q6Omluc3RhbmNlLT5zdGF0ZUNoYW5nZSArPSByZWYgbmV3IFJpbmdDbGllbnRVV1A6OlN0YXRlQ2hhbmdlKFsmXSgNCiAgICBTdHJpbmdeIGNhbGxJZCwgU3RyaW5nXiBzdGF0ZSwgaW50IGNvZGUpIHsNCiAgICAgICAgZm9yIGVhY2ggKGF1dG8gY2FsbCBpbiBDYWxsc0xpc3RfKSB7DQogICAgICAgICAgICBpZiAoY2FsbC0+Y2FsbElkID09IGNhbGxJZCkgew0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAiT1ZFUiIpIHsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhbGw7DQogICAgICAgICAgICAgICAgICAgIGNhbGwtPnN0YXRlQ2hhbmdlKCIiLCBjb2RlKTsNCiAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1c1VwZGF0ZWQoY2FsbCk7IC8vIHVzZWQgPw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhbGwtPnN0YXRlQ2hhbmdlKHN0YXRlLCBjb2RlKTsNCiAgICAgICAgICAgICAgICBjYWxsU3RhdHVzVXBkYXRlZChjYWxsKTsgLy8gc2FtZS4uLg0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBXTkdfKCJDYWxsIG5vdCBmb3VuZCIpOw0KICAgIH0pOw0KfQ0KDQpDYWxsXg0KUmluZ0NsaWVudFVXUDo6Vmlld01vZGVsOjpDYWxsc1ZpZXdNb2RlbDo6YWRkTmV3Q2FsbChTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBjYWxsSWQsIFN0cmluZ14gZnJvbSkNCnsNCiAgICBhdXRvIGNhbGwgPSByZWYgbmV3IENhbGwoYWNjb3VudElkLCBjYWxsSWQsIGZyb20pOw0KICAgIENhbGxzTGlzdF8tPkFwcGVuZChjYWxsKTsNCiAgICByZXR1cm4gY2FsbDsNCn0NCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3TW9kZWw6OkNhbGxzVmlld01vZGVsOjpjbGVhckNhbGxzTGlzdCgpDQp7DQogICAgQ2FsbHNMaXN0Xy0+Q2xlYXIoKTsNCn0=