I3ByYWdtYSBvbmNlDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IErkZ2VyIE5pY29sYXMgPG5pY29sYXMuamFnZXJAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICAgICAqDQoqIEF1dGhvcjogVHJhY3p5ayBBbmRyZWFzIDxhbmRyZWFzLnRyYWN6eWtAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqDQoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoNCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqDQoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoNCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoNCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1c2luZyBuYW1lc3BhY2UgUGxhdGZvcm06OkNvbGxlY3Rpb25zOw0KDQpuYW1lc3BhY2UgUmluZ0NsaWVudFVXUA0Kew0KLyogZGVsZWdhdGUgKi8NCmRlbGVnYXRlIHZvaWQgQ2FsbFJlY2lldmVkKENhbGxeIGNhbGwpOw0KZGVsZWdhdGUgdm9pZCBDYWxsU3RhdHVzVXBkYXRlZChDYWxsXiBjYWxsKTsNCmRlbGVnYXRlIHZvaWQgQ2FsbFN0YXJ0ZWQoKTsNCmRlbGVnYXRlIHZvaWQgQ2FsbEVuZGVkKCk7DQoNCm5hbWVzcGFjZSBWaWV3TW9kZWwgew0KcHVibGljIHJlZiBjbGFzcyBDYWxsc1ZpZXdNb2RlbCBzZWFsZWQNCnsNCmludGVybmFsOg0KICAgIC8qIHNpbmdsZXRvbiAqLw0KICAgIHN0YXRpYyBwcm9wZXJ0eSBDYWxsc1ZpZXdNb2RlbF4gaW5zdGFuY2UNCiAgICB7DQogICAgICAgIENhbGxzVmlld01vZGVsXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgQ2FsbHNWaWV3TW9kZWxeIGluc3RhbmNlXyA9IHJlZiBuZXcgQ2FsbHNWaWV3TW9kZWwoKTsNCiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZV87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBmdW5jdGlvbnMgKi8NCiAgICBDYWxsXiBhZGROZXdDYWxsKFN0cmluZ14gYWNjb3VudElkLCBTdHJpbmdeIGNhbGxJZCwgU3RyaW5nXiBmcm9tKTsNCiAgICB2b2lkIGNsZWFyQ2FsbHNMaXN0KCk7DQogICAgdm9pZCBzZXRTdGF0ZShTdHJpbmdeIGNhbGxJZCwgU3RyaW5nXiBzdGF0ZSwgaW50IGNvZGUpOyAvLyB1c2VkID8NCiAgICBDYWxsXiBmaW5kQ2FsbChTdHJpbmdeIGNhbGxJZCk7DQoNCiAgICAvKiBwcm9wZXJ0aWVzICovDQogICAgcHJvcGVydHkgVmVjdG9yPENhbGxePl4gQ2FsbHNMaXN0DQogICAgew0KICAgICAgICBWZWN0b3I8Q2FsbF4+XiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gQ2FsbHNMaXN0XzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIGV2ZW50cyAqLw0KICAgIGV2ZW50IENhbGxSZWNpZXZlZF4gY2FsbFJlY2lldmVkOw0KICAgIGV2ZW50IENhbGxTdGF0dXNVcGRhdGVkXiBjYWxsU3RhdHVzVXBkYXRlZDsNCiAgICBldmVudCBDYWxsU3RhcnRlZF4gY2FsbFN0YXJ0ZWQ7DQogICAgZXZlbnQgQ2FsbEVuZGVkXiBjYWxsRW5kZWQ7DQoNCnByaXZhdGU6DQogICAgQ2FsbHNWaWV3TW9kZWwoKTsgLy8gc2luZ2xldG9uDQogICAgVmVjdG9yPENhbGxePl4gQ2FsbHNMaXN0XzsgLy8gcmVmYWN0byA6IGNoYW5nZSBDIHRvIGMNCg0KfTsNCn0NCn0NCg==