LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyaDd4eC5oDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAYnJpZWYgICBDTVNJUyBTVE0zMkg3eHggRGV2aWNlIFBlcmlwaGVyYWwgQWNjZXNzIExheWVyIEhlYWRlciBGaWxlLg0KICAqDQogICogICAgICAgICAgVGhlIGZpbGUgaXMgdGhlIHVuaXF1ZSBpbmNsdWRlIGZpbGUgdGhhdCB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lcg0KICAqICAgICAgICAgIGlzIHVzaW5nIGluIHRoZSBDIHNvdXJjZSBjb2RlLCB1c3VhbGx5IGluIG1haW4uYy4gVGhpcyBmaWxlIGNvbnRhaW5zOg0KICAqICAgICAgICAgICAtIENvbmZpZ3VyYXRpb24gc2VjdGlvbiB0aGF0IGFsbG93cyB0byBzZWxlY3Q6DQogICogICAgICAgICAgICAgIC0gVGhlIFNUTTMySDd4eCBkZXZpY2UgdXNlZCBpbiB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uDQogICogICAgICAgICAgICAgIC0gVG8gdXNlIG9yIG5vdCB0aGUgcGVyaXBoZXJhbJJzIGRyaXZlcnMgaW4gYXBwbGljYXRpb24gY29kZShpLmUuDQogICogICAgICAgICAgICAgICAgY29kZSB3aWxsIGJlIGJhc2VkIG9uIGRpcmVjdCBhY2Nlc3MgdG8gcGVyaXBoZXJhbJJzIHJlZ2lzdGVycw0KICAqICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGRyaXZlcnMgQVBJKSwgdGhpcyBvcHRpb24gaXMgY29udHJvbGxlZCBieQ0KICAqICAgICAgICAgICAgICAgICIjZGVmaW5lIFVTRV9IQUxfRFJJVkVSIg0KICAqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBhdHRlbnRpb24NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLg0KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4NCiAgKg0KICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLA0KICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUNCiAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6DQogICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UNCiAgKg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKi8NCg0KLyoqIEBhZGR0b2dyb3VwIENNU0lTDQogICogQHsNCiAgKi8NCg0KLyoqIEBhZGR0b2dyb3VwIHN0bTMyaDd4eA0KICAqIEB7DQogICovDQoNCiNpZm5kZWYgU1RNMzJIN3h4X0gNCiNkZWZpbmUgU1RNMzJIN3h4X0gNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQogZXh0ZXJuICJDIiB7DQojZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCg0KLyoqIEBhZGR0b2dyb3VwIExpYnJhcnlfY29uZmlndXJhdGlvbl9zZWN0aW9uDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmIFNUTTMyIEZhbWlseQ0KICAqLw0KI2lmICFkZWZpbmVkICAoU1RNMzJINykNCiNkZWZpbmUgU1RNMzJINw0KI2VuZGlmIC8qIFNUTTMySDcgKi8NCg0KDQovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgYWNjb3JkaW5nIHRvIHRoZSB0YXJnZXQgU1RNMzJINyBkZXZpY2UgdXNlZCBpbiB5b3VyDQogICBhcHBsaWNhdGlvbg0KICAqLw0KDQojaWYgIWRlZmluZWQgKFNUTTMySDc0M3h4KSAmJiAhZGVmaW5lZCAoU1RNMzJINzUzeHgpICAmJiAhZGVmaW5lZCAoU1RNMzJINzUweHgpICYmICFkZWZpbmVkIChTVE0zMkg3NDJ4eCkgJiYgXA0KICAgICFkZWZpbmVkIChTVE0zMkg3NDV4eCkgJiYgIWRlZmluZWQgKFNUTTMySDc1NXh4KSAgJiYgIWRlZmluZWQgKFNUTTMySDc0N3h4KSAmJiAhZGVmaW5lZCAoU1RNMzJINzU3eHgpDQogIC8qICNkZWZpbmUgU1RNMzJINzQyeHggKi8gICAvKiE8IFNUTTMySDc0MlZJLCBTVE0zMkg3NDJaSSwgU1RNMzJINzQyQUksIFNUTTMySDc0MklJLCBTVE0zMkg3NDJCSSwgU1RNMzJINzQyWEkgRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMySDc0M3h4ICovICAgLyohPCBTVE0zMkg3NDNWSSwgU1RNMzJINzQzWkksIFNUTTMySDc0M0FJLCBTVE0zMkg3NDNJSSwgU1RNMzJINzQzQkksIFNUTTMySDc0M1hJIERldmljZXMgKi8NCiAgLyogI2RlZmluZSBTVE0zMkg3NTN4eCAqLyAgIC8qITwgU1RNMzJINzUzVkksIFNUTTMySDc1M1pJLCBTVE0zMkg3NTNBSSwgU1RNMzJINzUzSUksIFNUTTMySDc1M0JJLCBTVE0zMkg3NTNYSSBEZXZpY2VzICovDQogIC8qICNkZWZpbmUgU1RNMzJINzUweHggKi8gICAvKiE8IFNUTTMySDc1MFYsIFNUTTMySDc1MEksIFNUTTMySDc1MFggRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMySDc0N3h4ICovICAgLyohPCBTVE0zMkg3NDdaSSwgU1RNMzJINzQ3QUksIFNUTTMySDc0N0lJLCBTVE0zMkg3NDdCSSwgU1RNMzJINzQ3WEkgRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMySDc1N3h4ICovICAgLyohPCBTVE0zMkg3NTdaSSwgU1RNMzJINzU3QUksIFNUTTMySDc1N0lJLCBTVE0zMkg3NTdCSSwgU1RNMzJINzU3WEkgRGV2aWNlcyAqLw0KICAvKiAjZGVmaW5lIFNUTTMySDc0NXh4ICovICAgLyohPCBTVE0zMkg3NDVaSSwgU1RNMzJINzQ1SUksIFNUTTMySDc0NUJJLCBTVE0zMkg3NDVYSSBEZXZpY2VzICAqLw0KICAvKiAjZGVmaW5lIFNUTTMySDc1NXh4ICovICAgLyohPCBTVE0zMkg3NTVaSSwgU1RNMzJINzU1SUksIFNUTTMySDc1NUJJLCBTVE0zMkg3NTVYSSBEZXZpY2VzICAqLw0KI2VuZGlmDQoNCi8qICBUaXA6IFRvIGF2b2lkIG1vZGlmeWluZyB0aGlzIGZpbGUgZWFjaCB0aW1lIHlvdSBuZWVkIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZXNlDQogICAgICAgIGRldmljZXMsIHlvdSBjYW4gZGVmaW5lIHRoZSBkZXZpY2UgaW4geW91ciB0b29sY2hhaW4gY29tcGlsZXIgcHJlcHJvY2Vzc29yLg0KICAqLw0KDQojaWYgZGVmaW5lZChEVUFMX0NPUkUpICYmICFkZWZpbmVkKENPUkVfQ000KSAmJiAhZGVmaW5lZChDT1JFX0NNNykNCiAjZXJyb3IgIkR1YWwgY29yZSBkZXZpY2UsIHBsZWFzZSBzZWxlY3QgQ09SRV9DTTQgb3IgQ09SRV9DTTciDQojZW5kaWYNCg0KI2lmICFkZWZpbmVkICAoVVNFX0hBTF9EUklWRVIpDQovKioNCiAqIEBicmllZiBDb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3aWxsIG5vdCB1c2UgdGhlIHBlcmlwaGVyYWxzIGRyaXZlcnMuDQogICBJbiB0aGlzIGNhc2UsIHRoZXNlIGRyaXZlcnMgd2lsbCBub3QgYmUgaW5jbHVkZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHdpbGwNCiAgIGJlIGJhc2VkIG9uIGRpcmVjdCBhY2Nlc3MgdG8gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzDQogICAqLw0KICAvKiNkZWZpbmUgVVNFX0hBTF9EUklWRVIgKi8NCiNlbmRpZiAvKiBVU0VfSEFMX0RSSVZFUiAqLw0KDQovKioNCiAgKiBAYnJpZWYgQ01TSVMgRGV2aWNlIHZlcnNpb24gbnVtYmVyIFYxLjUuMA0KICAqLw0KI2RlZmluZSBfX1NUTTMySDd4eF9DTVNJU19ERVZJQ0VfVkVSU0lPTl9NQUlOICAgKDB4MDEpIC8qITwgWzMxOjI0XSBtYWluIHZlcnNpb24gKi8NCiNkZWZpbmUgX19TVE0zMkg3eHhfQ01TSVNfREVWSUNFX1ZFUlNJT05fU1VCMSAgICgweDA1KSAvKiE8IFsyMzoxNl0gc3ViMSB2ZXJzaW9uICovDQojZGVmaW5lIF9fU1RNMzJIN3h4X0NNU0lTX0RFVklDRV9WRVJTSU9OX1NVQjIgICAoMHgwMCkgLyohPCBbMTU6OF0gIHN1YjIgdmVyc2lvbiAqLw0KI2RlZmluZSBfX1NUTTMySDd4eF9DTVNJU19ERVZJQ0VfVkVSU0lPTl9SQyAgICAgKDB4MDApIC8qITwgWzc6MF0gIHJlbGVhc2UgY2FuZGlkYXRlICovDQojZGVmaW5lIF9fU1RNMzJIN3h4X0NNU0lTX0RFVklDRV9WRVJTSU9OICAgICAgICAoKF9fQ01TSVNfREVWSUNFX1ZFUlNJT05fTUFJTiAgICAgPDwgMjQpXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fQ01TSVNfREVWSUNFX0hBTF9WRVJTSU9OX1NVQjEgPDwgMTYpXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fQ01TSVNfREVWSUNFX0hBTF9WRVJTSU9OX1NVQjIgPDwgOCApXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fQ01TSVNfREVWSUNFX0hBTF9WRVJTSU9OX1JDKSkNCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBhZGR0b2dyb3VwIERldmljZV9JbmNsdWRlZA0KICAqIEB7DQogICovDQoNCiNpZiBkZWZpbmVkKFNUTTMySDc0M3h4KQ0KICAjaW5jbHVkZSAic3RtMzJoNzQzeHguaCINCiNlbGlmIGRlZmluZWQoU1RNMzJINzUzeHgpDQogICNpbmNsdWRlICJzdG0zMmg3NTN4eC5oIg0KI2VsaWYgZGVmaW5lZChTVE0zMkg3NTB4eCkNCiAgI2luY2x1ZGUgInN0bTMyaDc1MHh4LmgiDQojZWxpZiBkZWZpbmVkKFNUTTMySDc0Mnh4KQ0KICAjaW5jbHVkZSAic3RtMzJoNzQyeHguaCINCiNlbGlmIGRlZmluZWQoU1RNMzJINzQ1eHgpDQogICNpbmNsdWRlICJzdG0zMmg3NDV4eC5oIg0KI2VsaWYgZGVmaW5lZChTVE0zMkg3NTV4eCkNCiAgI2luY2x1ZGUgInN0bTMyaDc1NXh4LmgiDQojZWxpZiBkZWZpbmVkKFNUTTMySDc0N3h4KQ0KICAjaW5jbHVkZSAic3RtMzJoNzQ3eHguaCINCiNlbGlmIGRlZmluZWQoU1RNMzJINzU3eHgpDQogICNpbmNsdWRlICJzdG0zMmg3NTd4eC5oIg0KI2Vsc2UNCiAjZXJyb3IgIlBsZWFzZSBzZWxlY3QgZmlyc3QgdGhlIHRhcmdldCBTVE0zMkg3eHggZGV2aWNlIHVzZWQgaW4geW91ciBhcHBsaWNhdGlvbiAoaW4gc3RtMzJoN3h4LmggZmlsZSkiDQojZW5kaWYNCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBhZGR0b2dyb3VwIEV4cG9ydGVkX3R5cGVzDQogICogQHsNCiAgKi8NCnR5cGVkZWYgZW51bQ0Kew0KICBSRVNFVCA9IDAsDQogIFNFVCA9ICFSRVNFVA0KfSBGbGFnU3RhdHVzLCBJVFN0YXR1czsNCg0KdHlwZWRlZiBlbnVtDQp7DQogIERJU0FCTEUgPSAwLA0KICBFTkFCTEUgPSAhRElTQUJMRQ0KfSBGdW5jdGlvbmFsU3RhdGU7DQojZGVmaW5lIElTX0ZVTkNUSU9OQUxfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBESVNBQkxFKSB8fCAoKFNUQVRFKSA9PSBFTkFCTEUpKQ0KDQp0eXBlZGVmIGVudW0NCnsNCiAgRVJST1IgPSAwLA0KICBTVUNDRVNTID0gIUVSUk9SDQp9IEVycm9yU3RhdHVzOw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQoNCi8qKiBAYWRkdG9ncm91cCBFeHBvcnRlZF9tYWNyb3MNCiAgKiBAew0KICAqLw0KI2RlZmluZSBTRVRfQklUKFJFRywgQklUKSAgICAgKChSRUcpIHw9IChCSVQpKQ0KDQojZGVmaW5lIENMRUFSX0JJVChSRUcsIEJJVCkgICAoKFJFRykgJj0gfihCSVQpKQ0KDQojZGVmaW5lIFJFQURfQklUKFJFRywgQklUKSAgICAoKFJFRykgJiAoQklUKSkNCg0KI2RlZmluZSBDTEVBUl9SRUcoUkVHKSAgICAgICAgKChSRUcpID0gKDB4MCkpDQoNCiNkZWZpbmUgV1JJVEVfUkVHKFJFRywgVkFMKSAgICgoUkVHKSA9IChWQUwpKQ0KDQojZGVmaW5lIFJFQURfUkVHKFJFRykgICAgICAgICAoKFJFRykpDQoNCiNkZWZpbmUgTU9ESUZZX1JFRyhSRUcsIENMRUFSTUFTSywgU0VUTUFTSykgIFdSSVRFX1JFRygoUkVHKSwgKCgoUkVBRF9SRUcoUkVHKSkgJiAofihDTEVBUk1BU0spKSkgfCAoU0VUTUFTSykpKQ0KDQojZGVmaW5lIFBPU0lUSU9OX1ZBTChWQUwpICAgICAoX19DTFooX19SQklUKFZBTCkpKQ0KDQoNCi8qKg0KICAqIEB9DQogICovDQoNCiNpZiBkZWZpbmVkIChVU0VfSEFMX0RSSVZFUikNCiAjaW5jbHVkZSAic3RtMzJoN3h4X2hhbC5oIg0KI2VuZGlmIC8qIFVTRV9IQUxfRFJJVkVSICovDQoNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9DQojZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCg0KI2VuZGlmIC8qIFNUTTMySDd4eF9IICovDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQoNCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K