LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNSBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQpWZXJzaW9uIENvbnRyb2wgSW5mb3JtYXRpb24gKFBlcmZvcmNlKQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQokUmV2aXNpb246ICMxICQgDQokRGF0ZVRpbWU6IDIwMTYvMDkvMjIgMDg6MDM6NDkgJCANCiRBdXRob3I6IHByYW1hbnMgJA0KTGFzdCBDaGFuZ2U6CUluaXRpYWwgRHJhZnQNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKiBAZmlsZSBpbnRlcnJ1cHRfbnZpY19wZXJwaGwuYw0KKiBcYnJpZWYgSW50ZXJydXB0IE5WSUMgUGVyaXBoZXJhbCBTb3VyY2UgRmlsZQ0KKiBcYXV0aG9yIGp2YXNhbnRoDQoqIA0KKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTlZJQyBwZXJpcGhlcmFsIGZ1bmN0aW9ucyAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qKiBAZGVmZ3JvdXAgSW50ZXJydXB0DQogKiAgQHsNCiAqLw0KDQojaW5jbHVkZSAiY29tbW9uX2xpYi5oIg0KI2luY2x1ZGUgImludGVycnVwdC5oIg0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAgICAgIE5WSUMgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiAgRW5hYmxlL0Rpc2FibGUgdGhlIE5WSUMgSVJRIGluIHRoZSBOVklDIGludGVycnVwdCBjb250cm9sbGVyDQogKiBAcGFyYW0gbnZpY19udW0gOiBOVklDIG51bWJlciAoc2VlIGVudW0gSVJRbl9UeXBlKQ0KICogQHBhcmFtIGVuX2ZsYWcgOiAxID0gRW5hYmxlIHRoZSBOVklDIElSUSwgMCA9IERpc2FibGUgdGhlIE5WSUMgSVJRIA0KICovDQp2b2lkIHBfaW50ZXJydXB0X252aWNfZW5hYmxlKElSUW5fVHlwZSBudmljX251bSwgdWludDhfdCBlbl9mbGFnKQ0KewkNCglpZiAoZW5fZmxhZykgew0KICAgICAgICBOVklDX0VuYWJsZUlSUShudmljX251bSk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgTlZJQ19EaXNhYmxlSVJRKG52aWNfbnVtKTsNCiAgICB9DQogICAgX19EU0IoKTsJDQp9DQoNCi8qKiAgZWNpYV9udmljX2Nscl9lbiAtIENsZWFyIGFsbCBOVklDIGV4dGVybmFsIGVuYWJsZXMgKi8gDQp2b2lkIHBfaW50ZXJydXB0X252aWNfZXh0RW5hYmxlc19jbHIodm9pZCkNCnsNCiAgICB1aW50MzJfdCBpLCBtOw0KICAgIA0KICAgIG0gPSAodWludDMyX3QpKE1BWF9JUlFuKSA+PiA1Ow0KICAgIGlmICggKHVpbnQzMl90KShNQVhfSVJRbikgJiAweDFGdWwgKSB7IG0rKzsgfQ0KCQkNCiAgICBmb3IgKCBpID0gMHVsOyBpIDwgbSA7IGkrKyApIA0KICAgIHsNCiAgICAgICAgTlZJQy0+SUNFUltpXSA9IDB4ZmZmZmZmZmZ1bDsgICAgICAgIA0KICAgIH0NCn0NCg0KLyoqIENsZWFyIGFsbCBOVklDIGV4dGVybmFsIGVuYWJsZXMgYW5kIHBlbmRpbmcgYml0cyAqLw0Kdm9pZCBwX2ludGVycnVwdF9udmljX2VucGVuZF9jbHIodm9pZCkNCnsNCiAgICB1aW50MzJfdCBpLCBtOw0KDQogICAgLy8gQ2xlYXIgTlZJQyBlbmFibGVzICYgcGVuZGluZyBzdGF0dXMNCiAgICBtID0gKHVpbnQzMl90KShNQVhfSVJRbikgPj4gNTsNCiAgICBpZiAoICh1aW50MzJfdCkoTUFYX0lSUW4pICYgMHgxRnVsICkgeyBtKys7IH0NCgkJDQogICAgZm9yICggaSA9IDB1bDsgaSA8IG0gOyBpKysgKSANCiAgICB7DQogICAgICAgIE5WSUMtPklDRVJbaV0gPSAweGZmZmZmZmZmdWw7DQogICAgICAgIE5WSUMtPklDUFJbaV0gPSAweGZmZmZmZmZmdWw7DQogICAgfSAgICANCn0NCg0KLyoqIFNldCBOVklDIGV4dGVybmFsIHByaW9yaXRpZXMgdG8gUE9SIHZhbHVlICovDQp2b2lkIHBfaW50ZXJydXB0X252aWNfcHJpb3JpdGllc19kZWZhdWx0X3NldCh2b2lkKQ0Kew0KICAgIHVpbnQzMl90IGk7DQogICAgLy8gU2V0IFBPUiBkZWZhdWx0IE5WSUMgcHJpb3JpdHkgKGhpZ2hlc3QpDQogICAgZm9yICggaSA9IDB1bDsgaSA8ICh1aW50MzJfdClNQVhfSVJRbjsgaSsrICkgew0KICAgICAgICBOVklDLT5JUFtpXSA9IDB1Ow0KICAgIH0NCn0NCg0KLyoqIFNldCBOVklDIGV4dGVybmFsIHByaW9yaXRpZXMgdG8gc3BlY2lmaWVkIHByaW9yaXR5ICgwIC0gNykNCiAqIEBwYXJhbSB6ZXJvLWJhc2VkIDMtYml0IHByaW9yaXR5IHZhbHVlOiAwPWhpZ2hlc3QsIDc9bG93ZXN0Lg0KICogQG5vdGUgTlZJQyBoaWdoZXN0IHByaW9yaXR5IGlzIHRoZSB2YWx1ZSAwLCBsb3dlc3QgaXMgYWxsIDEncy4NCiAqIEVhY2ggZXh0ZXJuYWwgaW50ZXJydXB0IGhhcyBhbiA4LWJpdCByZWdpc3RlciBhbmQgdGhlIHByaW9yaXR5IA0KICogaXMgbGVmdCBqdXN0aWZpZWQgaW4gdGhlIHJlZ2lzdGVycy4gTUVDeHh4IGltcGxlbWVudHMgOCBwcmlvcml0eSANCiAqIGxldmVscyBvciBiaXRzIFs3OjVdIGluIHRoZSByZWdpc3Rlci4gTG93ZXN0IHByaW9yaXR5ID0gMHhFMA0KICovDQp2b2lkIHBfaW50ZXJydXB0X252aWNfcHJpb3JpdGllc19zZXQodWludDhfdCBuZXdfcHJpKQ0Kew0KICAgIHVpbnQxNl90IGk7DQogICAgDQogICAgZm9yICggaSA9IDB1bDsgaSA8IE1BWF9JUlFuOyBpKysgKSB7DQogICAgICAgIE5WSUNfU2V0UHJpb3JpdHkoKElSUW5fVHlwZSlpLCBuZXdfcHJpKTsNCiAgICB9DQp9DQoNCg0KLyogZW5kIGludGVycnVwdF9udmljX3BlcnBobC5jICovDQovKiogICBAfQ0KICovDQo=