LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogcGlkX3QgKi8KI2luY2x1ZGUgIndpbmJhc2UuaCIgICAvKiBmb3IgTFBTVEFSVFVQSU5GTzMyQSAqLwojaW5jbHVkZSAid2lubnQuaCIgICAgIC8qIGZvciBQQ09OVEVYVCAqLwojaW5jbHVkZSAic2lnX2NvbnRleHQuaCIKCnR5cGVkZWYgc3RydWN0IF9ET1NTWVNURU0gewogIGludCBpZDsKICB2b2lkICpkYXRhOwogIHN0cnVjdCBfRE9TU1lTVEVNICpuZXh0Owp9IERPU1NZU1RFTTsKCnN0cnVjdCBfRE9TRVZFTlQ7Cgp0eXBlZGVmIHN0cnVjdCBfRE9TVEFTSyB7CiBMUFZPSUQgaW1nOwogdW5zaWduZWQgaW1nX29mczsKIFdPUkQgcHNwX3NlZyxsb2FkX3NlZzsKIFdPUkQgaW5pdF9jcyxpbml0X2lwLGluaXRfc3MsaW5pdF9zcDsKIFdPUkQgeG1zX3NlZzsKIFdPUkQgZHBtaV9zZWcsZHBtaV9zZWwsZHBtaV9mbGFnOwogSE1PRFVMRTE2IGhNb2R1bGU7CiBjaGFyIG1tX25hbWVbMTI4XTsKIGludCBtbV9mZDsKIEhBTkRMRSBoUmVhZFBpcGUsaFhQaXBlLGhDb25JbnB1dCxoQ29uT3V0cHV0OwogaW50IHJlYWRfcGlwZSx3cml0ZV9waXBlOwogcGlkX3QgdGFzazsKIGludCBzaWdfc2VudDsKIHN0cnVjdCBfRE9TRVZFTlQgKnBlbmRpbmcsKmN1cnJlbnQ7CiBET1NTWVNURU0gKnN5czsKfSBET1NUQVNLLCAqTFBET1NUQVNLOwoKdHlwZWRlZiBzdHJ1Y3QgX0RPU0VWRU5UIHsKICBpbnQgaXJxLHByaW9yaXR5OwogIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLENPTlRFWFQ4Niosdm9pZCopOwogIHZvaWQgKmRhdGE7CiAgc3RydWN0IF9ET1NFVkVOVCAqbmV4dDsKfSBET1NFVkVOVCwgKkxQRE9TRVZFTlQ7CgojZGVmaW5lIERPU19QUklPUklUWV9SRUFMVElNRSAwICAvKiBJUlEwICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX0tFWUJPQVJEIDEgIC8qIElSUTEgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfVkdBICAgICAgMiAgLyogSVJROSAqLwojZGVmaW5lIERPU19QUklPUklUWV9NT1VTRSAgICA1ICAvKiBJUlExMiAqLwojZGVmaW5lIERPU19QUklPUklUWV9TRVJJQUwgICAxMCAvKiBJUlE0ICovCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCiNkZWZpbmUgTVpfU1VQUE9SVEVECgpleHRlcm4gQk9PTCBNWl9Jbml0VGFzayggTFBET1NUQVNLIGxwRG9zVGFzayApOwpleHRlcm4gdm9pZCBNWl9LaWxsTW9kdWxlKCBMUERPU1RBU0sgbHBEb3NUYXNrICk7CmV4dGVybiBMUERPU1RBU0sgTVpfQWxsb2NEUE1JVGFzayggSE1PRFVMRTE2IGhNb2R1bGUgKTsKCiNlbmRpZiAvKiBsaW51eC1pMzg2ICovCgojZGVmaW5lIFY4Nl9GTEFHIDB4MDAwMjAwMDAKCmV4dGVybiBCT09MIE1aX0NyZWF0ZVByb2Nlc3MoIEhGSUxFIGhGaWxlLCBPRlNUUlVDVCAqb2ZzLCBMUENTVFIgY21kbGluZSwgTFBDU1RSIGVudiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBwc2EsIExQU0VDVVJJVFlfQVRUUklCVVRFUyB0c2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgaW5oZXJpdCwgRFdPUkQgZmxhZ3MsIExQU1RBUlRVUElORk9BIHN0YXJ0dXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFBST0NFU1NfSU5GT1JNQVRJT04gaW5mbyApOwpleHRlcm4gTFBET1NUQVNLIE1aX0N1cnJlbnQoIHZvaWQgKTsKZXh0ZXJuIGludCBET1NWTV9FbnRlciggQ09OVEVYVDg2ICpjb250ZXh0ICk7CmV4dGVybiB2b2lkIERPU1ZNX1dhaXQoIGludCByZWFkX3BpcGUsIEhBTkRMRSBoT2JqZWN0ICk7CmV4dGVybiB2b2lkIERPU1ZNX1F1ZXVlRXZlbnQoIGludCBpcnEsIGludCBwcmlvcml0eSwgdm9pZCAoKnJlbGF5KShMUERPU1RBU0ssQ09OVEVYVDg2Kix2b2lkKiksIHZvaWQgKmRhdGEgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fUElDX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fU2V0VGltZXIoIHVuc2lnbmVkIHRpY2tzICk7CmV4dGVybiB1bnNpZ25lZCBET1NWTV9HZXRUaW1lciggdm9pZCApOwpleHRlcm4gdm9pZCBET1NWTV9TZXRTeXN0ZW1EYXRhKCBpbnQgaWQsIHZvaWQgKmRhdGEgKTsKZXh0ZXJuIHZvaWQqIERPU1ZNX0dldFN5c3RlbURhdGEoIGludCBpZCApOwoKI2VuZGlmIC8qIF9fV0lORV9ET1NFWEVfSCAqLwo=