LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X2V4dGl0LmMNCiogQXV0aG9yICAgICAgICAgICAgIDogTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiogRGF0ZSBGaXJzdCBJc3N1ZWQgIDogMDMvMTAvMjAwNg0KKiBEZXNjcmlwdGlvbiAgICAgICAgOiBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBFWFRJVCBzb2Z0d2FyZSBmdW5jdGlvbnMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBIaXN0b3J5Og0KKiAwNy8xNy8yMDA2IDogVjEuMA0KKiAwMy8xMC8yMDA2IDogVjAuMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAiNzV4X2V4dGl0LmgiDQojaW5jbHVkZSAiNzV4X21yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEVYVElUX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIEVYVElUIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQNCiogICAgICAgICAgICAgICAgICByZXNldCB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBFWFRJVF9EZUluaXQodm9pZCkNCnsNCiAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfRVhUSVQsRU5BQkxFKTsNCiAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfRVhUSVQsRElTQUJMRSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRVhUSVRfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBFWFRJVCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRVhUSVRfSW5pdFN0cnVjdCAuDQoqIElucHV0ICAgICAgICAgIDogLSBFWFRJVF9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgRVhUSVRfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQoqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRVhUSVQNCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEVYVElUX0luaXQoRVhUSVRfSW5pdFR5cGVEZWYqIEVYVElUX0luaXRTdHJ1Y3QpDQp7DQogIGlmKEVYVElUX0luaXRTdHJ1Y3QtPkVYVElUX0lUTGluZUNtZCA9PSBFTkFCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGludGVycnVwdHMgKi8NCiAgICBFWFRJVC0+TVIgfD0gRVhUSVRfSW5pdFN0cnVjdC0+RVhUSVRfSVRMaW5lOw0KICAgIA0KICAgIC8qIFNlbGVjdCB0aGUgdHJpZ2dlciBmb3IgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGludGVycnVwdHMgKi8NCiAgICBpZihFWFRJVF9Jbml0U3RydWN0LT5FWFRJVF9JVFRyaWdnZXIgPT0gRVhUSVRfSVRUcmlnZ2VyX0ZhbGxpbmcpDQogICAgew0KICAgICAgLyogRmFsbGluZyBlZGdlICovDQogICAgICBFWFRJVC0+VFNSICY9IH5FWFRJVF9Jbml0U3RydWN0LT5FWFRJVF9JVExpbmU7DQogICAgfQ0KICAgIGVsc2UgaWYgKEVYVElUX0luaXRTdHJ1Y3QtPkVYVElUX0lUVHJpZ2dlciA9PSBFWFRJVF9JVFRyaWdnZXJfUmlzaW5nKQ0KICAgIHsNCiAgICAgIC8qIFJpc2luZyBlZGdlICovDQogICAgICBFWFRJVC0+VFNSIHw9IEVYVElUX0luaXRTdHJ1Y3QtPkVYVElUX0lUTGluZTsNCiAgICB9DQogIH0NCiAgZWxzZSBpZihFWFRJVF9Jbml0U3RydWN0LT5FWFRJVF9JVExpbmVDbWQgPT0gRElTQUJMRSkNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGludGVycnVwdHMgKi8NCiAgICBFWFRJVC0+TVIgJj0gfkVYVElUX0luaXRTdHJ1Y3QtPkVYVElUX0lUTGluZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEVYVElUX1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIEVYVElUX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIHJlc2V0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gRVhUSVRfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEVYVElUX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgRVhUSVRfU3RydWN0SW5pdChFWFRJVF9Jbml0VHlwZURlZiogRVhUSVRfSW5pdFN0cnVjdCkNCnsNCiAgRVhUSVRfSW5pdFN0cnVjdC0+RVhUSVRfSVRMaW5lID0gRVhUSVRfSVRMaW5lTm9uZTsNCiAgRVhUSVRfSW5pdFN0cnVjdC0+RVhUSVRfSVRUcmlnZ2VyID0gRVhUSVRfSVRUcmlnZ2VyX0ZhbGxpbmc7DQogIEVYVElUX0luaXRTdHJ1Y3QtPkVYVElUX0lUTGluZUNtZCA9IERJU0FCTEU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRVhUSVRfR2VuZXJhdGVTV0ludGVycnVwdA0KKiBEZXNjcmlwdGlvbiAgICA6IEdlbmVyYXRlcyBhIFNvZnR3YXJlIGludGVycnVwdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEVYVElUX0lUTGluZTogc3BlY2lmaWVzIHRoZSBFWFRJVCBsaW5lcyB0byBiZSBlbmFibGVkIG9yDQoqICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KKiAgICAgICAgICAgICAgICAgICAgIC0gRVhUSVRfSVRMaW5leDogRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgeCB3aGVyZSB4KDAuLjE1KQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBFWFRJVF9HZW5lcmF0ZVNXSW50ZXJydXB0KHUxNiBFWFRJVF9JVExpbmUpDQp7DQogIEVYVElULT5TV0lSIHw9IEVYVElUX0lUTGluZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBFWFRJVF9HZXRGbGFnU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFWFRJVCBsaW5lIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEVYVElUX0lUTGluZTogc3BlY2lmaWVzIHRoZSBFWFRJVCBsaW5lcyBmbGFnIHRvIGNoZWNrLiAgDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQoqICAgICAgICAgICAgICAgICAgICAgLSBFWFRJVF9JVExpbmV4OiBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSB4IHdoZXJlIHgoMC4uMTUpDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgRVhUSVRfSVRMaW5lIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgRVhUSVRfR2V0RmxhZ1N0YXR1cyh1MTYgRVhUSVRfSVRMaW5lKQ0Kew0KICBpZigoRVhUSVQtPlBSICYgRVhUSVRfSVRMaW5lKSAhPSBSRVNFVCkNCiAgew0KICAgIHJldHVybiBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcmV0dXJuIFJFU0VUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRVhUSVRfQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBFWFRJVJJzIGxpbmUgcGVuZGluZyBmbGFncy4NCiogSW5wdXQgICAgICAgICAgOiAtIEVYVElUX0lUTGluZTogc3BlY2lmaWVzIHRoZSBFWFRJVCBsaW5lcyBmbGFncyB0byBjbGVhci4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQoqICAgICAgICAgICAgICAgICAgICAgLSBFWFRJVF9JVExpbmV4OiBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSB4IHdoZXJlIHgoMC4uMTUpDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEVYVElUX0NsZWFyRmxhZyh1MTYgRVhUSVRfSVRMaW5lKQ0Kew0KICBFWFRJVC0+UFIgPSBFWFRJVF9JVExpbmU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRVhUSVRfR2V0SVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEVYVElUIGxpbmUgaXMgYXNzZXJ0ZWQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gRVhUSVRfSVRMaW5lOiBzcGVjaWZpZXMgdGhlIEVYVElUIGxpbmVzIHRvIGNoZWNrLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCiogICAgICAgICAgICAgICAgICAgICAtIEVYVElUX0lUTGluZXg6IEV4dGVybmFsIGludGVycnVwdCBsaW5lIHggd2hlcmUgeCgwLi4xNSkNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBFWFRJVF9JVExpbmUgKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KSVRTdGF0dXMgRVhUSVRfR2V0SVRTdGF0dXModTE2IEVYVElUX0lUTGluZSkNCnsNCiAgaWYoKChFWFRJVC0+UFIgJiBFWFRJVF9JVExpbmUpICE9IFJFU0VUKSYmICgoRVhUSVQtPk1SICYgRVhUSVRfSVRMaW5lKSAhPSBSRVNFVCkpDQogIHsNCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEVYVElUX0NsZWFySVRQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBFWFRJVJJzIGxpbmUgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gRVhUSVRfSVRMaW5lOiBzcGVjaWZpZXMgdGhlIEVYVElUIGxpbmVzIHRvIGNsZWFyLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCiogICAgICAgICAgICAgICAgICAgICAtIEVYVElUX0lUTGluZXg6IEV4dGVybmFsIGludGVycnVwdCBsaW5lIHggd2hlcmUgeCgwLi4xNSkNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgRVhUSVRfQ2xlYXJJVFBlbmRpbmdCaXQodTE2IEVYVElUX0lUTGluZSkNCnsNCiAgRVhUSVQtPlBSID0gRVhUSVRfSVRMaW5lOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDYgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K