LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHguaAogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIENNU0lTIFNUTTMyRjR4eCBEZXZpY2UgUGVyaXBoZXJhbCBBY2Nlc3MgTGF5ZXIgSGVhZGVyIEZpbGUuCiAgKiAgICAgICAgICAgIAogICogICAgICAgICAgVGhlIGZpbGUgaXMgdGhlIHVuaXF1ZSBpbmNsdWRlIGZpbGUgdGhhdCB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lcgogICogICAgICAgICAgaXMgdXNpbmcgaW4gdGhlIEMgc291cmNlIGNvZGUsIHVzdWFsbHkgaW4gbWFpbi5jLiBUaGlzIGZpbGUgY29udGFpbnM6CiAgKiAgICAgICAgICAgLSBDb25maWd1cmF0aW9uIHNlY3Rpb24gdGhhdCBhbGxvd3MgdG8gc2VsZWN0OgogICogICAgICAgICAgICAgIC0gVGhlIFNUTTMyRjR4eCBkZXZpY2UgdXNlZCBpbiB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCiAgKiAgICAgICAgICAgICAgLSBUbyB1c2Ugb3Igbm90IHRoZSBwZXJpcGhlcmFsknMgZHJpdmVycyBpbiBhcHBsaWNhdGlvbiBjb2RlKGkuZS4gCiAgKiAgICAgICAgICAgICAgICBjb2RlIHdpbGwgYmUgYmFzZWQgb24gZGlyZWN0IGFjY2VzcyB0byBwZXJpcGhlcmFsknMgcmVnaXN0ZXJzIAogICogICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gZHJpdmVycyBBUEkpLCB0aGlzIG9wdGlvbiBpcyBjb250cm9sbGVkIGJ5IAogICogICAgICAgICAgICAgICAgIiNkZWZpbmUgVVNFX0hBTF9EUklWRVIiCiAgKiAgCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAYXR0ZW50aW9uCiAgKgogICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyoqIEBhZGR0b2dyb3VwIENNU0lTCiAgKiBAewogICovCgovKiogQGFkZHRvZ3JvdXAgc3RtMzJmNHh4CiAgKiBAewogICovCiAgICAKI2lmbmRlZiBfX1NUTTMyRjR4eF9ICiNkZWZpbmUgX19TVE0zMkY0eHhfSAoKI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAgIAovKiogQGFkZHRvZ3JvdXAgTGlicmFyeV9jb25maWd1cmF0aW9uX3NlY3Rpb24KICAqIEB7CiAgKi8KICAKLyoqCiAgKiBAYnJpZWYgU1RNMzIgRmFtaWx5CiAgKi8KI2lmICFkZWZpbmVkICAoU1RNMzJGNCkKI2RlZmluZSBTVE0zMkY0CiNlbmRpZiAvKiBTVE0zMkY0ICovCgovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgYWNjb3JkaW5nIHRvIHRoZSB0YXJnZXQgU1RNMzIgZGV2aWNlIHVzZWQgaW4geW91cgogICBhcHBsaWNhdGlvbiAKICAqLwojaWYgIWRlZmluZWQgKFNUTTMyRjQwNXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJGNDE1eHgpICYmICFkZWZpbmVkIChTVE0zMkY0MDd4eCkgJiYgIWRlZmluZWQgKFNUTTMyRjQxN3h4KSAmJiBcCiAgICAhZGVmaW5lZCAoU1RNMzJGNDI3eHgpICYmICFkZWZpbmVkIChTVE0zMkY0Mzd4eCkgJiYgIWRlZmluZWQgKFNUTTMyRjQyOXh4KSAmJiAhZGVmaW5lZCAoU1RNMzJGNDM5eHgpICYmIFwKICAgICFkZWZpbmVkIChTVE0zMkY0MDF4QykgJiYgIWRlZmluZWQgKFNUTTMyRjQwMXhFKSAmJiAhZGVmaW5lZCAoU1RNMzJGNDEwVHgpICYmICFkZWZpbmVkIChTVE0zMkY0MTBDeCkgJiYgXAogICAgIWRlZmluZWQgKFNUTTMyRjQxMFJ4KSAmJiAhZGVmaW5lZCAoU1RNMzJGNDExeEUpICYmICFkZWZpbmVkIChTVE0zMkY0NDZ4eCkgJiYgIWRlZmluZWQgKFNUTTMyRjQ2OXh4KSAmJiBcCiAgICAhZGVmaW5lZCAoU1RNMzJGNDc5eHgpICYmICFkZWZpbmVkIChTVE0zMkY0MTJDeCkgJiYgIWRlZmluZWQgKFNUTTMyRjQxMlJ4KSAmJiAhZGVmaW5lZCAoU1RNMzJGNDEyVngpICYmIFwKICAgICFkZWZpbmVkIChTVE0zMkY0MTJaeCkgJiYgIWRlZmluZWQgKFNUTTMyRjQxM3h4KSAmJiAhZGVmaW5lZCAoU1RNMzJGNDIzeHgpCiAgLyogI2RlZmluZSBTVE0zMkY0MDV4eCAqLyAgIC8qITwgU1RNMzJGNDA1UkcsIFNUTTMyRjQwNVZHIGFuZCBTVE0zMkY0MDVaRyBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkY0MTV4eCAqLyAgIC8qITwgU1RNMzJGNDE1UkcsIFNUTTMyRjQxNVZHIGFuZCBTVE0zMkY0MTVaRyBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkY0MDd4eCAqLyAgIC8qITwgU1RNMzJGNDA3VkcsIFNUTTMyRjQwN1ZFLCBTVE0zMkY0MDdaRywgU1RNMzJGNDA3WkUsIFNUTTMyRjQwN0lHICBhbmQgU1RNMzJGNDA3SUUgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDE3eHggKi8gICAvKiE8IFNUTTMyRjQxN1ZHLCBTVE0zMkY0MTdWRSwgU1RNMzJGNDE3WkcsIFNUTTMyRjQxN1pFLCBTVE0zMkY0MTdJRyBhbmQgU1RNMzJGNDE3SUUgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDI3eHggKi8gICAvKiE8IFNUTTMyRjQyN1ZHLCBTVE0zMkY0MjdWSSwgU1RNMzJGNDI3WkcsIFNUTTMyRjQyN1pJLCBTVE0zMkY0MjdJRyBhbmQgU1RNMzJGNDI3SUkgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDM3eHggKi8gICAvKiE8IFNUTTMyRjQzN1ZHLCBTVE0zMkY0MzdWSSwgU1RNMzJGNDM3WkcsIFNUTTMyRjQzN1pJLCBTVE0zMkY0MzdJRyBhbmQgU1RNMzJGNDM3SUkgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDI5eHggKi8gICAvKiE8IFNUTTMyRjQyOVZHLCBTVE0zMkY0MjlWSSwgU1RNMzJGNDI5WkcsIFNUTTMyRjQyOVpJLCBTVE0zMkY0MjlCRywgU1RNMzJGNDI5QkksIFNUTTMyRjQyOU5HLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE0zMkY0MzlOSSwgU1RNMzJGNDI5SUcgIGFuZCBTVE0zMkY0MjlJSSBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkY0Mzl4eCAqLyAgIC8qITwgU1RNMzJGNDM5VkcsIFNUTTMyRjQzOVZJLCBTVE0zMkY0MzlaRywgU1RNMzJGNDM5WkksIFNUTTMyRjQzOUJHLCBTVE0zMkY0MzlCSSwgU1RNMzJGNDM5TkcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUTTMyRjQzOU5JLCBTVE0zMkY0MzlJRyBhbmQgU1RNMzJGNDM5SUkgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDAxeEMgKi8gICAvKiE8IFNUTTMyRjQwMUNCLCBTVE0zMkY0MDFDQywgU1RNMzJGNDAxUkIsIFNUTTMyRjQwMVJDLCBTVE0zMkY0MDFWQiBhbmQgU1RNMzJGNDAxVkMgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDAxeEUgKi8gICAvKiE8IFNUTTMyRjQwMUNELCBTVE0zMkY0MDFSRCwgU1RNMzJGNDAxVkQsIFNUTTMyRjQwMUNFLCBTVE0zMkY0MDFSRSBhbmQgU1RNMzJGNDAxVkUgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDEwVHggKi8gICAvKiE8IFNUTTMyRjQxMFQ4IGFuZCBTVE0zMkY0MTBUQiBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkY0MTBDeCAqLyAgIC8qITwgU1RNMzJGNDEwQzggYW5kIFNUTTMyRjQxMENCIERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyRjQxMFJ4ICovICAgLyohPCBTVE0zMkY0MTBSOCBhbmQgU1RNMzJGNDEwUkIgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDExeEUgKi8gICAvKiE8IFNUTTMyRjQxMUNDLCBTVE0zMkY0MTFSQywgU1RNMzJGNDExVkMsIFNUTTMyRjQxMUNFLCBTVE0zMkY0MTFSRSBhbmQgU1RNMzJGNDExVkUgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDQ2eHggKi8gICAvKiE8IFNUTTMyRjQ0Nk1DLCBTVE0zMkY0NDZNRSwgU1RNMzJGNDQ2UkMsIFNUTTMyRjQ0NlJFLCBTVE0zMkY0NDZWQywgU1RNMzJGNDQ2VkUsIFNUTTMyRjQ0NlpDLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgU1RNMzJGNDQ2WkUgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDY5eHggKi8gICAvKiE8IFNUTTMyRjQ2OUFJLCBTVE0zMkY0NjlJSSwgU1RNMzJGNDY5QkksIFNUTTMyRjQ2OU5JLCBTVE0zMkY0NjlBRywgU1RNMzJGNDY5SUcsIFNUTTMyRjQ2OUJHLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE0zMkY0NjlORywgU1RNMzJGNDY5QUUsIFNUTTMyRjQ2OUlFLCBTVE0zMkY0NjlCRSBhbmQgU1RNMzJGNDY5TkUgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDc5eHggKi8gICAvKiE8IFNUTTMyRjQ3OUFJLCBTVE0zMkY0NzlJSSwgU1RNMzJGNDc5QkksIFNUTTMyRjQ3OU5JLCBTVE0zMkY0NzlBRywgU1RNMzJGNDc5SUcsIFNUTTMyRjQ3OUJHIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBTVE0zMkY0NzlORyBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkY0MTJDeCAqLyAgIC8qITwgU1RNMzJGNDEyQ0VVIGFuZCBTVE0zMkY0MTJDR1UgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDEyWnggKi8gICAvKiE8IFNUTTMyRjQxMlpFVCwgU1RNMzJGNDEyWkdULCBTVE0zMkY0MTJaRUogYW5kIFNUTTMyRjQxMlpHSiBEZXZpY2VzICovCiAgLyogI2RlZmluZSBTVE0zMkY0MTJWeCAqLyAgIC8qITwgU1RNMzJGNDEyVkVULCBTVE0zMkY0MTJWR1QsIFNUTTMyRjQxMlZFSCBhbmQgU1RNMzJGNDEyVkdIIERldmljZXMgKi8KICAvKiAjZGVmaW5lIFNUTTMyRjQxMlJ4ICovICAgLyohPCBTVE0zMkY0MTJSRVQsIFNUTTMyRjQxMlJHVCwgU1RNMzJGNDEyUkVZIGFuZCBTVE0zMkY0MTJSR1kgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDEzeHggKi8gICAvKiE8IFNUTTMyRjQxM0NILCBTVE0zMkY0MTNNSCwgU1RNMzJGNDEzUkgsIFNUTTMyRjQxM1ZILCBTVE0zMkY0MTNaSCwgU1RNMzJGNDEzQ0csIFNUTTMyRjQxM01HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUTTMyRjQxM1JHLCBTVE0zMkY0MTNWRyBhbmQgU1RNMzJGNDEzWkcgRGV2aWNlcyAqLwogIC8qICNkZWZpbmUgU1RNMzJGNDIzeHggKi8gICAvKiE8IFNUTTMyRjQyM0NILCBTVE0zMkY0MjNSSCwgU1RNMzJGNDIzVkggYW5kIFNUTTMyRjQyM1pIIERldmljZXMgKi8KI2VuZGlmCiAgIAovKiAgVGlwOiBUbyBhdm9pZCBtb2RpZnlpbmcgdGhpcyBmaWxlIGVhY2ggdGltZSB5b3UgbmVlZCB0byBzd2l0Y2ggYmV0d2VlbiB0aGVzZQogICAgICAgIGRldmljZXMsIHlvdSBjYW4gZGVmaW5lIHRoZSBkZXZpY2UgaW4geW91ciB0b29sY2hhaW4gY29tcGlsZXIgcHJlcHJvY2Vzc29yLgogICovCiNpZiAhZGVmaW5lZCAgKFVTRV9IQUxfRFJJVkVSKQovKioKICogQGJyaWVmIENvbW1lbnQgdGhlIGxpbmUgYmVsb3cgaWYgeW91IHdpbGwgbm90IHVzZSB0aGUgcGVyaXBoZXJhbHMgZHJpdmVycy4KICAgSW4gdGhpcyBjYXNlLCB0aGVzZSBkcml2ZXJzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGFuZCB0aGUgYXBwbGljYXRpb24gY29kZSB3aWxsIAogICBiZSBiYXNlZCBvbiBkaXJlY3QgYWNjZXNzIHRvIHBlcmlwaGVyYWxzIHJlZ2lzdGVycyAKICAgKi8KICAvKiNkZWZpbmUgVVNFX0hBTF9EUklWRVIgKi8KI2VuZGlmIC8qIFVTRV9IQUxfRFJJVkVSICovCgovKioKICAqIEBicmllZiBDTVNJUyB2ZXJzaW9uIG51bWJlciBWMi42LjcKICAqLwojZGVmaW5lIF9fU1RNMzJGNHh4X0NNU0lTX1ZFUlNJT05fTUFJTiAgICgweDAyVSkgLyohPCBbMzE6MjRdIG1haW4gdmVyc2lvbiAqLwojZGVmaW5lIF9fU1RNMzJGNHh4X0NNU0lTX1ZFUlNJT05fU1VCMSAgICgweDA2VSkgLyohPCBbMjM6MTZdIHN1YjEgdmVyc2lvbiAqLwojZGVmaW5lIF9fU1RNMzJGNHh4X0NNU0lTX1ZFUlNJT05fU1VCMiAgICgweDA3VSkgLyohPCBbMTU6OF0gIHN1YjIgdmVyc2lvbiAqLwojZGVmaW5lIF9fU1RNMzJGNHh4X0NNU0lTX1ZFUlNJT05fUkMgICAgICgweDAwVSkgLyohPCBbNzowXSAgcmVsZWFzZSBjYW5kaWRhdGUgKi8KI2RlZmluZSBfX1NUTTMyRjR4eF9DTVNJU19WRVJTSU9OICAgICAgICAoKF9fU1RNMzJGNHh4X0NNU0lTX1ZFUlNJT05fTUFJTiA8PCAyNClcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyRjR4eF9DTVNJU19WRVJTSU9OX1NVQjEgPDwgMTYpXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoX19TVE0zMkY0eHhfQ01TSVNfVkVSU0lPTl9TVUIyIDw8IDggKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJGNHh4X0NNU0lTX1ZFUlNJT05fUkMpKQoKLyoqCiAgKiBAfQogICovCgovKiogQGFkZHRvZ3JvdXAgRGV2aWNlX0luY2x1ZGVkCiAgKiBAewogICovCgojaWYgZGVmaW5lZChTVE0zMkY0MDV4eCkKICAjaW5jbHVkZSAic3RtMzJmNDA1eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTV4eCkKICAjaW5jbHVkZSAic3RtMzJmNDE1eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MDd4eCkKICAjaW5jbHVkZSAic3RtMzJmNDA3eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTd4eCkKICAjaW5jbHVkZSAic3RtMzJmNDE3eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0Mjd4eCkKICAjaW5jbHVkZSAic3RtMzJmNDI3eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0Mzd4eCkKICAjaW5jbHVkZSAic3RtMzJmNDM3eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0Mjl4eCkKICAjaW5jbHVkZSAic3RtMzJmNDI5eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0Mzl4eCkKICAjaW5jbHVkZSAic3RtMzJmNDM5eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MDF4QykKICAjaW5jbHVkZSAic3RtMzJmNDAxeGMuaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MDF4RSkKICAjaW5jbHVkZSAic3RtMzJmNDAxeGUuaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTBUeCkKICAjaW5jbHVkZSAic3RtMzJmNDEwdHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTBDeCkKICAjaW5jbHVkZSAic3RtMzJmNDEwY3guaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTBSeCkKICAjaW5jbHVkZSAic3RtMzJmNDEwcnguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTF4RSkKICAjaW5jbHVkZSAic3RtMzJmNDExeGUuaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0NDZ4eCkKICAjaW5jbHVkZSAic3RtMzJmNDQ2eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0Njl4eCkKICAjaW5jbHVkZSAic3RtMzJmNDY5eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0Nzl4eCkKICAjaW5jbHVkZSAic3RtMzJmNDc5eHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTJDeCkKICAjaW5jbHVkZSAic3RtMzJmNDEyY3guaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTJaeCkKICAjaW5jbHVkZSAic3RtMzJmNDEyenguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTJSeCkKICAjaW5jbHVkZSAic3RtMzJmNDEycnguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTJWeCkKICAjaW5jbHVkZSAic3RtMzJmNDEydnguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MTN4eCkKICAjaW5jbHVkZSAic3RtMzJmNDEzeHguaCIKI2VsaWYgZGVmaW5lZChTVE0zMkY0MjN4eCkKICAjaW5jbHVkZSAic3RtMzJmNDIzeHguaCIKI2Vsc2UKICNlcnJvciAiUGxlYXNlIHNlbGVjdCBmaXJzdCB0aGUgdGFyZ2V0IFNUTTMyRjR4eCBkZXZpY2UgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uIChpbiBzdG0zMmY0eHguaCBmaWxlKSIKI2VuZGlmCgovKioKICAqIEB9CiAgKi8KCi8qKiBAYWRkdG9ncm91cCBFeHBvcnRlZF90eXBlcwogICogQHsKICAqLyAKdHlwZWRlZiBlbnVtIAp7CiAgUkVTRVQgPSAwVSwgCiAgU0VUID0gIVJFU0VUCn0gRmxhZ1N0YXR1cywgSVRTdGF0dXM7Cgp0eXBlZGVmIGVudW0gCnsKICBESVNBQkxFID0gMFUsIAogIEVOQUJMRSA9ICFESVNBQkxFCn0gRnVuY3Rpb25hbFN0YXRlOwojZGVmaW5lIElTX0ZVTkNUSU9OQUxfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBESVNBQkxFKSB8fCAoKFNUQVRFKSA9PSBFTkFCTEUpKQoKdHlwZWRlZiBlbnVtCnsKICBTVUNDRVNTID0gMFUsCiAgRVJST1IgPSAhU1VDQ0VTUwp9IEVycm9yU3RhdHVzOwoKLyoqCiAgKiBAfQogICovCgoKLyoqIEBhZGR0b2dyb3VwIEV4cG9ydGVkX21hY3JvCiAgKiBAewogICovCiNkZWZpbmUgU0VUX0JJVChSRUcsIEJJVCkgICAgICgoUkVHKSB8PSAoQklUKSkKCiNkZWZpbmUgQ0xFQVJfQklUKFJFRywgQklUKSAgICgoUkVHKSAmPSB+KEJJVCkpCgojZGVmaW5lIFJFQURfQklUKFJFRywgQklUKSAgICAoKFJFRykgJiAoQklUKSkKCiNkZWZpbmUgQ0xFQVJfUkVHKFJFRykgICAgICAgICgoUkVHKSA9ICgweDApKQoKI2RlZmluZSBXUklURV9SRUcoUkVHLCBWQUwpICAgKChSRUcpID0gKFZBTCkpCgojZGVmaW5lIFJFQURfUkVHKFJFRykgICAgICAgICAoKFJFRykpCgojZGVmaW5lIE1PRElGWV9SRUcoUkVHLCBDTEVBUk1BU0ssIFNFVE1BU0spICBXUklURV9SRUcoKFJFRyksICgoKFJFQURfUkVHKFJFRykpICYgKH4oQ0xFQVJNQVNLKSkpIHwgKFNFVE1BU0spKSkKCiNkZWZpbmUgUE9TSVRJT05fVkFMKFZBTCkgICAgIChfX0NMWihfX1JCSVQoVkFMKSkpIAoKLyogVXNlIG9mIENNU0lTIGNvbXBpbGVyIGludHJpbnNpY3MgZm9yIHJlZ2lzdGVyIGV4Y2x1c2l2ZSBhY2Nlc3MgKi8KLyogQXRvbWljIDMyLWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gc2V0IG9uZSBvciBzZXZlcmFsIGJpdHMgKi8KI2RlZmluZSBBVE9NSUNfU0VUX0JJVChSRUcsIEJJVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHVpbnQzMl90IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgdmFsID0gX19MRFJFWFcoKF9fSU8gdWludDMyX3QgKikmKFJFRykpIHwgKEJJVCk7ICAgICAgIFwKICAgIH0gd2hpbGUgKChfX1NUUkVYVyh2YWwsKF9fSU8gdWludDMyX3QgKikmKFJFRykpKSAhPSAwVSk7IFwKICB9IHdoaWxlKDApCgovKiBBdG9taWMgMzItYml0IHJlZ2lzdGVyIGFjY2VzcyBtYWNybyB0byBjbGVhciBvbmUgb3Igc2V2ZXJhbCBiaXRzICovCiNkZWZpbmUgQVRPTUlDX0NMRUFSX0JJVChSRUcsIEJJVCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB1aW50MzJfdCB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHZhbCA9IF9fTERSRVhXKChfX0lPIHVpbnQzMl90ICopJihSRUcpKSAmIH4oQklUKTsgICAgICBcCiAgICB9IHdoaWxlICgoX19TVFJFWFcodmFsLChfX0lPIHVpbnQzMl90ICopJihSRUcpKSkgIT0gMFUpOyBcCiAgfSB3aGlsZSgwKQoKLyogQXRvbWljIDMyLWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gY2xlYXIgYW5kIHNldCBvbmUgb3Igc2V2ZXJhbCBiaXRzICovCiNkZWZpbmUgQVRPTUlDX01PRElGWV9SRUcoUkVHLCBDTEVBUk1TSywgU0VUTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgdWludDMyX3QgdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgdmFsID0gKF9fTERSRVhXKChfX0lPIHVpbnQzMl90ICopJihSRUcpKSAmIH4oQ0xFQVJNU0spKSB8IChTRVRNQVNLKTsgXAogICAgfSB3aGlsZSAoKF9fU1RSRVhXKHZhbCwoX19JTyB1aW50MzJfdCAqKSYoUkVHKSkpICE9IDBVKTsgICAgICAgICAgICAgICBcCiAgfSB3aGlsZSgwKQoKLyogQXRvbWljIDE2LWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gc2V0IG9uZSBvciBzZXZlcmFsIGJpdHMgKi8KI2RlZmluZSBBVE9NSUNfU0VUSF9CSVQoUkVHLCBCSVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHVpbnQxNl90IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgdmFsID0gX19MRFJFWEgoKF9fSU8gdWludDE2X3QgKikmKFJFRykpIHwgKEJJVCk7ICAgICAgIFwKICAgIH0gd2hpbGUgKChfX1NUUkVYSCh2YWwsKF9fSU8gdWludDE2X3QgKikmKFJFRykpKSAhPSAwVSk7IFwKICB9IHdoaWxlKDApCgovKiBBdG9taWMgMTYtYml0IHJlZ2lzdGVyIGFjY2VzcyBtYWNybyB0byBjbGVhciBvbmUgb3Igc2V2ZXJhbCBiaXRzICovCiNkZWZpbmUgQVRPTUlDX0NMRUFSSF9CSVQoUkVHLCBCSVQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB1aW50MTZfdCB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHZhbCA9IF9fTERSRVhIKChfX0lPIHVpbnQxNl90ICopJihSRUcpKSAmIH4oQklUKTsgICAgICBcCiAgICB9IHdoaWxlICgoX19TVFJFWEgodmFsLChfX0lPIHVpbnQxNl90ICopJihSRUcpKSkgIT0gMFUpOyBcCiAgfSB3aGlsZSgwKQoKLyogQXRvbWljIDE2LWJpdCByZWdpc3RlciBhY2Nlc3MgbWFjcm8gdG8gY2xlYXIgYW5kIHNldCBvbmUgb3Igc2V2ZXJhbCBiaXRzICovCiNkZWZpbmUgQVRPTUlDX01PRElGWUhfUkVHKFJFRywgQ0xFQVJNU0ssIFNFVE1BU0spICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgdWludDE2X3QgdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgdmFsID0gKF9fTERSRVhIKChfX0lPIHVpbnQxNl90ICopJihSRUcpKSAmIH4oQ0xFQVJNU0spKSB8IChTRVRNQVNLKTsgXAogICAgfSB3aGlsZSAoKF9fU1RSRVhIKHZhbCwoX19JTyB1aW50MTZfdCAqKSYoUkVHKSkpICE9IDBVKTsgICAgICAgICAgICAgICBcCiAgfSB3aGlsZSgwKQoKLyoqCiAgKiBAfQogICovCgojaWYgZGVmaW5lZCAoVVNFX0hBTF9EUklWRVIpCiAjaW5jbHVkZSAic3RtMzJmNHh4X2hhbC5oIgojZW5kaWYgLyogVVNFX0hBTF9EUklWRVIgKi8KCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwoKI2VuZGlmIC8qIF9fU1RNMzJGNHh4X0ggKi8KLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KICAKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K