LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogcGlkX3QgKi8KI2luY2x1ZGUgIndpbmJhc2UuaCIgICAvKiBmb3IgTFBTVEFSVFVQSU5GTzMyQSAqLwojaW5jbHVkZSAid2lubnQuaCIgICAgIC8qIGZvciBQQ09OVEVYVCAqLwoKdHlwZWRlZiBzdHJ1Y3QgX0RPU1NZU1RFTSB7CiAgaW50IGlkOwogIHZvaWQgKmRhdGE7CiAgc3RydWN0IF9ET1NTWVNURU0gKm5leHQ7Cn0gRE9TU1lTVEVNOwoKc3RydWN0IF9ET1NFVkVOVDsKCnR5cGVkZWYgc3RydWN0IF9ET1NUQVNLIHsKIExQVk9JRCBpbWc7CiB1bnNpZ25lZCBpbWdfb2ZzOwogV09SRCBwc3Bfc2VnLGxvYWRfc2VnOwogV09SRCBpbml0X2NzLGluaXRfaXAsaW5pdF9zcyxpbml0X3NwOwogV09SRCB4bXNfc2VnOwogV09SRCBkcG1pX3NlZyxkcG1pX3NlbCxkcG1pX2ZsYWc7CiBjaGFyIG1tX25hbWVbMTI4XTsKIGludCBtbV9mZDsKIEhBTkRMRSBoUmVhZFBpcGUsaFhQaXBlLGhDb25JbnB1dCxoQ29uT3V0cHV0OwogaW50IHJlYWRfcGlwZSx3cml0ZV9waXBlOwogcGlkX3QgdGFzazsKIGludCBzaWdfc2VudCxlbnRlcmVkLGlkbGluZzsKIHN0cnVjdCBfRE9TRVZFTlQgKnBlbmRpbmcsKmN1cnJlbnQ7CiBET1NTWVNURU0gKnN5czsKfSBET1NUQVNLLCAqTFBET1NUQVNLOwoKdHlwZWRlZiBzdHJ1Y3QgX0RPU0VWRU5UIHsKICBpbnQgaXJxLHByaW9yaXR5OwogIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLENPTlRFWFQ4Niosdm9pZCopOwogIHZvaWQgKmRhdGE7CiAgc3RydWN0IF9ET1NFVkVOVCAqbmV4dDsKfSBET1NFVkVOVCwgKkxQRE9TRVZFTlQ7CgojZGVmaW5lIERPU19QUklPUklUWV9SRUFMVElNRSAwICAvKiBJUlEwICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX0tFWUJPQVJEIDEgIC8qIElSUTEgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfVkdBICAgICAgMiAgLyogSVJROSAqLwojZGVmaW5lIERPU19QUklPUklUWV9NT1VTRSAgICA1ICAvKiBJUlExMiAqLwojZGVmaW5lIERPU19QUklPUklUWV9TRVJJQUwgICAxMCAvKiBJUlE0ICovCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCiNkZWZpbmUgTVpfU1VQUE9SVEVECgpleHRlcm4gQk9PTCBNWl9Jbml0VGFzayggTFBET1NUQVNLIGxwRG9zVGFzayApOwpleHRlcm4gdm9pZCBNWl9LaWxsVGFzayggTFBET1NUQVNLIGxwRG9zVGFzayApOwpleHRlcm4gTFBET1NUQVNLIE1aX0FsbG9jRFBNSVRhc2soIHZvaWQgKTsKCiNlbmRpZiAvKiBsaW51eC1pMzg2ICovCgojZGVmaW5lIFY4Nl9GTEFHIDB4MDAwMjAwMDAKCmV4dGVybiBCT09MIE1aX0xvYWRJbWFnZSggSE1PRFVMRSBtb2R1bGUsIEhBTkRMRSBoRmlsZSwgTFBDU1RSIGZpbGVuYW1lICk7CmV4dGVybiBMUERPU1RBU0sgTVpfQ3VycmVudCggdm9pZCApOwpleHRlcm4gaW50IERPU1ZNX0VudGVyKCBDT05URVhUODYgKmNvbnRleHQgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fV2FpdCggaW50IHJlYWRfcGlwZSwgSEFORExFIGhPYmplY3QgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fUXVldWVFdmVudCggaW50IGlycSwgaW50IHByaW9yaXR5LCB2b2lkICgqcmVsYXkpKExQRE9TVEFTSyxDT05URVhUODYqLHZvaWQqKSwgdm9pZCAqZGF0YSApOwpleHRlcm4gdm9pZCBET1NWTV9QSUNfaW9wb3J0X291dCggV09SRCBwb3J0LCBCWVRFIHZhbCApOwpleHRlcm4gdm9pZCBET1NWTV9TZXRUaW1lciggdW5zaWduZWQgdGlja3MgKTsKZXh0ZXJuIHVuc2lnbmVkIERPU1ZNX0dldFRpbWVyKCB2b2lkICk7CmV4dGVybiB2b2lkIERPU1ZNX1NldFN5c3RlbURhdGEoIGludCBpZCwgdm9pZCAqZGF0YSApOwpleHRlcm4gdm9pZCogRE9TVk1fR2V0U3lzdGVtRGF0YSggaW50IGlkICk7CgojZW5kaWYgLyogX19XSU5FX0RPU0VYRV9IICovCg==