LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmw0eHguaAogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIENNU0lTIFNUTTMyTDR4eCBEZXZpY2UgUGVyaXBoZXJhbCBBY2Nlc3MgTGF5ZXIgSGVhZGVyIEZpbGUuCiAgKgogICogICAgICAgICAgVGhlIGZpbGUgaXMgdGhlIHVuaXF1ZSBpbmNsdWRlIGZpbGUgdGhhdCB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lcgogICogICAgICAgICAgaXMgdXNpbmcgaW4gdGhlIEMgc291cmNlIGNvZGUsIHVzdWFsbHkgaW4gbWFpbi5jLiBUaGlzIGZpbGUgY29udGFpbnM6CiAgKiAgICAgICAgICAgLSBDb25maWd1cmF0aW9uIHNlY3Rpb24gdGhhdCBhbGxvd3MgdG8gc2VsZWN0OgogICogICAgICAgICAgICAgIC0gVGhlIFNUTTMyTDR4eCBkZXZpY2UgdXNlZCBpbiB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCiAgKiAgICAgICAgICAgICAgLSBUbyB1c2Ugb3Igbm90IHRoZSBwZXJpcGhlcmFsknMgZHJpdmVycyBpbiBhcHBsaWNhdGlvbiBjb2RlKGkuZS4KICAqICAgICAgICAgICAgICAgIGNvZGUgd2lsbCBiZSBiYXNlZCBvbiBkaXJlY3QgYWNjZXNzIHRvIHBlcmlwaGVyYWyScyByZWdpc3RlcnMKICAqICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGRyaXZlcnMgQVBJKSwgdGhpcyBvcHRpb24gaXMgY29udHJvbGxlZCBieQogICogICAgICAgICAgICAgICAgIiNkZWZpbmUgVVNFX0hBTF9EUklWRVIiCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICoKICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAogICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KCi8qKiBAYWRkdG9ncm91cCBDTVNJUwogICogQHsKICAqLwoKLyoqIEBhZGR0b2dyb3VwIHN0bTMybDR4eAogICogQHsKICAqLwoKI2lmbmRlZiBfX1NUTTMyTDR4eF9ICiNkZWZpbmUgX19TVE0zMkw0eHhfSAoKI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCgovKiogQGFkZHRvZ3JvdXAgTGlicmFyeV9jb25maWd1cmF0aW9uX3NlY3Rpb24KICAqIEB7CiAgKi8KCi8qKgogICogQGJyaWVmIFNUTTMyIEZhbWlseQogICovCiNpZiAhZGVmaW5lZCAoU1RNMzJMNCkKI2RlZmluZSBTVE0zMkw0CiNlbmRpZiAvKiBTVE0zMkw0ICovCgovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgYWNjb3JkaW5nIHRvIHRoZSB0YXJnZXQgU1RNMzJMNCBkZXZpY2UgdXNlZCBpbiB5b3VyCiAgIGFwcGxpY2F0aW9uCiAgKi8KCiNpZiAhZGVmaW5lZCAoU1RNMzJMNDEyeHgpICYmICFkZWZpbmVkIChTVE0zMkw0MjJ4eCkgJiYgXAogICAgIWRlZmluZWQgKFNUTTMyTDQzMXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNDMyeHgpICYmICFkZWZpbmVkIChTVE0zMkw0MzN4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDQ0Mnh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNDQzeHgpICYmIFwKICAgICFkZWZpbmVkIChTVE0zMkw0NTF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDQ1Mnh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNDYyeHgpICYmIFwKICAgICFkZWZpbmVkIChTVE0zMkw0NzF4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDQ3NXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNDc2eHgpICYmICFkZWZpbmVkIChTVE0zMkw0ODV4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDQ4Nnh4KSAmJiBcCiAgICAhZGVmaW5lZCAoU1RNMzJMNDk2eHgpICYmICFkZWZpbmVkIChTVE0zMkw0QTZ4eCkgJiYgXAogICAgIWRlZmluZWQgKFNUTTMyTDRQNXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNFE1eHgpICYmIFwKICAgICFkZWZpbmVkIChTVE0zMkw0UjV4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDRSN3h4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNFI5eHgpICYmICFkZWZpbmVkIChTVE0zMkw0UzV4eCkgJiYgIWRlZmluZWQgKFNUTTMyTDRTN3h4KSAmJiAhZGVmaW5lZCAoU1RNMzJMNFM5eHgpCiAgLyogI2RlZmluZSBTVE0zMkw0MTJ4eCAqLyAgIC8qITwgU1RNMzJMNDEyeHggRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJMNDIyeHggKi8gICAvKiE8IFNUTTMyTDQyMnh4IERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyTDQzMXh4ICovICAgLyohPCBTVE0zMkw0MzF4eCBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkw0MzJ4eCAqLyAgIC8qITwgU1RNMzJMNDMyeHggRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJMNDMzeHggKi8gICAvKiE8IFNUTTMyTDQzM3h4IERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyTDQ0Mnh4ICovICAgLyohPCBTVE0zMkw0NDJ4eCBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkw0NDN4eCAqLyAgIC8qITwgU1RNMzJMNDQzeHggRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJMNDUxeHggKi8gICAvKiE8IFNUTTMyTDQ1MXh4IERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyTDQ1Mnh4ICovICAgLyohPCBTVE0zMkw0NTJ4eCBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkw0NjJ4eCAqLyAgIC8qITwgU1RNMzJMNDYyeHggRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJMNDcxeHggKi8gICAvKiE8IFNUTTMyTDQ3MXh4IERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyTDQ3NXh4ICovICAgLyohPCBTVE0zMkw0NzV4eCBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkw0NzZ4eCAqLyAgIC8qITwgU1RNMzJMNDc2eHggRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJMNDg1eHggKi8gICAvKiE8IFNUTTMyTDQ4NXh4IERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyTDQ4Nnh4ICovICAgLyohPCBTVE0zMkw0ODZ4eCBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkw0OTZ4eCAqLyAgIC8qITwgU1RNMzJMNDk2eHggRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJMNEE2eHggKi8gICAvKiE8IFNUTTMyTDRBNnh4IERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyTDRQNXh4ICovICAgLyohPCBTVE0zMkw0UTV4eCBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkw0UjV4eCAqLyAgIC8qITwgU1RNMzJMNFI1eHggRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJMNFI3eHggKi8gICAvKiE8IFNUTTMyTDRSN3h4IERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyTDRSOXh4ICovICAgLyohPCBTVE0zMkw0Ujl4eCBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkw0UzV4eCAqLyAgIC8qITwgU1RNMzJMNFM1eHggRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJMNFM3eHggKi8gICAvKiE8IFNUTTMyTDRTN3h4IERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyTDRTOXh4ICovICAgLyohPCBTVE0zMkw0Uzl4eCBEZXZpY2VzICovCiNlbmRpZgoKLyogIFRpcDogVG8gYXZvaWQgbW9kaWZ5aW5nIHRoaXMgZmlsZSBlYWNoIHRpbWUgeW91IG5lZWQgdG8gc3dpdGNoIGJldHdlZW4gdGhlc2UKICAgICAgICBkZXZpY2VzLCB5b3UgY2FuIGRlZmluZSB0aGUgZGV2aWNlIGluIHlvdXIgdG9vbGNoYWluIGNvbXBpbGVyIHByZXByb2Nlc3Nvci4KICAqLwojaWYgIWRlZmluZWQgIChVU0VfSEFMX0RSSVZFUikKLyoqCiAqIEBicmllZiBDb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3aWxsIG5vdCB1c2UgdGhlIHBlcmlwaGVyYWxzIGRyaXZlcnMuCiAgIEluIHRoaXMgY2FzZSwgdGhlc2UgZHJpdmVycyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIGNvZGUgd2lsbAogICBiZSBiYXNlZCBvbiBkaXJlY3QgYWNjZXNzIHRvIHBlcmlwaGVyYWxzIHJlZ2lzdGVycwogICAqLwogIC8qI2RlZmluZSBVU0VfSEFMX0RSSVZFUiAqLwojZW5kaWYgLyogVVNFX0hBTF9EUklWRVIgKi8KCi8qKgogICogQGJyaWVmIENNU0lTIERldmljZSB2ZXJzaW9uIG51bWJlcgogICovCiNkZWZpbmUgX19TVE0zMkw0X0NNU0lTX1ZFUlNJT05fTUFJTiAgICgweDAxKSAvKiE8IFszMToyNF0gbWFpbiB2ZXJzaW9uICovCiNkZWZpbmUgX19TVE0zMkw0X0NNU0lTX1ZFUlNJT05fU1VCMSAgICgweDA2KSAvKiE8IFsyMzoxNl0gc3ViMSB2ZXJzaW9uICovCiNkZWZpbmUgX19TVE0zMkw0X0NNU0lTX1ZFUlNJT05fU1VCMiAgICgweDAwKSAvKiE8IFsxNTo4XSAgc3ViMiB2ZXJzaW9uICovCiNkZWZpbmUgX19TVE0zMkw0X0NNU0lTX1ZFUlNJT05fUkMgICAgICgweDAwKSAvKiE8IFs3OjBdICByZWxlYXNlIGNhbmRpZGF0ZSAqLwojZGVmaW5lIF9fU1RNMzJMNF9DTVNJU19WRVJTSU9OICAgICAgICAoKF9fU1RNMzJMNF9DTVNJU19WRVJTSU9OX01BSU4gPDwgMjQpXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJMNF9DTVNJU19WRVJTSU9OX1NVQjEgPDwgMTYpXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJMNF9DTVNJU19WRVJTSU9OX1NVQjIgPDwgOCApXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJMNF9DTVNJU19WRVJTSU9OX1JDKSkKCi8qKgogICogQH0KICAqLwoKLyoqIEBhZGR0b2dyb3VwIERldmljZV9JbmNsdWRlZAogICogQHsKICAqLwoKI2lmIGRlZmluZWQoU1RNMzJMNDEyeHgpCiAgI2luY2x1ZGUgInN0bTMybDQxMnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDIyeHgpCiAgI2luY2x1ZGUgInN0bTMybDQyMnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDMxeHgpCiAgI2luY2x1ZGUgInN0bTMybDQzMXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDMyeHgpCiAgI2luY2x1ZGUgInN0bTMybDQzMnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDMzeHgpCiAgI2luY2x1ZGUgInN0bTMybDQzM3h4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDQyeHgpCiAgI2luY2x1ZGUgInN0bTMybDQ0Mnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDQzeHgpCiAgI2luY2x1ZGUgInN0bTMybDQ0M3h4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDUxeHgpCiAgI2luY2x1ZGUgInN0bTMybDQ1MXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDUyeHgpCiAgI2luY2x1ZGUgInN0bTMybDQ1Mnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDYyeHgpCiAgI2luY2x1ZGUgInN0bTMybDQ2Mnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDcxeHgpCiAgI2luY2x1ZGUgInN0bTMybDQ3MXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDc1eHgpCiAgI2luY2x1ZGUgInN0bTMybDQ3NXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDc2eHgpCiAgI2luY2x1ZGUgInN0bTMybDQ3Nnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDg1eHgpCiAgI2luY2x1ZGUgInN0bTMybDQ4NXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDg2eHgpCiAgI2luY2x1ZGUgInN0bTMybDQ4Nnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNDk2eHgpCiAgI2luY2x1ZGUgInN0bTMybDQ5Nnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNEE2eHgpCiAgI2luY2x1ZGUgInN0bTMybDRhNnh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNFA1eHgpCiAgI2luY2x1ZGUgInN0bTMybDRwNXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNFE1eHgpCiAgI2luY2x1ZGUgInN0bTMybDRxNXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNFI1eHgpCiAgI2luY2x1ZGUgInN0bTMybDRyNXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNFI3eHgpCiAgI2luY2x1ZGUgInN0bTMybDRyN3h4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNFI5eHgpCiAgI2luY2x1ZGUgInN0bTMybDRyOXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNFM1eHgpCiAgI2luY2x1ZGUgInN0bTMybDRzNXh4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNFM3eHgpCiAgI2luY2x1ZGUgInN0bTMybDRzN3h4LmgiCiNlbGlmIGRlZmluZWQoU1RNMzJMNFM5eHgpCiAgI2luY2x1ZGUgInN0bTMybDRzOXh4LmgiCiNlbHNlCiAjZXJyb3IgIlBsZWFzZSBzZWxlY3QgZmlyc3QgdGhlIHRhcmdldCBTVE0zMkw0eHggZGV2aWNlIHVzZWQgaW4geW91ciBhcHBsaWNhdGlvbiAoaW4gc3RtMzJsNHh4LmggZmlsZSkiCiNlbmRpZgoKLyoqCiAgKiBAfQogICovCgovKiogQGFkZHRvZ3JvdXAgRXhwb3J0ZWRfdHlwZXMKICAqIEB7CiAgKi8KdHlwZWRlZiBlbnVtCnsKICBSRVNFVCA9IDAsCiAgU0VUID0gIVJFU0VUCn0gRmxhZ1N0YXR1cywgSVRTdGF0dXM7Cgp0eXBlZGVmIGVudW0KewogIERJU0FCTEUgPSAwLAogIEVOQUJMRSA9ICFESVNBQkxFCn0gRnVuY3Rpb25hbFN0YXRlOwojZGVmaW5lIElTX0ZVTkNUSU9OQUxfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBESVNBQkxFKSB8fCAoKFNUQVRFKSA9PSBFTkFCTEUpKQoKdHlwZWRlZiBlbnVtCnsKICBTVUNDRVNTID0gMCwKICBFUlJPUiA9ICFTVUNDRVNTCn0gRXJyb3JTdGF0dXM7CgovKioKICAqIEB9CiAgKi8KCgovKiogQGFkZHRvZ3JvdXAgRXhwb3J0ZWRfbWFjcm9zCiAgKiBAewogICovCiNkZWZpbmUgU0VUX0JJVChSRUcsIEJJVCkgICAgICgoUkVHKSB8PSAoQklUKSkKCiNkZWZpbmUgQ0xFQVJfQklUKFJFRywgQklUKSAgICgoUkVHKSAmPSB+KEJJVCkpCgojZGVmaW5lIFJFQURfQklUKFJFRywgQklUKSAgICAoKFJFRykgJiAoQklUKSkKCiNkZWZpbmUgQ0xFQVJfUkVHKFJFRykgICAgICAgICgoUkVHKSA9ICgweDApKQoKI2RlZmluZSBXUklURV9SRUcoUkVHLCBWQUwpICAgKChSRUcpID0gKFZBTCkpCgojZGVmaW5lIFJFQURfUkVHKFJFRykgICAgICAgICAoKFJFRykpCgojZGVmaW5lIE1PRElGWV9SRUcoUkVHLCBDTEVBUk1BU0ssIFNFVE1BU0spICBXUklURV9SRUcoKFJFRyksICgoKFJFQURfUkVHKFJFRykpICYgKH4oQ0xFQVJNQVNLKSkpIHwgKFNFVE1BU0spKSkKCiNkZWZpbmUgUE9TSVRJT05fVkFMKFZBTCkgICAgIChfX0NMWihfX1JCSVQoVkFMKSkpCgoKLyoqCiAgKiBAfQogICovCgojaWYgZGVmaW5lZCAoVVNFX0hBTF9EUklWRVIpCiAjaW5jbHVkZSAic3RtMzJsNHh4X2hhbC5oIgojZW5kaWYgLyogVVNFX0hBTF9EUklWRVIgKi8KCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwoKI2VuZGlmIC8qIF9fU1RNMzJMNHh4X0ggKi8KLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCg==