LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKI2lmbmRlZiBfQlBBUlJfSFhYCiNkZWZpbmUgX0JQQVJSX0hYWAoKI2luY2x1ZGUgPHRvb2xzL3NvbGFyLmg+CiNpbmNsdWRlIDx0b29scy9kZWJ1Zy5oeHg+CiNpbmNsdWRlIDxzd2RsbGFwaS5oPgoKc3RydWN0IEJsb2NrSW5mbzsKY2xhc3MgQmlnUHRyQXJyYXk7CgpjbGFzcyBCaWdQdHJFbnRyeQp7CglmcmllbmQgY2xhc3MgQmlnUHRyQXJyYXk7CglCbG9ja0luZm8qIHBCbG9jazsKCXNhbF91SW50MTYgbk9mZnNldDsKcHVibGljOgoJdmlydHVhbCB+QmlnUHRyRW50cnkoKSB7fQpwcm90ZWN0ZWQ6CglCaWdQdHJFbnRyeSgpIDogcEJsb2NrKDApLCBuT2Zmc2V0KDApIHt9CQoKCWlubGluZSBzYWxfdUxvbmcgR2V0UG9zKCkgY29uc3Q7CglpbmxpbmUgQmlnUHRyQXJyYXkmIEdldEFycmF5KCkgY29uc3Q7Cn07CnR5cGVkZWYgQmlnUHRyRW50cnkqIEVsZW1lbnRQdHI7CgoKdHlwZWRlZiBzYWxfQm9vbCAoKkZuRm9yRWFjaCkoIGNvbnN0IEVsZW1lbnRQdHImLCB2b2lkKiBwQXJncyApOwoKLy8gMTAwMCBFaW50coRnZSBwcm8gQmxvY2sgPSBldHdhcyB3ZW5pZ2VyIGFscyA0SwojZGVmaW5lIE1BWEVOVFJZIDEwMDAKCgovLyBBbnphaGwgRWludHJhZWdlLCBkaWUgYmVpIGRlciBLb21wcmVzc2lvbiBmcmVpIGJsZWliZW4gZHVlcmZlbgovLyBkaWVzZXIgV2VydCBpc3QgZnVlciBkZW4gV29yc3QgQ2FzZSwgZGEgd2lyIE1BWEJMT0NLIG1pdCBjYSAyNSUKLy8gT3ZlcmhlYWQgZGVmaW5pZXJ0IGhhYmVuLCByZWljaGVuIDgwJSA9IDgwMCBFaW50cmFlZ2Ugdm9sbGtvbW1lbiBhdXMKLy8gV2lsbCBtYW5uIHZvZWxsaWdlIEtvbXByZXNzaW9uIGhhYmVuLCBtdXNzIGViZW4gMTAwIGFuZ2VnZWJlbiB3ZXJkZW4uCgojZGVmaW5lCUNPTVBSRVNTTFZMIDgwCgpzdHJ1Y3QgQmxvY2tJbmZvIHsJCQkJCS8vIEJsb2NrLUluZm86CglCaWdQdHJBcnJheSogcEJpZ0FycjsJCQkvLyBpbiBkaWVzZW0gQXJyYXkgc3RlaHQgZGVyIEJsb2NrCglFbGVtZW50UHRyKglwRGF0YTsJCQkJLy8gRGF0ZW5ibG9jawoJc2FsX3VMb25nIG5TdGFydCwgbkVuZDsJCQkJLy8gU3RhcnQtIHVuZCBFbmRJbmRleAoJc2FsX3VJbnQxNiBuRWxlbTsJCQkJCS8vIEFuemFobCBFbGVtZW50ZQp9OwoKY2xhc3MgU1dfRExMUFVCTElDIEJpZ1B0ckFycmF5CnsKCUJsb2NrSW5mbyoqIHBwSW5mOwkJCQkvLyBCbG9jay1JbmZvcwoJc2FsX3VMb25nCQluU2l6ZTsJCQkJLy8gQW56YWhsIEVsZW1lbnRlCglzYWxfdUludDE2CQluTWF4QmxvY2s7CQkJLy8gYWt0LiBtYXggQW56YWhsIEJsb2Vja2UKCXNhbF91SW50MTYJCW5CbG9jazsJCQkJLy8gQW56YWhsIEJsb2Vja2UKCXNhbF91SW50MTYJCW5DdXI7CQkJCS8vIGxldHp0ZXIgQmxvY2sKCglzYWxfdUludDE2CQlJbmRleDJCbG9jayggc2FsX3VMb25nICkgY29uc3Q7CS8vIEJsb2Nrc3VjaGUKCUJsb2NrSW5mbyoJSW5zQmxvY2soIHNhbF91SW50MTYgKTsJCQkvLyBCbG9jayBlaW5mdWVnZW4KCXZvaWQJCUJsb2NrRGVsKCBzYWxfdUludDE2ICk7CQkJLy8gZXMgd3VyZGVuIEJsb2Vja2UgZ2Vsb2VzY2h0Cgl2b2lkCQlVcGRJbmRleCggc2FsX3VJbnQxNiApOwkJCS8vIEluZGV4ZSBuZXUgYmVyZWNobmVuCgpwcm90ZWN0ZWQ6CgkvLyBmdWVsbGUgYWxsZSBCbG9lY2tlIGF1Zi4KCS8vIERlciBzaG9ydCBnaWJ0IGluIFByb3plbnQgYW4sIHdpZSB2b2xsIGRpZSBCbG9lY2tlIHdlcmRlbiBzb2xsZW4uCgkvLyBEZXIgUmV0dXJuV2VydCBiZXNhZ3QsIGRhcyBpcmdlbmRldHdhcyAiZ2V0YW4iIHd1cmRlCglzYWxfdUludDE2IENvbXByZXNzKCBzaG9ydCA9IENPTVBSRVNTTFZMICk7CgpwdWJsaWM6CglCaWdQdHJBcnJheSgpOwoJfkJpZ1B0ckFycmF5KCk7CgoJc2FsX3VMb25nIENvdW50KCkgY29uc3QgeyByZXR1cm4gblNpemU7IH0KCgl2b2lkIEluc2VydCggY29uc3QgRWxlbWVudFB0ciYgciwgc2FsX3VMb25nIHBvcyApOwoJdm9pZCBSZW1vdmUoIHNhbF91TG9uZyBwb3MsIHNhbF91TG9uZyBuID0gMSApOwoJdm9pZCBNb3ZlKCBzYWxfdUxvbmcgZnJvbSwgc2FsX3VMb25nIHRvICk7Cgl2b2lkIFJlcGxhY2UoIHNhbF91TG9uZyBwb3MsIGNvbnN0IEVsZW1lbnRQdHImIHIpOwoKCUVsZW1lbnRQdHIgb3BlcmF0b3JbXSggc2FsX3VMb25nICkgY29uc3Q7Cgl2b2lkIEZvckVhY2goIEZuRm9yRWFjaCBmbiwgdm9pZCogcEFyZ3MgPSBOVUxMICkKCXsKCQlGb3JFYWNoKCAwLCBuU2l6ZSwgZm4sIHBBcmdzICk7Cgl9Cgl2b2lkIEZvckVhY2goIHNhbF91TG9uZyBuU3RhcnQsIHNhbF91TG9uZyBuRW5kLCBGbkZvckVhY2ggZm4sIHZvaWQqIHBBcmdzID0gTlVMTCApOwp9OwoKCgppbmxpbmUgc2FsX3VMb25nIEJpZ1B0ckVudHJ5OjpHZXRQb3MoKSBjb25zdAp7CglEQkdfQVNTRVJUKCB0aGlzID09IHBCbG9jay0+cERhdGFbIG5PZmZzZXQgXSwgIkVsZW1lbnQgbmljaHQgaW0gQmxvY2siICk7CglyZXR1cm4gcEJsb2NrLT5uU3RhcnQgKyBuT2Zmc2V0Owp9CgppbmxpbmUgQmlnUHRyQXJyYXkmIEJpZ1B0ckVudHJ5OjpHZXRBcnJheSgpIGNvbnN0CnsKCXJldHVybiAqcEJsb2NrLT5wQmlnQXJyOwp9CgoKI2VuZGlmCg==