LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybDR4eC5oDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiBWMS4zLjENCiAgKiBAZGF0ZSAgICAyMS1BcHJpbC0yMDE3DQogICogQGJyaWVmICAgQ01TSVMgU1RNMzJMNHh4IERldmljZSBQZXJpcGhlcmFsIEFjY2VzcyBMYXllciBIZWFkZXIgRmlsZS4NCiAgKg0KICAqICAgICAgICAgIFRoZSBmaWxlIGlzIHRoZSB1bmlxdWUgaW5jbHVkZSBmaWxlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXINCiAgKiAgICAgICAgICBpcyB1c2luZyBpbiB0aGUgQyBzb3VyY2UgY29kZSwgdXN1YWxseSBpbiBtYWluLmMuIFRoaXMgZmlsZSBjb250YWluczoNCiAgKiAgICAgICAgICAgLSBDb25maWd1cmF0aW9uIHNlY3Rpb24gdGhhdCBhbGxvd3MgdG8gc2VsZWN0Og0KICAqICAgICAgICAgICAgICAtIFRoZSBTVE0zMkw0eHggZGV2aWNlIHVzZWQgaW4gdGhlIHRhcmdldCBhcHBsaWNhdGlvbg0KICAqICAgICAgICAgICAgICAtIFRvIHVzZSBvciBub3QgdGhlIHBlcmlwaGVyYWyScyBkcml2ZXJzIGluIGFwcGxpY2F0aW9uIGNvZGUoaS5lLg0KICAqICAgICAgICAgICAgICAgIGNvZGUgd2lsbCBiZSBiYXNlZCBvbiBkaXJlY3QgYWNjZXNzIHRvIHBlcmlwaGVyYWyScyByZWdpc3RlcnMNCiAgKiAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBkcml2ZXJzIEFQSSksIHRoaXMgb3B0aW9uIGlzIGNvbnRyb2xsZWQgYnkNCiAgKiAgICAgICAgICAgICAgICAiI2RlZmluZSBVU0VfSEFMX0RSSVZFUiINCiAgKg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAYXR0ZW50aW9uDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKg0KICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sDQogICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCiAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24NCiAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzDQogICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUNCiAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICAqDQogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiDQogICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQ0KICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQ0KICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUNCiAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTA0KICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SDQogICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVINCiAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLA0KICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAgKg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKi8NCg0KLyoqIEBhZGR0b2dyb3VwIENNU0lTDQogICogQHsNCiAgKi8NCg0KLyoqIEBhZGR0b2dyb3VwIHN0bTMybDR4eA0KICAqIEB7DQogICovDQoNCiNpZm5kZWYgX19TVE0zMkw0eHhfSA0KI2RlZmluZSBfX1NUTTMyTDR4eF9IDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KIGV4dGVybiAiQyIgew0KI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQoNCi8qKiBAYWRkdG9ncm91cCBMaWJyYXJ5X2NvbmZpZ3VyYXRpb25fc2VjdGlvbg0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiBTVE0zMiBGYW1pbHkNCiAgKi8NCiNpZiAhZGVmaW5lZCAoU1RNMzJMNCkNCiNkZWZpbmUgU1RNMzJMNA0KI2VuZGlmIC8qIFNUTTMyTDQgKi8NCg0KLyogVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGFjY29yZGluZyB0byB0aGUgdGFyZ2V0IFNUTTMyTDQgZGV2aWNlIHVzZWQgaW4geW91cg0KICAgYXBwbGljYXRpb24NCiAgKi8NCg0KI2lmICFkZWZpbmVkIChTVE0zMkw0MzF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDQzMnh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNDMzeHgpICYmICFkZWZpbmVkIChTVE0zMkw0NDJ4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDQ0M3h4KSAmJiBcDQogICAgIWRlZmluZWQgKFNUTTMyTDQ1MXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNDUyeHgpICYmICFkZWZpbmVkIChTVE0zMkw0NjJ4eCkgJiYgXA0KICAgICFkZWZpbmVkIChTVE0zMkw0NzF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDQ3NXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNDc2eHgpICYmICFkZWZpbmVkIChTVE0zMkw0ODV4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDQ4Nnh4KSAmJiBcDQogICAgIWRlZmluZWQgKFNUTTMyTDQ5Nnh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNEE2eHgpDQogIC8qICNkZWZpbmUgU1RNMzJMNDMxeHggKi8gICAvKiE8IFNUTTMyTDQzMXh4IERldmljZXMgKi8NCiAgLyogI2RlZmluZSBTVE0zMkw0MzJ4eCAqLyAgIC8qITwgU1RNMzJMNDMyeHggRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMyTDQzM3h4ICovICAgLyohPCBTVE0zMkw0MzN4eCBEZXZpY2VzICovDQogIC8qICNkZWZpbmUgU1RNMzJMNDQyeHggKi8gICAvKiE8IFNUTTMyTDQ0Mnh4IERldmljZXMgKi8NCiAgLyogI2RlZmluZSBTVE0zMkw0NDN4eCAqLyAgIC8qITwgU1RNMzJMNDQzeHggRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMyTDQ1MXh4ICovICAgLyohPCBTVE0zMkw0NTF4eCBEZXZpY2VzICovDQogIC8qICNkZWZpbmUgU1RNMzJMNDUyeHggKi8gICAvKiE8IFNUTTMyTDQ1Mnh4IERldmljZXMgKi8NCiAgLyogI2RlZmluZSBTVE0zMkw0NjJ4eCAqLyAgIC8qITwgU1RNMzJMNDYyeHggRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMyTDQ3MXh4ICovICAgLyohPCBTVE0zMkw0NzF4eCBEZXZpY2VzICovDQogIC8qICNkZWZpbmUgU1RNMzJMNDc1eHggKi8gICAvKiE8IFNUTTMyTDQ3NXh4IERldmljZXMgKi8NCiAgLyogI2RlZmluZSBTVE0zMkw0NzZ4eCAqLyAgIC8qITwgU1RNMzJMNDc2eHggRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMyTDQ4NXh4ICovICAgLyohPCBTVE0zMkw0ODV4eCBEZXZpY2VzICovDQogIC8qICNkZWZpbmUgU1RNMzJMNDg2eHggKi8gICAvKiE8IFNUTTMyTDQ4Nnh4IERldmljZXMgKi8NCiAgLyogI2RlZmluZSBTVE0zMkw0OTZ4eCAqLyAgIC8qITwgU1RNMzJMNDk2eHggRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMyTDRBNnh4ICovICAgLyohPCBTVE0zMkw0QTZ4eCBEZXZpY2VzICovDQojZW5kaWYNCg0KLyogIFRpcDogVG8gYXZvaWQgbW9kaWZ5aW5nIHRoaXMgZmlsZSBlYWNoIHRpbWUgeW91IG5lZWQgdG8gc3dpdGNoIGJldHdlZW4gdGhlc2UNCiAgICAgICAgZGV2aWNlcywgeW91IGNhbiBkZWZpbmUgdGhlIGRldmljZSBpbiB5b3VyIHRvb2xjaGFpbiBjb21waWxlciBwcmVwcm9jZXNzb3IuDQogICovDQojaWYgIWRlZmluZWQgIChVU0VfSEFMX0RSSVZFUikNCi8qKg0KICogQGJyaWVmIENvbW1lbnQgdGhlIGxpbmUgYmVsb3cgaWYgeW91IHdpbGwgbm90IHVzZSB0aGUgcGVyaXBoZXJhbHMgZHJpdmVycy4NCiAgIEluIHRoaXMgY2FzZSwgdGhlc2UgZHJpdmVycyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIGNvZGUgd2lsbA0KICAgYmUgYmFzZWQgb24gZGlyZWN0IGFjY2VzcyB0byBwZXJpcGhlcmFscyByZWdpc3RlcnMNCiAgICovDQogIC8qI2RlZmluZSBVU0VfSEFMX0RSSVZFUiAqLw0KI2VuZGlmIC8qIFVTRV9IQUxfRFJJVkVSICovDQoNCi8qKg0KICAqIEBicmllZiBDTVNJUyBEZXZpY2UgdmVyc2lvbiBudW1iZXIgVjEuMy4xDQogICovDQojZGVmaW5lIF9fU1RNMzJMNF9DTVNJU19WRVJTSU9OX01BSU4gICAoMHgwMSkgLyohPCBbMzE6MjRdIG1haW4gdmVyc2lvbiAqLw0KI2RlZmluZSBfX1NUTTMyTDRfQ01TSVNfVkVSU0lPTl9TVUIxICAgKDB4MDMpIC8qITwgWzIzOjE2XSBzdWIxIHZlcnNpb24gKi8NCiNkZWZpbmUgX19TVE0zMkw0X0NNU0lTX1ZFUlNJT05fU1VCMiAgICgweDAxKSAvKiE8IFsxNTo4XSAgc3ViMiB2ZXJzaW9uICovDQojZGVmaW5lIF9fU1RNMzJMNF9DTVNJU19WRVJTSU9OX1JDICAgICAoMHgwMCkgLyohPCBbNzowXSAgcmVsZWFzZSBjYW5kaWRhdGUgKi8NCiNkZWZpbmUgX19TVE0zMkw0X0NNU0lTX1ZFUlNJT04gICAgICAgICgoX19TVE0zMkw0X0NNU0lTX1ZFUlNJT05fTUFJTiA8PCAyNClcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJMNF9DTVNJU19WRVJTSU9OX1NVQjEgPDwgMTYpXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyTDRfQ01TSVNfVkVSU0lPTl9TVUIyIDw8IDggKVwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoX19TVE0zMkw0X0NNU0lTX1ZFUlNJT05fUkMpKQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGFkZHRvZ3JvdXAgRGV2aWNlX0luY2x1ZGVkDQogICogQHsNCiAgKi8NCg0KI2lmIGRlZmluZWQoU1RNMzJMNDMxeHgpDQogICNpbmNsdWRlICJzdG0zMmw0MzF4eC5oIg0KI2VsaWYgZGVmaW5lZChTVE0zMkw0MzJ4eCkNCiAgI2luY2x1ZGUgInN0bTMybDQzMnh4LmgiDQojZWxpZiBkZWZpbmVkKFNUTTMyTDQzM3h4KQ0KICAjaW5jbHVkZSAic3RtMzJsNDMzeHguaCINCiNlbGlmIGRlZmluZWQoU1RNMzJMNDQyeHgpDQogICNpbmNsdWRlICJzdG0zMmw0NDJ4eC5oIg0KI2VsaWYgZGVmaW5lZChTVE0zMkw0NDN4eCkNCiAgI2luY2x1ZGUgInN0bTMybDQ0M3h4LmgiDQojZWxpZiBkZWZpbmVkKFNUTTMyTDQ1MXh4KQ0KICAjaW5jbHVkZSAic3RtMzJsNDUxeHguaCINCiNlbGlmIGRlZmluZWQoU1RNMzJMNDUyeHgpDQogICNpbmNsdWRlICJzdG0zMmw0NTJ4eC5oIg0KI2VsaWYgZGVmaW5lZChTVE0zMkw0NjJ4eCkNCiAgI2luY2x1ZGUgInN0bTMybDQ2Mnh4LmgiDQojZWxpZiBkZWZpbmVkKFNUTTMyTDQ3MXh4KQ0KICAjaW5jbHVkZSAic3RtMzJsNDcxeHguaCINCiNlbGlmIGRlZmluZWQoU1RNMzJMNDc1eHgpDQogICNpbmNsdWRlICJzdG0zMmw0NzV4eC5oIg0KI2VsaWYgZGVmaW5lZChTVE0zMkw0NzZ4eCkNCiAgI2luY2x1ZGUgInN0bTMybDQ3Nnh4LmgiDQojZWxpZiBkZWZpbmVkKFNUTTMyTDQ4NXh4KQ0KICAjaW5jbHVkZSAic3RtMzJsNDg1eHguaCINCiNlbGlmIGRlZmluZWQoU1RNMzJMNDg2eHgpDQogICNpbmNsdWRlICJzdG0zMmw0ODZ4eC5oIg0KI2VsaWYgZGVmaW5lZChTVE0zMkw0OTZ4eCkNCiAgI2luY2x1ZGUgInN0bTMybDQ5Nnh4LmgiDQojZWxpZiBkZWZpbmVkKFNUTTMyTDRBNnh4KQ0KICAjaW5jbHVkZSAic3RtMzJsNGE2eHguaCINCiNlbHNlDQogI2Vycm9yICJQbGVhc2Ugc2VsZWN0IGZpcnN0IHRoZSB0YXJnZXQgU1RNMzJMNHh4IGRldmljZSB1c2VkIGluIHlvdXIgYXBwbGljYXRpb24gKGluIHN0bTMybDR4eC5oIGZpbGUpIg0KI2VuZGlmDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAYWRkdG9ncm91cCBFeHBvcnRlZF90eXBlcw0KICAqIEB7DQogICovDQp0eXBlZGVmIGVudW0NCnsNCiAgUkVTRVQgPSAwLA0KICBTRVQgPSAhUkVTRVQNCn0gRmxhZ1N0YXR1cywgSVRTdGF0dXM7DQoNCnR5cGVkZWYgZW51bQ0Kew0KICBESVNBQkxFID0gMCwNCiAgRU5BQkxFID0gIURJU0FCTEUNCn0gRnVuY3Rpb25hbFN0YXRlOw0KI2RlZmluZSBJU19GVU5DVElPTkFMX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRElTQUJMRSkgfHwgKChTVEFURSkgPT0gRU5BQkxFKSkNCg0KdHlwZWRlZiBlbnVtDQp7DQogIEVSUk9SID0gMCwNCiAgU1VDQ0VTUyA9ICFFUlJPUg0KfSBFcnJvclN0YXR1czsNCg0KLyoqDQogICogQH0NCiAgKi8NCg0KDQovKiogQGFkZHRvZ3JvdXAgRXhwb3J0ZWRfbWFjcm9zDQogICogQHsNCiAgKi8NCiNkZWZpbmUgU0VUX0JJVChSRUcsIEJJVCkgICAgICgoUkVHKSB8PSAoQklUKSkNCg0KI2RlZmluZSBDTEVBUl9CSVQoUkVHLCBCSVQpICAgKChSRUcpICY9IH4oQklUKSkNCg0KI2RlZmluZSBSRUFEX0JJVChSRUcsIEJJVCkgICAgKChSRUcpICYgKEJJVCkpDQoNCiNkZWZpbmUgQ0xFQVJfUkVHKFJFRykgICAgICAgICgoUkVHKSA9ICgweDApKQ0KDQojZGVmaW5lIFdSSVRFX1JFRyhSRUcsIFZBTCkgICAoKFJFRykgPSAoVkFMKSkNCg0KI2RlZmluZSBSRUFEX1JFRyhSRUcpICAgICAgICAgKChSRUcpKQ0KDQojZGVmaW5lIE1PRElGWV9SRUcoUkVHLCBDTEVBUk1BU0ssIFNFVE1BU0spICBXUklURV9SRUcoKFJFRyksICgoKFJFQURfUkVHKFJFRykpICYgKH4oQ0xFQVJNQVNLKSkpIHwgKFNFVE1BU0spKSkNCg0KI2RlZmluZSBQT1NJVElPTl9WQUwoVkFMKSAgICAgKF9fQ0xaKF9fUkJJVChWQUwpKSkNCg0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQojaWYgZGVmaW5lZCAoVVNFX0hBTF9EUklWRVIpDQogI2luY2x1ZGUgInN0bTMybDR4eF9oYWwuaCINCiNlbmRpZiAvKiBVU0VfSEFMX0RSSVZFUiAqLw0KDQojaWZkZWYgX19jcGx1c3BsdXMNCn0NCiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KDQojZW5kaWYgLyogX19TVE0zMkw0eHhfSCAqLw0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==