LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIE5vdGU6CiAqICAgIElmIG5ldyBkZWZhdWx0X3N0b3JlIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUsCiAqICAgIHRoZW4gcmVtZW1iZXIgdG8gcnVuICdwZXJsL2RlZmF1bHRfc3RvcmUvZ2VuJyB0byB1cGRhdGUgdGhlCiAqICAgIGNvcnJlc3BvbmRpbmcgcGVybCBpbnRlcmZhY2UuCiAqLwovKgogKiBAZmlsZSBkZWZhdWx0X3N0b3JlLmg6IHN0b3JhZ2Ugc3BhY2UgZm9yIGRlZmF1bHRzCiAqCiAqIEBhZGR0b2dyb3VwIGRlZmF1bHRfc3RvcmUKICoKICogQHsKICovCiNpZm5kZWYgREVGQVVMVF9TVE9SRV9ICiNkZWZpbmUgREVGQVVMVF9TVE9SRV9ICgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKI2RlZmluZSBORVRTTk1QX0RTX01BWF9JRFMgMwojZGVmaW5lIE5FVFNOTVBfRFNfTUFYX1NVQklEUyA0MCAgICAgICAgLyogbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA4ICovCgogICAgLyoKICAgICAqIGJlZ2luIHN0b3JhZ2UgZGVmaW5pdGlvbnMgCiAgICAgKi8KLyoqCiAqIEBkZWYgTkVUU05NUF9EU19MSUJSQVJZX0lECiAqIFRoZXNlIGRlZmluaXRpb25zIGNvcnJlc3BvbmQgd2l0aCB0aGUgInN0b3JpZCIgYXJndW1lbnQgdG8gdGhlIEFQSSAKICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJSQVJZX0lEICAgICAwCiNkZWZpbmUgTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCAxCiNkZWZpbmUgTkVUU05NUF9EU19UT0tFTl9JRCAgICAgICAyCgogICAgLyoKICAgICAqIFRoZXNlIGRlZmluaXRpb25zIGNvcnJlc3BvbmQgd2l0aCB0aGUgIndoaWNoIiBhcmd1bWVudCB0byB0aGUgQVBJLAogICAgICogd2hlbiB0aGUgc3RvcmVpZCBhcmd1bWVudCBpcyBORVRTTk1QX0RTX0xJQlJBUllfSUQgCiAgICAgKi8KICAgIC8qCiAgICAgKiBsaWJyYXJ5IGJvb2xlYW5zIAogICAgICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfTUlCX0VSUk9SUyAgICAgICAgICAwCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTICAgICAxCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfTUlCX0NPTU1FTlRfVEVSTSAgICAyCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMICAgICAzCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfRFVNUF9QQUNLRVQgICAgICAgICA0CiNkZWZpbmUgTkVUU05NUF9EU19MSUJfTE9HX1RJTUVTVEFNUCAgICAgICA1CiNkZWZpbmUgTkVUU05NUF9EU19MSUJfRE9OVF9SRUFEX0NPTkZJR1MgICA2ICAgIC8qIGRvbid0IHJlYWQgbm9ybWFsIGNvbmZpZyBmaWxlcyAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0RJU0FCTEVfQ09ORklHX0xPQUQgICAgICBORVRTTk1QX0RTX0xJQl9ET05UX1JFQURfQ09ORklHUwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX01JQl9SRVBMQUNFICAgICAgICAgNyAgICAvKiByZXBsYWNlIG9iamVjdHMgZnJvbSBsYXRlc3QgbW9kdWxlICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNICA4ICAgIC8qIHByaW50IG9ubHkgbnVtZXJpYyBlbnVtIHZhbHVlcyAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfT0lEUyAgOSAgICAvKiBwcmludCBvbmx5IG51bWVyaWMgZW51bSB2YWx1ZXMgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTIDEwICAgLyogZG9udCBwcmludCBvaWQgaW5kZXhlcyBzcGVjaWFsbHkgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9BTEFSTV9ET05UX1VTRV9TSUcgIDExICAgLyogZG9uJ3QgdXNlIHRoZSBhbGFybSgpIHNpZ25hbCAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1BSSU5UX0ZVTExfT0lEICAgICAgMTIgICAvKiBwcmludCBmdWxseSBxdWFsaWZpZWQgb2lkcyAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UICAgICAgICAgMTMgICAvKiBwcmludCB2ZXJ5IGJyaWVmIG91dHB1dCBmb3IgcGFyc2luZyAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1JBTkRPTV9BQ0NFU1MJICAgMTQgICAvKiByYW5kb20gYWNjZXNzIHRvIG9pZCBsYWJlbHMgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9SRUdFWF9BQ0NFU1MJICAgMTUgICAvKiByZWdleCBtYXRjaGluZyB0byBvaWQgbGFiZWxzICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfRE9OVF9DSEVDS19SQU5HRSAgICAxNiAgIC8qIGRvbid0IGNoZWNrIHZhbHVlcyBmb3IgcmFuZ2VzIG9uIHNlbmQgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9OT19UT0tFTl9XQVJOSU5HUyAgIDE3ICAgLyogbm8gd2FybiBhYm91dCB1bmtub3duIGNvbmZpZyB0b2tlbnMgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUyAgIDE4ICAgLyogcHJpbnQgdGltZXRpY2tzIGFzIGEgbnVtYmVyICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUyAgICAgICAxOSAgIC8qIHNoZWxsIGVzY2FwZSBxdW90ZSBtYXJrcyBpbiBvaWRzICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfUkVWRVJTRV9FTkNPREUgICAgICAyMCAgIC8qIGVuY29kZSBwYWNrZXRzIGZyb20gYmFjayB0byBmcm9udCAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUJICAgMjEgICAvKiBqdXN0IHByaW50IHZhbHVlIChub3QgT0lEID0gdmFsdWUpICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfRVhURU5ERURfSU5ERVgJICAgMjIgICAvKiBwcmludCBleHRlbmRlZCBpbmRleCBmb3JtYXQgW3gxXVt4Ml0gKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCAgICAgIDIzICAgLyogcHJpbnQgQVNDSUkgdGV4dCBhbG9uZyB3aXRoIGhleCBzdHJpbmdzICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfUFJJTlRfVUNEX1NUWUxFX09JRCAyNCAgIC8qIHByaW50IE9JRCdzIHVzaW5nIHRoZSBVQ0Qtc3R5bGUgcHJlZml4IHN1cHByZXNzaW9uICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfUkVBRF9VQ0RfU1RZTEVfT0lEICAyNSAgIC8qIHJlcXVpcmUgdG9wLWxldmVsIE9JRHMgdG8gYmUgcHJlZml4ZWQgd2l0aCBhIGRvdCAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0hBVkVfUkVBRF9QUkVNSUJfQ09ORklHIDI2ICAgICAgIC8qIGhhdmUgdGhlIHByZS1taWIgcGFyc2luZyBjb25maWcgdG9rZW5zIGJlZW4gcHJvY2Vzc2VkICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfSEFWRV9SRUFEX0NPTkZJRyAgICAyNyAgIC8qIGhhdmUgdGhlIGNvbmZpZyB0b2tlbnMgYmVlbiBwcm9jZXNzZWQgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQgICAgICAgIDI4ICAgCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUyAgICAyOSAvKiBkb24ndCBwcmludCBVTklUUyBzdWZmaXggKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9OT19ESVNQTEFZX0hJTlQgICAgIDMwIC8qIGRvbid0IGFwcGx5IERJU1BMQVktSElOVHMgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl8xNkJJVF9JRFMgICAgICAgICAgIDMxICAgLyogcmVzdHJpY3QgcmVxdWVzdElEcywgZXRjIHRvIDE2LWJpdCB2YWx1ZXMgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9ET05UX1BFUlNJU1RfU1RBVEUgIDMyCS8qIGRvbid0IGxvYWQgY29uZmlnIGFuZCBkb24ndCBsb2FkL3NhdmUgcGVyc2lzdGVudCBmaWxlICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQgICAzMwkvKiBwcmludCBhIGxlYWRpbmcgMCBvbiBoZXggdmFsdWVzIDw9ICdmJyAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0lHTk9SRV9OT19DT01NVU5JVFkgMzQJLyogZG9uJ3QgY29tcGxhaW4gaWYgbm8gY29tbXVuaXR5IGlzIHNwZWNpZmllZCBpbiB0aGUgY29tbWFuZCBhcmd1bWVudHMgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9ESVNBQkxFX1BFUlNJU1RFTlRfTE9BRCAgMzUgLyogZG9uJ3QgbG9hZCBwZXJzaXN0ZW50IGZpbGUgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9ESVNBQkxFX1BFUlNJU1RFTlRfU0FWRSAgMzYgLyogZG9uJ3Qgc2F2ZSBwZXJzaXN0ZW50IGZpbGUgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9BUFBFTkRfTE9HRklMRVMgICAgIDM3IC8qIGFwcGVuZCwgZG9uJ3Qgb3ZlcndyaXRlLCBsb2cgZmlsZXMgKi8KCiAgICAvKgogICAgICogbGlicmFyeSBpbnRlZ2VycyAKICAgICAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUyAgMAojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1NFQ0xFVkVMICAgICAgMQojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1NOTVBWRVJTSU9OICAgMgojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0RFRkFVTFRfUE9SVCAgMwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUICA0CiNkZWZpbmUgTkVUU05NUF9EU19MSUJfUFJJTlRfU1VGRklYX09OTFkgIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQgNQojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0hFWF9PVVRQVVRfTEVOR1RIIDYKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9TRVJWRVJTRU5EQlVGICAgNyAvKiBzZW5kIGJ1ZmZlciAoc2VydmVyKSAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1NFUlZFUlJFQ1ZCVUYgICA4IC8qIHJlY2VpdmUgYnVmZmVyIChzZXJ2ZXIpICovCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfQ0xJRU5UU0VOREJVRiAgIDkgLyogc2VuZCBidWZmZXIgKGNsaWVudCkgKi8KI2RlZmluZSBORVRTTk1QX0RTX0xJQl9DTElFTlRSRUNWQlVGICAxMCAvKiByZWNlaXZlIGJ1ZmZlciAoY2xpZW50KSAqLwoKICAgIC8qCiAgICAgKiBzcGVjaWFsIG1lYW5pbmdzIGZvciB0aGUgZGVmYXVsdCBTTk1QIHZlcnNpb24gc2xvdCAoTkVUU05NUF9EU19MSUJfU05NUFZFUlNJT04pIAogICAgICovCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX1NOTVBWMQojZGVmaW5lIE5FVFNOTVBfRFNfU05NUF9WRVJTSU9OXzEgICAgMTI4ICAgICAgICAvKiBib2d1cyAqLwojZW5kaWYKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfU05NUFYyQwojZGVmaW5lIE5FVFNOTVBfRFNfU05NUF9WRVJTSU9OXzJjICAgMSAgLyogcmVhbCAqLwojZW5kaWYKI2RlZmluZSBORVRTTk1QX0RTX1NOTVBfVkVSU0lPTl8zICAgIDMgIC8qIHJlYWwgKi8KCgogICAgLyoKICAgICAqIGxpYnJhcnkgc3RyaW5ncyAKICAgICAqLwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1NFQ05BTUUgICAgICAgICAgIDAKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9DT05URVhUICAgICAgICAgICAxCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfUEFTU1BIUkFTRSAgICAgICAgMgojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0FVVEhQQVNTUEhSQVNFICAgIDMKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9QUklWUEFTU1BIUkFTRSAgICA0CiNkZWZpbmUgTkVUU05NUF9EU19MSUJfT1BUSU9OQUxDT05GSUcgICAgNQojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUgICAgICAgICAgIDYKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9DT01NVU5JVFkgICAgICAgICA3CiNkZWZpbmUgTkVUU05NUF9EU19MSUJfUEVSU0lTVEVOVF9ESVIgICAgOAojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0NPTkZJR1VSQVRJT05fRElSIDkKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9TRUNNT0RFTCAgICAgICAgICAxMAojZGVmaW5lIE5FVFNOTVBfRFNfTElCX01JQkRJUlMgICAgICAgICAgIDExCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYICAgICAgICAgMTIKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9PSURQUkVGSVggICAgICAgICAxMwojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0NMSUVOVF9BRERSICAgICAgIDE0CiNkZWZpbmUgTkVUU05NUF9EU19MSUJfVEVNUF9GSUxFX1BBVFRFUk4gMTUKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9BVVRITUFTVEVSS0VZICAgICAxNgojZGVmaW5lIE5FVFNOTVBfRFNfTElCX1BSSVZNQVNURVJLRVkgICAgIDE3CiNkZWZpbmUgTkVUU05NUF9EU19MSUJfQVVUSExPQ0FMSVpFREtFWSAgMTgKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9QUklWTE9DQUxJWkVES0VZICAxOQojZGVmaW5lIE5FVFNOTVBfRFNfTElCX0FQUFRZUEVTICAgICAgICAgIDIwCiNkZWZpbmUgTkVUU05NUF9EU19MSUJfS1NNX0tFWVRBQiAgICAgICAgMjEKI2RlZmluZSBORVRTTk1QX0RTX0xJQl9LU01fU0VSVklDRV9OQU1FICAyMgoKICAgIC8qCiAgICAgKiBlbmQgc3RvcmFnZSBkZWZpbml0aW9ucyAKICAgICAqLwoKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKGludCBzdG9yZWlkLCBpbnQgd2hpY2gsIGludCB2YWx1ZSk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihpbnQgc3RvcmVpZCwgaW50IHdoaWNoKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKGludCBzdG9yZWlkLCBpbnQgd2hpY2gpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChpbnQgc3RvcmVpZCwgaW50IHdoaWNoLCBpbnQgdmFsdWUpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2ludChpbnQgc3RvcmVpZCwgaW50IHdoaWNoKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoaW50IHN0b3JlaWQsIGludCB3aGljaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKICAgIGNoYXIgICAgICAgICAgICpuZXRzbm1wX2RzX2dldF9zdHJpbmcoaW50IHN0b3JlaWQsIGludCB3aGljaCk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfdm9pZChpbnQgc3RvcmVpZCwgaW50IHdoaWNoLCB2b2lkICp2YWx1ZSk7CiAgICB2b2lkICAgICAgICAgICAqbmV0c25tcF9kc19nZXRfdm9pZChpbnQgc3RvcmVpZCwgaW50IHdoaWNoKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX2NvbmZpZyh1X2NoYXIgdHlwZSwgY29uc3QgY2hhciAqZnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRva2VuLCBpbnQgc3RvcmVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYih1X2NoYXIgdHlwZSwgY29uc3QgY2hhciAqZnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRva2VuLCBpbnQgc3RvcmVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2RzX3BhcnNlX2Jvb2xlYW4oY2hhciAqbGluZSk7CiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9kc19zaHV0ZG93bih2b2lkKTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERFRkFVTFRfU1RPUkVfSCAqLwovKiogQH0gKi8K