LyoKICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaAogKgogKiAgSW5mb3JtYXRpb24gc3RydWN0dXJlcyBmb3IgYm9hcmQtc3BlY2lmaWMgZGF0YQogKgogKiAgQ29weXJpZ2h0IChDKSAyMDA0CU5va2lhIENvcnBvcmF0aW9uCiAqICBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqLwoKI2lmbmRlZiBfT01BUF9CT0FSRF9ICiNkZWZpbmUgX09NQVBfQk9BUkRfSAoKI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CgovKiBEaWZmZXJlbnQgcGVyaXBoZXJhbCBpZHMgKi8KI2RlZmluZSBPTUFQX1RBR19DTE9DSwkJMHg0ZjAxCiNkZWZpbmUgT01BUF9UQUdfTU1DCQkweDRmMDIKI2RlZmluZSBPTUFQX1RBR19TRVJJQUxfQ09OU09MRSAweDRmMDMKI2RlZmluZSBPTUFQX1RBR19VU0IJCTB4NGYwNAojZGVmaW5lIE9NQVBfVEFHX0xDRAkJMHg0ZjA1CiNkZWZpbmUgT01BUF9UQUdfR1BJT19TV0lUQ0gJMHg0ZjA2CiNkZWZpbmUgT01BUF9UQUdfVUFSVAkJMHg0ZjA3CiNkZWZpbmUgT01BUF9UQUdfRkJNRU0JCTB4NGYwOAojZGVmaW5lIE9NQVBfVEFHX1NUSV9DT05TT0xFCTB4NGYwOQojZGVmaW5lIE9NQVBfVEFHX0NBTUVSQV9TRU5TT1IJMHg0ZjBhCgojZGVmaW5lIE9NQVBfVEFHX0JPT1RfUkVBU09OICAgIDB4NGY4MAojZGVmaW5lIE9NQVBfVEFHX0ZMQVNIX1BBUlQJMHg0ZjgxCiNkZWZpbmUgT01BUF9UQUdfVkVSU0lPTl9TVFIJMHg0ZjgyCgpzdHJ1Y3Qgb21hcF9jbG9ja19jb25maWcgewoJLyogMCBmb3IgMTIgTUh6LCAxIGZvciAxMyBNSHogYW5kIDIgZm9yIDE5LjIgTUh6ICovCgl1OCBzeXN0ZW1fY2xvY2tfdHlwZTsKfTsKCnN0cnVjdCBvbWFwX21tY19jb25mIHsKCXVuc2lnbmVkIGVuYWJsZWQ6MTsKCS8qIG5vbXV4IG1lYW5zICJzdGFuZGFyZCIgbXV4aW5nIGlzIHdyb25nIG9uIHRoaXMgYm9hcmQsIGFuZCB0aGF0CgkgKiBib2FyZC1zcGVjaWZpYyBjb2RlIGhhbmRsZWQgaXQgYmVmb3JlIGNvbW1vbiBpbml0IGxvZ2ljLgoJICovCgl1bnNpZ25lZCBub211eDoxOwoJLyogc3dpdGNoIHBpbiBjYW4gYmUgZm9yIGNhcmQgZGV0ZWN0IChkZWZhdWx0KSBvciBjYXJkIGNvdmVyICovCgl1bnNpZ25lZCBjb3ZlcjoxOwoJLyogNCB3aXJlIHNpZ25hbGluZyBpcyBvcHRpb25hbCwgYW5kIGlzIG9ubHkgdXNlZCBmb3IgU0QvU0RJTyAqLwoJdW5zaWduZWQgd2lyZTQ6MTsKCXMxNiBwb3dlcl9waW47CglzMTYgc3dpdGNoX3BpbjsKCXMxNiB3cF9waW47Cn07CgpzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIHsKCXN0cnVjdCBvbWFwX21tY19jb25mIG1tY1syXTsKfTsKCnN0cnVjdCBvbWFwX3NlcmlhbF9jb25zb2xlX2NvbmZpZyB7Cgl1OCBjb25zb2xlX3VhcnQ7Cgl1MzIgY29uc29sZV9zcGVlZDsKfTsKCnN0cnVjdCBvbWFwX3N0aV9jb25zb2xlX2NvbmZpZyB7Cgl1bnNpZ25lZCBlbmFibGU6MTsKCXU4IGNoYW5uZWw7Cn07CgpzdHJ1Y3Qgb21hcF9jYW1lcmFfc2Vuc29yX2NvbmZpZyB7Cgl1MTYgcmVzZXRfZ3BpbzsKCWludCAoKnBvd2VyX29uKSh2b2lkICogZGF0YSk7CglpbnQgKCpwb3dlcl9vZmYpKHZvaWQgKiBkYXRhKTsKfTsKCnN0cnVjdCBvbWFwX3VzYl9jb25maWcgewoJLyogQ29uZmlndXJlIGRyaXZlcnMgYWNjb3JkaW5nIHRvIHRoZSBjb25uZWN0b3JzIG9uIHlvdXIgYm9hcmQ6CgkgKiAgLSAiQSIgY29ubmVjdG9yIChyZWN0YWd1bGFyKQoJICoJLi4uIGZvciBob3N0L09IQ0kgdXNlLCBzZXQgInJlZ2lzdGVyX2hvc3QiLgoJICogIC0gIkIiIGNvbm5lY3RvciAoc3F1YXJpc2gpIG9yICJNaW5pLUIiCgkgKgkuLi4gZm9yIGRldmljZS9nYWRnZXQgdXNlLCBzZXQgInJlZ2lzdGVyX2RldiIuCgkgKiAgLSAiTWluaS1BQiIgY29ubmVjdG9yICh2ZXJ5IHNpbWlsYXIgdG8gTWluaS1CKQoJICoJLi4uIGZvciBPVEcgdXNlIGFzIGRldmljZSBPUiBob3N0LCBpbml0aWFsaXplICJvdGciCgkgKi8KCXVuc2lnbmVkCXJlZ2lzdGVyX2hvc3Q6MTsKCXVuc2lnbmVkCXJlZ2lzdGVyX2RldjoxOwoJdTgJCW90ZzsJLyogcG9ydCBudW1iZXIsIDEtYmFzZWQ6ICB1c2IxID09IDIgKi8KCgl1OAkJaG1jX21vZGU7CgoJLyogaW1wbGljaXRseSB0cnVlIGlmIG90ZzogIGhvc3Qgc3VwcG9ydHMgcmVtb3RlIHdha2V1cD8gKi8KCXU4CQlyd2M7CgoJLyogc2lnbmFsaW5nIHBpbnMgdXNlZCB0byB0YWxrIHRvIHRyYW5zY2VpdmVyIG9uIHVzYk46CgkgKiAgMCA9PSB1c2JOIHVudXNlZAoJICogIDIgPT0gdXNiMC1vbmx5LCB1c2luZyBpbnRlcm5hbCB0cmFuc2NlaXZlcgoJICogIDMgPT0gMyB3aXJlIGJpZGlyZWN0aW9uYWwKCSAqICA0ID09IDQgd2lyZSBiaWRpcmVjdGlvbmFsCgkgKiAgNiA9PSA2IHdpcmUgdW5pZGlyZWN0aW9uYWwgKG9yIFRMTCkKCSAqLwoJdTgJCXBpbnNbM107Cn07CgpzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIHsKCWNoYXIgcGFuZWxfbmFtZVsxNl07CgljaGFyIGN0cmxfbmFtZVsxNl07Cn07CgpzdHJ1Y3Qgb21hcF9mYm1lbV9jb25maWcgewoJdTMyIGZiX3NyYW1fc3RhcnQ7Cgl1MzIgZmJfc3JhbV9zaXplOwoJdTMyIGZiX3NkcmFtX3N0YXJ0OwoJdTMyIGZiX3NkcmFtX3NpemU7Cn07CgovKiBDb3ZlcjoKICogICAgICBoaWdoIC0+IGNsb3NlZAogKiAgICAgIGxvdyAgLT4gb3BlbgogKiBDb25uZWN0aW9uOgogKiAgICAgIGhpZ2ggLT4gY29ubmVjdGVkCiAqICAgICAgbG93ICAtPiBkaXNjb25uZWN0ZWQKICovCiNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9UWVBFX0NPVkVSCQkweDAwMDAKI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX1RZUEVfQ09OTkVDVElPTgkweDAwMDEKI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX0ZMQUdfSU5WRVJURUQJCTB4MDAwMQojZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfRkxBR19PVVRQVVQJCTB4MDAwMgpzdHJ1Y3Qgb21hcF9ncGlvX3N3aXRjaF9jb25maWcgewoJY2hhciBuYW1lWzEyXTsKCXUxNiBncGlvOwoJaW50IGZsYWdzOjQ7CglpbnQgdHlwZTo0OwoJaW50IGtleV9jb2RlOjI0OyAvKiBMaW51eCBrZXkgY29kZSAqLwp9OwoKc3RydWN0IG9tYXBfdWFydF9jb25maWcgewoJLyogQml0IGZpZWxkIG9mIFVBUlRzIHByZXNlbnQ7IGJpdCAwIC0tPiBVQVJUMSAqLwoJdW5zaWduZWQgaW50IGVuYWJsZWRfdWFydHM7Cn07CgoKc3RydWN0IG9tYXBfZmxhc2hfcGFydF9jb25maWcgewoJY2hhciBwYXJ0X3RhYmxlWzBdOwp9OwoKc3RydWN0IG9tYXBfYm9vdF9yZWFzb25fY29uZmlnIHsKCWNoYXIgcmVhc29uX3N0clsxMl07Cn07CgpzdHJ1Y3Qgb21hcF92ZXJzaW9uX2NvbmZpZyB7CgljaGFyIGNvbXBvbmVudFsxMl07CgljaGFyIHZlcnNpb25bMTJdOwp9OwoKCiNpbmNsdWRlIDxhc20tYXJtL2FyY2gtb21hcC9ib2FyZC1ub2tpYS5oPgoKc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5IHsKCXUxNiB0YWc7Cgl1MTYgbGVuOwoJdTggIGRhdGFbMF07Cn07CgpzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIHsKCXUxNiB0YWc7Cgljb25zdCB2b2lkICpkYXRhOwp9OwoKZXh0ZXJuIGNvbnN0IHZvaWQgKl9fb21hcF9nZXRfY29uZmlnKHUxNiB0YWcsIHNpemVfdCBsZW4sIGludCBucik7CgojZGVmaW5lIG9tYXBfZ2V0X2NvbmZpZyh0YWcsIHR5cGUpIFwKCSgoY29uc3QgdHlwZSAqKSBfX29tYXBfZ2V0X2NvbmZpZygodGFnKSwgc2l6ZW9mKHR5cGUpLCAwKSkKI2RlZmluZSBvbWFwX2dldF9ucl9jb25maWcodGFnLCB0eXBlLCBucikgXAoJKChjb25zdCB0eXBlICopIF9fb21hcF9nZXRfY29uZmlnKCh0YWcpLCBzaXplb2YodHlwZSksIChucikpKQoKZXh0ZXJuIGNvbnN0IHZvaWQgKm9tYXBfZ2V0X3Zhcl9jb25maWcodTE2IHRhZywgc2l6ZV90ICpsZW4pOwoKZXh0ZXJuIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgKm9tYXBfYm9hcmRfY29uZmlnOwpleHRlcm4gaW50IG9tYXBfYm9hcmRfY29uZmlnX3NpemU7CgojZW5kaWYK