LyogCiAqICRJZDogbXRkLmgsdiAxLjU3IDIwMDUvMDIvMDggMTc6MTE6MTUgbmljbyBFeHAgJAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+IGV0IGFsLgogKgogKiBSZWxlYXNlZCB1bmRlciBHUEwKICovCgojaWZuZGVmIF9fTVREX01URF9IX18KI2RlZmluZSBfX01URF9NVERfSF9fCgojaWZuZGVmIF9fS0VSTkVMX18KI2Vycm9yIFRoaXMgaXMgYSBrZXJuZWwgaGVhZGVyLiBQZXJoYXBzIGluY2x1ZGUgbXRkLXVzZXIuaCBpbnN0ZWFkPwojZW5kaWYKCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgoKI2luY2x1ZGUgPGxpbnV4L210ZC9jb21wYXRtYWMuaD4KI2luY2x1ZGUgPG10ZC9tdGQtYWJpLmg+CgojZGVmaW5lIE1URF9DSEFSX01BSk9SIDkwCiNkZWZpbmUgTVREX0JMT0NLX01BSk9SIDMxCiNkZWZpbmUgTUFYX01URF9ERVZJQ0VTIDE2CgojZGVmaW5lIE1URF9FUkFTRV9QRU5ESU5HICAgICAgCTB4MDEKI2RlZmluZSBNVERfRVJBU0lORwkJMHgwMgojZGVmaW5lIE1URF9FUkFTRV9TVVNQRU5ECTB4MDQKI2RlZmluZSBNVERfRVJBU0VfRE9ORSAgICAgICAgICAweDA4CiNkZWZpbmUgTVREX0VSQVNFX0ZBSUxFRCAgICAgICAgMHgxMAoKLyogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuICBJZgogICBmYWlsX2FkZHIgPSAweGZmZmZmZmZmLCB0aGUgZmFpbHVyZSB3YXMgbm90IGF0IHRoZSBkZXZpY2UgbGV2ZWwgb3Igd2FzIG5vdAogICBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBibG9jay4gKi8Kc3RydWN0IGVyYXNlX2luZm8gewoJc3RydWN0IG10ZF9pbmZvICptdGQ7Cgl1X2ludDMyX3QgYWRkcjsKCXVfaW50MzJfdCBsZW47Cgl1X2ludDMyX3QgZmFpbF9hZGRyOwoJdV9sb25nIHRpbWU7Cgl1X2xvbmcgcmV0cmllczsKCXVfaW50IGRldjsKCXVfaW50IGNlbGw7Cgl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgZXJhc2VfaW5mbyAqc2VsZik7Cgl1X2xvbmcgcHJpdjsKCXVfY2hhciBzdGF0ZTsKCXN0cnVjdCBlcmFzZV9pbmZvICpuZXh0Owp9OwoKc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyB7Cgl1X2ludDMyX3Qgb2Zmc2V0OwkJCS8qIEF0IHdoaWNoIHRoaXMgcmVnaW9uIHN0YXJ0cywgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNVEQgKi8KCXVfaW50MzJfdCBlcmFzZXNpemU7CQkvKiBGb3IgdGhpcyByZWdpb24gKi8KCXVfaW50MzJfdCBudW1ibG9ja3M7CQkvKiBOdW1iZXIgb2YgYmxvY2tzIG9mIGVyYXNlc2l6ZSBpbiB0aGlzIHJlZ2lvbiAqLwp9OwoKc3RydWN0IG10ZF9pbmZvIHsKCXVfY2hhciB0eXBlOwoJdV9pbnQzMl90IGZsYWdzOwoJdV9pbnQzMl90IHNpemU7CSAvLyBUb3RhbCBzaXplIG9mIHRoZSBNVEQKCgkvKiAiTWFqb3IiIGVyYXNlIHNpemUgZm9yIHRoZSBkZXZpY2UuIE5h73ZlIHVzZXJzIG1heSB0YWtlIHRoaXMKCSAqIHRvIGJlIHRoZSBvbmx5IGVyYXNlIHNpemUgYXZhaWxhYmxlLCBvciBtYXkgdXNlIHRoZSBtb3JlIGRldGFpbGVkCgkgKiBpbmZvcm1hdGlvbiBiZWxvdyBpZiB0aGV5IGRlc2lyZQoJICovCgl1X2ludDMyX3QgZXJhc2VzaXplOwoKCXVfaW50MzJfdCBvb2JibG9jazsgIC8vIFNpemUgb2YgT09CIGJsb2NrcyAoZS5nLiA1MTIpCgl1X2ludDMyX3Qgb29ic2l6ZTsgICAvLyBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KQoJdV9pbnQzMl90IG9vYmF2YWlsOyAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIE9PQiBhcmVhIGF2YWlsYWJsZSBmb3IgZnMgCgl1X2ludDMyX3QgZWNjdHlwZTsKCXVfaW50MzJfdCBlY2NzaXplOwoJCgoJLy8gS2VybmVsLW9ubHkgc3R1ZmYgc3RhcnRzIGhlcmUuCgljaGFyICpuYW1lOwoJaW50IGluZGV4OwoKCS8vIG9vYmluZm8gaXMgYSBuYW5kX29vYmluZm8gc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgc2V0IGJ5IGlvdGNsIChNRU1TRVRPT0JJTkZPKQoJc3RydWN0IG5hbmRfb29iaW5mbyBvb2JpbmZvOwoKCS8qIERhdGEgZm9yIHZhcmlhYmxlIGVyYXNlIHJlZ2lvbnMuIElmIG51bWVyYXNlcmVnaW9ucyBpcyB6ZXJvLAoJICogaXQgbWVhbnMgdGhhdCB0aGUgd2hvbGUgZGV2aWNlIGhhcyBlcmFzZXNpemUgYXMgZ2l2ZW4gYWJvdmUuIAoJICovCglpbnQgbnVtZXJhc2VyZWdpb25zOwoJc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyAqZXJhc2VyZWdpb25zOyAKCgkvKiBUaGlzIHJlYWxseSBzaG91bGRuJ3QgYmUgaGVyZS4gSXQgY2FuIGdvIGF3YXkgaW4gMi41ICovCgl1X2ludDMyX3QgYmFua19zaXplOwoKCWludCAoKmVyYXNlKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cik7CgoJLyogVGhpcyBzdHVmZiBmb3IgZVhlY3V0ZS1Jbi1QbGFjZSAqLwoJaW50ICgqcG9pbnQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKiptdGRidWYpOwoKCS8qIFdlIHByb2JhYmx5IHNob3VsZG4ndCBhbGxvdyBYSVAgaWYgdGhlIHVucG9pbnQgaXNuJ3QgYSBOVUxMICovCgl2b2lkICgqdW5wb2ludCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKiBhZGRyLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbik7CgoKCWludCAoKnJlYWQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CglpbnQgKCp3cml0ZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1Zik7CgoJaW50ICgqcmVhZF9lY2MpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CglpbnQgKCp3cml0ZV9lY2MpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYsIHVfY2hhciAqZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOwoKCWludCAoKnJlYWRfb29iKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwoJaW50ICgqd3JpdGVfb29iKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKCgkvKiAKCSAqIE1ldGhvZHMgdG8gYWNjZXNzIHRoZSBwcm90ZWN0aW9uIHJlZ2lzdGVyIGFyZWEsIHByZXNlbnQgaW4gc29tZSAKCSAqIGZsYXNoIGRldmljZXMuIFRoZSB1c2VyIGRhdGEgaXMgb25lIHRpbWUgcHJvZ3JhbW1hYmxlIGJ1dCB0aGUKCSAqIGZhY3RvcnkgZGF0YSBpcyByZWFkIG9ubHkuIAoJICovCglpbnQgKCpnZXRfZmFjdF9wcm90X2luZm8pIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG90cF9pbmZvICpidWYsIHNpemVfdCBsZW4pOwoJaW50ICgqcmVhZF9mYWN0X3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwoJaW50ICgqZ2V0X3VzZXJfcHJvdF9pbmZvKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKTsKCWludCAoKnJlYWRfdXNlcl9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKCWludCAoKndyaXRlX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CglpbnQgKCpsb2NrX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pOwoKCS8qIGt2ZWMtYmFzZWQgcmVhZC93cml0ZSBtZXRob2RzLiBXZSBuZWVkIHRoZXNlIGVzcGVjaWFsbHkgZm9yIE5BTkQgZmxhc2gsCgkgICB3aXRoIGl0cyBsaW1pdGVkIG51bWJlciBvZiB3cml0ZSBjeWNsZXMgcGVyIGVyYXNlLgoJICAgTkI6IFRoZSAnY291bnQnIHBhcmFtZXRlciBpcyB0aGUgbnVtYmVyIG9mIF92ZWN0b3JzXywgZWFjaCBvZiAKCSAgIHdoaWNoIGNvbnRhaW5zIGFuIChvZnMsIGxlbikgdHVwbGUuCgkqLwoJaW50ICgqcmVhZHYpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGt2ZWMgKnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLCBzaXplX3QgKnJldGxlbik7CglpbnQgKCpyZWFkdl9lY2MpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGt2ZWMgKnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLCAKCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CglpbnQgKCp3cml0ZXYpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4pOwoJaW50ICgqd3JpdGV2X2VjYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCAKCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CgoJLyogU3luYyAqLwoJdm9pZCAoKnN5bmMpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CgoJLyogQ2hpcC1zdXBwb3J0ZWQgZGV2aWNlIGxvY2tpbmcgKi8KCWludCAoKmxvY2spIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbik7CglpbnQgKCp1bmxvY2spIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbik7CgoJLyogUG93ZXIgTWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7Cgl2b2lkICgqcmVzdW1lKSAoc3RydWN0IG10ZF9pbmZvICptdGQpOwoKCS8qIEJhZCBibG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLwoJaW50ICgqYmxvY2tfaXNiYWQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcyk7CglpbnQgKCpibG9ja19tYXJrYmFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpOwoKCXZvaWQgKnByaXY7CgoJc3RydWN0IG1vZHVsZSAqb3duZXI7CglpbnQgdXNlY291bnQ7Cn07CgoKCS8qIEtlcm5lbC1zaWRlIGlvY3RsIGRlZmluaXRpb25zICovCgpleHRlcm4gaW50IGFkZF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKZXh0ZXJuIGludCBkZWxfbXRkX2RldmljZSAoc3RydWN0IG10ZF9pbmZvICptdGQpOwoKZXh0ZXJuIHN0cnVjdCBtdGRfaW5mbyAqZ2V0X210ZF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBudW0pOwoKZXh0ZXJuIHZvaWQgcHV0X210ZF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQpOwoKCnN0cnVjdCBtdGRfbm90aWZpZXIgewoJdm9pZCAoKmFkZCkoc3RydWN0IG10ZF9pbmZvICptdGQpOwoJdm9pZCAoKnJlbW92ZSkoc3RydWN0IG10ZF9pbmZvICptdGQpOwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0Owp9OwoKCmV4dGVybiB2b2lkIHJlZ2lzdGVyX210ZF91c2VyIChzdHJ1Y3QgbXRkX25vdGlmaWVyICpuZXcpOwpleHRlcm4gaW50IHVucmVnaXN0ZXJfbXRkX3VzZXIgKHN0cnVjdCBtdGRfbm90aWZpZXIgKm9sZCk7CgppbnQgZGVmYXVsdF9tdGRfd3JpdGV2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbik7CgppbnQgZGVmYXVsdF9tdGRfcmVhZHYoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBrdmVjICp2ZWNzLAoJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLCBzaXplX3QgKnJldGxlbik7CgojZGVmaW5lIE1URF9FUkFTRShtdGQsIGFyZ3MuLi4pICgqKG10ZC0+ZXJhc2UpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1BPSU5UKG10ZCwgYSxiLGMsZCkgKCoobXRkLT5wb2ludCkpKG10ZCwgYSxiLGMsICh1X2NoYXIgKiopKGQpKQojZGVmaW5lIE1URF9VTlBPSU5UKG10ZCwgYXJnKSAoKihtdGQtPnVucG9pbnQpKShtdGQsICh1X2NoYXIgKilhcmcpCiNkZWZpbmUgTVREX1JFQUQobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWQpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1dSSVRFKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZSkpKG10ZCwgYXJncykKI2RlZmluZSBNVERfUkVBRFYobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWR2KSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9XUklURVYobXRkLCBhcmdzLi4uKSAoKihtdGQtPndyaXRldikpKG10ZCwgYXJncykKI2RlZmluZSBNVERfUkVBREVDQyhtdGQsIGFyZ3MuLi4pICgqKG10ZC0+cmVhZF9lY2MpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1dSSVRFRUNDKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZV9lY2MpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1JFQURPT0IobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWRfb29iKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9XUklURU9PQihtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGVfb29iKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9TWU5DKG10ZCkgZG8geyBpZiAobXRkLT5zeW5jKSAoKihtdGQtPnN5bmMpKShtdGQpOyAgfSB3aGlsZSAoMCkgCgoKI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwp2b2lkIG10ZF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpOwojZWxzZQpzdGF0aWMgaW5saW5lIHZvaWQgbXRkX2VyYXNlX2NhbGxiYWNrKHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKewoJaWYgKGluc3RyLT5jYWxsYmFjaykKCQlpbnN0ci0+Y2FsbGJhY2soaW5zdHIpOwp9CiNlbmRpZgoKLyoKICogRGVidWdnaW5nIG1hY3JvIGFuZCBkZWZpbmVzCiAqLwojZGVmaW5lIE1URF9ERUJVR19MRVZFTDAJKDApCS8qIFF1aWV0ICAgKi8KI2RlZmluZSBNVERfREVCVUdfTEVWRUwxCSgxKQkvKiBBdWRpYmxlICovCiNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMgkoMikJLyogTG91ZCAgICAqLwojZGVmaW5lIE1URF9ERUJVR19MRVZFTDMJKDMpCS8qIE5vaXN5ICAgKi8KCiNpZmRlZiBDT05GSUdfTVREX0RFQlVHCiNkZWZpbmUgREVCVUcobiwgYXJncy4uLikJCQkJXAogCWRvIHsJCQkJCQlcCgkJaWYgKG4gPD0gQ09ORklHX01URF9ERUJVR19WRVJCT1NFKQlcCgkJCXByaW50ayhLRVJOX0lORk8gYXJncyk7CQlcCgl9IHdoaWxlKDApCiNlbHNlIC8qIENPTkZJR19NVERfREVCVUcgKi8KI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUoMCkKCiNlbmRpZiAvKiBDT05GSUdfTVREX0RFQlVHICovCgojZW5kaWYgLyogX19NVERfTVREX0hfXyAqLwo=