LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgbmV0d2F2ZV9jcy5jCiAqIFZlcnNpb246ICAgICAgIDAuNC4xCiAqIERlc2NyaXB0aW9uOiAgIE5ldHdhdmUgQWlyU3VyZmVyIFdpcmVsZXNzIExBTiBQQyBDYXJkIGRyaXZlcgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcnM6ICAgICAgIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4gPGpvaG5tQGNzLnVpdC5ubz4KICogICAgICAgICAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAgICAgICAgICAgICAgICBEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAqIENyZWF0ZWQgYXQ6ICAgIEEgbG9uZyB0aW1lIGFnbyEKICogTW9kaWZpZWQgYXQ6ICAgTW9uIE5vdiAxMCAxMTo1NDozNyAxOTk3CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcgVW5pdmVyc2l0eSBvZiBUcm9tc/gsIE5vcndheQogKgogKiBSZXZpc2lvbiBIaXN0b3J5OgogKgogKiAgIDA4LU5vdi05NyAxNToxNDo0NyAgIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4gPGpvaG5tQGNzLnVpdC5ubz4KICogICAgLSBGaXhlZCBzb21lIGJ1Z3MgaW4gbmV0d2F2ZV9yeCBhbmQgY2xlYW5lZCBpdCB1cCBhIGJpdC4gCiAqICAgICAgKE9uZSBvZiB0aGUgYnVncyB3b3VsZCBoYXZlIGRlc3Ryb3llZCBwYWNrZXRzIHdoZW4gcmVjZWl2aW5nCiAqICAgICAgbXVsdGlwbGUgcGFja2V0cyBwZXIgaW50ZXJydXB0KS4gCiAqICAgIC0gQ2xlYW5lZCB1cCBwYXJ0cyBvZiBuZXdhdmVfaHdfeG1pdC4gCiAqICAgIC0gQSBmZXcgZ2VuZXJhbCBjbGVhbnVwcy4gCiAqICAgMjQtT2N0LTk3IDEzOjE3OjM2ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAgICAtIEZpeGVkIG5ldHdhdmVfcnggcmVjZWl2ZSBmdW5jdGlvbiAoZ290IHVwZGF0ZWQgZG9jcykKICogICBPdGhlcnM6CiAqICAgIC0gQ2hhbmdlZCBuYW1lIGZyb20geGlyY253IHRvIG5ldHdhdmUsIHRha2UgYSBsb29rIGF0IAogKiAgICAgIGh0dHA6Ly93d3cubmV0d2F2ZS13aXJlbGVzcy5jb20KICogICAgLSBTb21lIHJlb3JnYW5pemluZyBvZiB0aGUgY29kZQogKiAgICAtIFJlbW92ZWQgcG9zc2libGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdHJhbnNtaXQKICogICAgICBmdW5jdGlvbgogKiAgICAtIFN0YXJ0ZWQgdG8gYWRkIHdpcmVsZXNzIGV4dGVuc2lvbnMsIGJ1dCBzdGlsbCBuZWVkcyBzb21lIGNvZGluZwogKiAgICAtIEFkZGVkIHdhdGNoZG9nIGZvciBiZXR0ZXIgaGFuZGxpbmcgb2YgdHJhbnNtaXNzaW9uIHRpbWVvdXRzIAogKiAgICAgIChob3BlZnVsbHkgdGhpcyB3b3JrcyBiZXR0ZXIpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRvIGhhdmUgc3RhdGlzdGljcyAoanVzdCBwYWNrZXRzIHNlbnQpIGRlZmluZSB0aGlzICovCiN1bmRlZiBORVRXQVZFX1NUQVRTCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9mY250bC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW4uaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgojaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CgojaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiNpbmNsdWRlIDxwY21jaWEvY3MuaD4KI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgojaW5jbHVkZSA8cGNtY2lhL21lbV9vcC5oPgoKI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgoKI2RlZmluZSBORVRXQVZFX1JFR09GRiAgICAgICAgIDB4ODAwMAovKiBUaGUgTmV0d2F2ZSBJTyByZWdpc3RlcnMsIG9mZnNldHMgdG8gaW9iYXNlICovCiNkZWZpbmUgTkVUV0FWRV9SRUdfQ09SICAgICAgICAweDAKI2RlZmluZSBORVRXQVZFX1JFR19DQ1NSICAgICAgIDB4MgojZGVmaW5lIE5FVFdBVkVfUkVHX0FTUiAgICAgICAgMHg0CiNkZWZpbmUgTkVUV0FWRV9SRUdfSU1SICAgICAgICAweGEKI2RlZmluZSBORVRXQVZFX1JFR19QTVIgICAgICAgIDB4YwojZGVmaW5lIE5FVFdBVkVfUkVHX0lPTE9XICAgICAgMHg2CiNkZWZpbmUgTkVUV0FWRV9SRUdfSU9ISSAgICAgICAweDcKI2RlZmluZSBORVRXQVZFX1JFR19JT0NPTlRST0wgIDB4OAojZGVmaW5lIE5FVFdBVkVfUkVHX0RBVEEgICAgICAgMHhmCi8qIFRoZSBOZXR3YXZlIEV4dGVuZGVkIElPIHJlZ2lzdGVycywgb2Zmc2V0cyB0byBSYW1CYXNlICovCiNkZWZpbmUgTkVUV0FWRV9FUkVHX0FTQ0MgICAgICAweDExNAojZGVmaW5lIE5FVFdBVkVfRVJFR19SU0VSICAgICAgMHgxMjAKI2RlZmluZSBORVRXQVZFX0VSRUdfUlNFUlcgICAgIDB4MTI0CiNkZWZpbmUgTkVUV0FWRV9FUkVHX1RTRVIgICAgICAweDEzMAojZGVmaW5lIE5FVFdBVkVfRVJFR19UU0VSVyAgICAgMHgxMzQKI2RlZmluZSBORVRXQVZFX0VSRUdfQ0IgICAgICAgIDB4MTAwCiNkZWZpbmUgTkVUV0FWRV9FUkVHX1NQQ1EgICAgICAweDE1NAojZGVmaW5lIE5FVFdBVkVfRVJFR19TUFUgICAgICAgMHgxNTUKI2RlZmluZSBORVRXQVZFX0VSRUdfTElGICAgICAgIDB4MTRlCiNkZWZpbmUgTkVUV0FWRV9FUkVHX0lTUExRICAgICAweDE1NgojZGVmaW5lIE5FVFdBVkVfRVJFR19ISEMgICAgICAgMHgxNTgKI2RlZmluZSBORVRXQVZFX0VSRUdfTkkgICAgICAgIDB4MTZlCiNkZWZpbmUgTkVUV0FWRV9FUkVHX01IUyAgICAgICAweDE2YgojZGVmaW5lIE5FVFdBVkVfRVJFR19URFAgICAgICAgMHgxNDAKI2RlZmluZSBORVRXQVZFX0VSRUdfUkRQICAgICAgIDB4MTUwCiNkZWZpbmUgTkVUV0FWRV9FUkVHX1BBICAgICAgICAweDE2MAojZGVmaW5lIE5FVFdBVkVfRVJFR19FQyAgICAgICAgMHgxODAKI2RlZmluZSBORVRXQVZFX0VSRUdfQ1JCUCAgICAgIDB4MTdhCiNkZWZpbmUgTkVUV0FWRV9FUkVHX0FSVyAgICAgICAweDE2NgoKLyoKICogQ29tbWFuZHMgdXNlZCBpbiB0aGUgZXh0ZW5kZWQgY29tbWFuZCBidWZmZXIKICogTkVUV0FWRV9FUkVHX0NCICgweDEwMC0weDEwRikgCiAqLwojZGVmaW5lIE5FVFdBVkVfQ01EX05PUCAgICAgICAgMHgwMAojZGVmaW5lIE5FVFdBVkVfQ01EX1NSQyAgICAgICAgMHgwMQojZGVmaW5lIE5FVFdBVkVfQ01EX1NUQyAgICAgICAgMHgwMgojZGVmaW5lIE5FVFdBVkVfQ01EX0FNQSAgICAgICAgMHgwMwojZGVmaW5lIE5FVFdBVkVfQ01EX0RNQSAgICAgICAgMHgwNAojZGVmaW5lIE5FVFdBVkVfQ01EX1NBTUEgICAgICAgMHgwNQojZGVmaW5lIE5FVFdBVkVfQ01EX0VSICAgICAgICAgMHgwNgojZGVmaW5lIE5FVFdBVkVfQ01EX0RSICAgICAgICAgMHgwNwojZGVmaW5lIE5FVFdBVkVfQ01EX1RMICAgICAgICAgMHgwOAojZGVmaW5lIE5FVFdBVkVfQ01EX1NSUCAgICAgICAgMHgwOQojZGVmaW5lIE5FVFdBVkVfQ01EX1NTSyAgICAgICAgMHgwYQojZGVmaW5lIE5FVFdBVkVfQ01EX1NNRCAgICAgICAgMHgwYgojZGVmaW5lIE5FVFdBVkVfQ01EX1NBUEQgICAgICAgMHgwYwojZGVmaW5lIE5FVFdBVkVfQ01EX1NTUyAgICAgICAgMHgxMQovKiBFbmQgb2YgQ29tbWFuZCBtYXJrZXIgKi8KI2RlZmluZSBORVRXQVZFX0NNRF9FT0MgICAgICAgIDB4MDAKCi8qIEFTUiByZWdpc3RlciBiaXRzICovCiNkZWZpbmUgTkVUV0FWRV9BU1JfUlhSRFkgICAweDgwCiNkZWZpbmUgTkVUV0FWRV9BU1JfVFhCQSAgICAweDAxCgojZGVmaW5lIFRYX1RJTUVPVVQJCSgoMzIqSFopLzEwMCkKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1yQ29uZlJGVTEgPSAweDEwOyAvKiBSRlUgaW50ZXJydXB0IG1hc2ssIGtlZXAgaGlnaCAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltckNvbmZJRU5BID0gMHgwMjsgLyogSW50ZXJydXB0IGVuYWJsZSAqLwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb3JDb25mSUVOQSAgID0gMHgwMTsgLyogSW50ZXJydXB0IGVuYWJsZSAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvckNvbmZMVkxSRVEgPSAweDQwOyAvKiBLZWVwIGhpZ2ggKi8KCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mUnhFbmEgID0gMHg4MDsgLyogUmVjZWl2ZSBFbmFibGUgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZNQUMgICAgPSAweDIwOyAvKiBNQUMgaG9zdCByZWNlaXZlIG1vZGUqLyAKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZQcm8gICAgPSAweDEwOyAvKiBQcm9taXNjdW91cyAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZkFNUCAgICA9IDB4MDg7IC8qIEFjY2VwdCBNdWx0aWNhc3QgUGFja2V0cyAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZkJjYXN0ICA9IDB4MDQ7IC8qIEFjY2VwdCBCcm9hZGNhc3QgUGFja2V0cyAqLwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZUeEVuYSAgPSAweDgwOyAvKiBUcmFuc21pdCBFbmFibGUgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZNQUMgICAgPSAweDIwOyAvKiBIb3N0IHNlbmRzIE1BQyBtb2RlICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHhDb25mRVVEICAgID0gMHgxMDsgLyogRW5hYmxlIFVuaS1EYXRhIHBhY2tldHMgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZLZXkgICAgPSAweDAyOyAvKiBTY3JhbWJsZSBkYXRhIHBhY2tldHMgKi8Kc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZMb29wICAgPSAweDAxOyAvKiBMb29wYmFjayBtb2RlICovCgovKgogICBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZgogICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQogICBsZWZ0IG91dC4gIElmIHlvdSBjb21waWxlIHdpdGggUENNQ0lBX0RFQlVHPTAsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwKICAgYmUgcHJlc2VudCBidXQgZGlzYWJsZWQgLS0gYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljCiAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKi8KCiNpZmRlZiBQQ01DSUFfREVCVUcKc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOwojZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCnN0YXRpYyBjaGFyICp2ZXJzaW9uID0KIm5ldHdhdmVfY3MuYyAwLjMuMCBUaHUgSnVsIDE3IDE0OjM2OjAyIDE5OTcgKEpvaG4gTWFya3VzIEJq+HJuZGFsZW4pXG4iOwojZWxzZQojZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCgovKiBDaG9vc2UgdGhlIGRvbWFpbiwgZGVmYXVsdCBpcyAweDEwMCAqLwpzdGF0aWMgdV9pbnQgIGRvbWFpbiA9IDB4MTAwOwoKLyogU2NyYW1ibGUga2V5LCByYW5nZSBmcm9tIDB4MCB0byAweGZmZmYuICAKICogMHgwIGlzIG5vIHNjcmFtYmxpbmcuIAogKi8Kc3RhdGljIHVfaW50ICBzY3JhbWJsZV9rZXkgPSAweDA7CgovKiBTaGFyZWQgbWVtb3J5IHNwZWVkLCBpbiBucy4gVGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgCiAqIHRoZSBjYXJkIHNob3VsZCBub3QgYmUgcmVhZCBmYXN0ZXIgdGhhbiBldmVyeSA0MDBucy4gCiAqIFRoaXMgdGltaW5nIHNob3VsZCBiZSBwcm92aWRlZCBieSB0aGUgSEJBLiBJZiBpdCBiZWNvbWVzIGEgCiAqIHByb2JsZW0sIHRyeSBzZXR0aW5nIG1lbV9zcGVlZCB0byA0MDAuIAogKi8Kc3RhdGljIGludCBtZW1fc3BlZWQ7Cgptb2R1bGVfcGFyYW0oZG9tYWluLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oc2NyYW1ibGVfa2V5LCBpbnQsIDApOwptb2R1bGVfcGFyYW0obWVtX3NwZWVkLCBpbnQsIDApOwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKiBQQ01DSUEgKENhcmQgU2VydmljZXMpIHJlbGF0ZWQgZnVuY3Rpb25zICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfcmVsZWFzZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayk7ICAgICAvKiBDYXJkIHJlbW92YWwgKi8Kc3RhdGljIGludCBuZXR3YXZlX3BjbWNpYV9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmFyZyk7IC8qIFJ1bnMgYWZ0ZXIgY2FyZAoJCQkJCQkJCQkJCQkJICAgaW5zZXJ0aW9uICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7ICAgIC8qIERlc3Ryb3kgaW5zdGFuY2UgKi8KCi8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8Kc3RhdGljIHZvaWQgbmV0d2F2ZV9kb3Jlc2V0KGtpb19hZGRyX3QgaW9iYXNlLCB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSk7CnN0YXRpYyB2b2lkIG5ldHdhdmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CgovKiBNaXNjIGRldmljZSBzdHVmZiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsgIC8qIE9wZW4gdGhlIGRldmljZSAqLwpzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7IC8qIENsb3NlIHRoZSBkZXZpY2UgKi8KCi8qIFBhY2tldCB0cmFuc21pc3Npb24gYW5kIFBhY2tldCByZWNlcHRpb24gKi8Kc3RhdGljIGludCBuZXR3YXZlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IG5ldHdhdmVfcngoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwoKLyogSW50ZXJydXB0IHJvdXRpbmVzICovCnN0YXRpYyBpcnFyZXR1cm5fdCBuZXR3YXZlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKc3RhdGljIHZvaWQgbmV0d2F2ZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKCi8qIFN0YXRpc3RpY3MgKi8Kc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwoKLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwpzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MqIG5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwoKc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwoKLyoKICAgQSBzdHJ1Y3QgcGNtY2lhX2RldmljZSBzdHJ1Y3R1cmUgaGFzIGZpZWxkcyBmb3IgbW9zdCB0aGluZ3MgdGhhdCBhcmUgbmVlZGVkCiAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKICAgJ3ByaXYnIHBvaW50ZXIgaW4gYSBzdHJ1Y3QgcGNtY2lhX2RldmljZSBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KICAgYSBkZXZpY2Utc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwgbGlrZSB0aGlzLgoKICAgQSBkcml2ZXIgbmVlZHMgdG8gcHJvdmlkZSBhIGRldl9ub2RlX3Qgc3RydWN0dXJlIGZvciBlYWNoIGRldmljZQogICBvbiBhIGNhcmQuICBJbiBzb21lIGNhc2VzLCB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UgcGVyIGNhcmQgKGZvcgogICBleGFtcGxlLCBldGhlcm5ldCBjYXJkcywgbW9kZW1zKS4gIEluIG90aGVyIGNhc2VzLCB0aGVyZSBtYXkgYmUKICAgbWFueSBhY3R1YWwgb3IgbG9naWNhbCBkZXZpY2VzIChTQ1NJIGFkYXB0ZXJzLCBtZW1vcnkgY2FyZHMgd2l0aAogICBtdWx0aXBsZSBwYXJ0aXRpb25zKS4gIFRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZXMgbmVlZCB0byBiZSBrZXB0CiAgIGluIGEgbGlua2VkIGxpc3Qgc3RhcnRpbmcgYXQgdGhlICdkZXYnIGZpZWxkIG9mIGEgc3RydWN0IHBjbWNpYV9kZXZpY2UKICAgc3RydWN0dXJlLiAgV2UgYWxsb2NhdGUgdGhlbSBpbiB0aGUgY2FyZCdzIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsCiAgIGJlY2F1c2UgdGhleSBnZW5lcmFsbHkgY2FuJ3QgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgoqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZgluZXR3YXZlX2hhbmRsZXJfZGVmOwoKI2RlZmluZSBTSU9DR0lQU05BUAlTSU9DSVdGSVJTVFBSSVYJKyAxCS8qIFNpdGUgU3VydmV5IFNuYXBzaG90ICovCgojZGVmaW5lIE1BWF9FU0EgMTAKCnR5cGVkZWYgc3RydWN0IG5ldF9hZGRyIHsKICAgIHVfY2hhciBhZGRyNDhbNl07Cn0gbmV0X2FkZHI7CgpzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkgewogICAgdV9zaG9ydCBsZW5ndGg7CiAgICB1X2NoYXIgIHN0cnVjdF9yZXZpc2lvbjsKICAgIHVfY2hhciAgcm9hbWluZ19zdGF0ZTsKCQogICAgdV9jaGFyICBzcF9leGlzdHNGbGFnOwogICAgdV9jaGFyICBzcF9saW5rX3F1YWxpdHk7CiAgICB1X2NoYXIgIHNwX21heF9saW5rX3F1YWxpdHk7CiAgICB1X2NoYXIgIGxpbmtRdWFsaXR5R29vZEZhaXJCb3VuZGFyeTsKICAgIHVfY2hhciAgbGlua1F1YWxpdHlGYWlyUG9vckJvdW5kYXJ5OwogICAgdV9jaGFyICBzcF91dGlsaXphdGlvbjsKICAgIHVfY2hhciAgc3BfZ29vZG5lc3M7CiAgICB1X2NoYXIgIHNwX2hvdGhlYWRjb3VudDsKICAgIHVfY2hhciAgcm9hbWluZ19jb25kaXRpb247CgkKICAgIG5ldF9hZGRyIHNwOwogICAgdV9jaGFyICAgbnVtQVBzOwogICAgbmV0X2FkZHIgbmVhckJ5QWNjZXNzUG9pbnRzW01BWF9FU0FdOwp9OwkKICAgCnR5cGVkZWYgc3RydWN0IG5ldHdhdmVfcHJpdmF0ZSB7CglzdHJ1Y3QgcGNtY2lhX2RldmljZQkqcF9kZXY7CiAgICBzcGlubG9ja190CXNwaW5sb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSAoU01QKSAqLwogICAgZGV2X25vZGVfdCBub2RlOwogICAgdV9jaGFyICAgICBfX2lvbWVtICpyYW1CYXNlOwogICAgaW50ICAgICAgICB0aW1lb3V0Q291bnRlcjsKICAgIGludCAgICAgICAgbGFzdEV4ZWM7CiAgICBzdHJ1Y3QgdGltZXJfbGlzdCAgICAgIHdhdGNoZG9nOwkvKiBUbyBhdm9pZCBibG9ja2luZyBzdGF0ZSAqLwogICAgc3RydWN0IHNpdGVfc3VydmV5ICAgICBuc3M7CiAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzICAgaXdfc3RhdHM7ICAgIC8qIFdpcmVsZXNzIHN0YXRzICovCn0gbmV0d2F2ZV9wcml2YXRlOwoKI2lmZGVmIE5FVFdBVkVfU1RBVFMKc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXR3YXZlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKI2VuZGlmCgovKgogKiBUaGUgTmV0d2F2ZSBjYXJkIGlzIGxpdHRsZS1lbmRpYW4sIHNvIHdvbid0IHdvcmsgZm9yIGJpZyBlbmRpYW4KICogc3lzdGVtcy4KICovCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X3VpbnQxNih1X2NoYXIgX19pb21lbSAqc3RhZGRyKSAKewogICAgcmV0dXJuIHJlYWR3KHN0YWRkcik7IC8qIFJldHVybiBvbmx5IDE2IGJpdHMgKi8KfQoKc3RhdGljIGlubGluZSBzaG9ydCBnZXRfaW50MTYodV9jaGFyIF9faW9tZW0gKiBzdGFkZHIpCnsKICAgIHJldHVybiByZWFkdyhzdGFkZHIpOwp9CgovKiAKICogV2FpdCB1bnRpbCB0aGUgV09DIChXcml0ZSBPcGVyYXRpb24gQ29tcGxldGUpIGJpdCBpbiB0aGUgCiAqIEFTUiAoQWRhcHRlciBTdGF0dXMgUmVnaXN0ZXIpIGlzIGFzc2VydGVkLiAKICogVGhpcyBzaG91bGQgaGF2ZSBhYm9ydGVkIGlmIGl0IHRha2VzIHRvbyBsb25nIHRpbWUuIAogKi8Kc3RhdGljIGlubGluZSB2b2lkIHdhaXRfV09DKHVuc2lnbmVkIGludCBpb2Jhc2UpCnsKICAgIC8qIFNwaW4gbG9jayAqLwogICAgd2hpbGUgKChpbmIoaW9iYXNlICsgTkVUV0FWRV9SRUdfQVNSKSAmIDB4OCkgIT0gMHg4KSA7IAp9CgpzdGF0aWMgdm9pZCBuZXR3YXZlX3NuYXBzaG90KG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UsIAoJCQkgICAgIGtpb19hZGRyX3QgaW9iYXNlKSB7CiAgICB1X3Nob3J0IHJlc3VsdEJ1ZmZlcjsKCiAgICAvKiBpZiB0aW1lIHNpbmNlIGxhc3Qgc25hcHNob3QgaXMgPiAxIHNlYy4gKDEwMCBqaWZmaWVzPykgIHRoZW4gdGFrZSAKICAgICAqIG5ldyBzbmFwc2hvdCwgZWxzZSByZXR1cm4gY2FjaGVkIGRhdGEuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHJhdGUuICAKICAgICAqLwogICAgaWYgKCBqaWZmaWVzIC0gcHJpdi0+bGFzdEV4ZWMgPiAxMDApIHsgCgkvKiBUYWtlIHNpdGUgc3VydmV5ICBzbmFwc2hvdCAqLyAKCS8qcHJpbnRrKCBLRVJOX0RFQlVHICJUYWtpbmcgbmV3IHNuYXBzaG90LiAlbGRcbiIsIGppZmZpZXMgLQoJICBwcml2LT5sYXN0RXhlYyk7ICovCgl3YWl0X1dPQyhpb2Jhc2UpOyAKCXdyaXRlYihORVRXQVZFX0NNRF9TU1MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsgCgl3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7IAoJd2FpdF9XT0MoaW9iYXNlKTsgCgoJLyogR2V0IHJlc3VsdCBhbmQgY29weSB0byBjYWNoICovIAoJcmVzdWx0QnVmZmVyID0gcmVhZHcocmFtQmFzZSArIE5FVFdBVkVfRVJFR19DUkJQKTsgCgljb3B5X2Zyb21fcGMoICZwcml2LT5uc3MsIHJhbUJhc2UrcmVzdWx0QnVmZmVyLCAKCQkgICAgICBzaXplb2Yoc3RydWN0IHNpdGVfc3VydmV5KSk7IAogICAgfSAKfQoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMgKGRldikKICoKICogICAgV2lyZWxlc3MgZXh0ZW5zaW9ucyBzdGF0aXN0aWNzCiAqCiAqLwpzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKm5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsJCiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CiAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyogd3N0YXRzOwoJCiAgICB3c3RhdHMgPSAmcHJpdi0+aXdfc3RhdHM7CgogICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgkKICAgIG5ldHdhdmVfc25hcHNob3QoIHByaXYsIHJhbUJhc2UsIGlvYmFzZSk7CgogICAgd3N0YXRzLT5zdGF0dXMgPSBwcml2LT5uc3Mucm9hbWluZ19zdGF0ZTsKICAgIHdzdGF0cy0+cXVhbC5xdWFsID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BDUSk7IAogICAgd3N0YXRzLT5xdWFsLmxldmVsID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpOwogICAgd3N0YXRzLT5xdWFsLm5vaXNlID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BVKSAmIDB4M2Y7CiAgICB3c3RhdHMtPmRpc2NhcmQubndpZCA9IDBMOwogICAgd3N0YXRzLT5kaXNjYXJkLmNvZGUgPSAwTDsKICAgIHdzdGF0cy0+ZGlzY2FyZC5taXNjID0gMEw7CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKICAgIAogICAgcmV0dXJuICZwcml2LT5pd19zdGF0czsKfQoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9hdHRhY2ggKHZvaWQpCiAqCiAqICAgICBDcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhIAogKiAgICAgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIENhcmQgCiAqICAgICBTZXJ2aWNlcy4KICoKICogICAgIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQogKiAgICAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKICogICAgIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgogKi8Kc3RhdGljIGludCBuZXR3YXZlX3Byb2JlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2OwoKICAgIERFQlVHKDAsICJuZXR3YXZlX2F0dGFjaCgpXG4iKTsKCiAgICAvKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3QgcGNtY2lhX2RldmljZSBzdHJ1Y3R1cmUgKi8KICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihuZXR3YXZlX3ByaXZhdGUpKTsKICAgIGlmICghZGV2KQoJcmV0dXJuIC1FTk9NRU07CiAgICBwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHByaXYtPnBfZGV2ID0gbGluazsKICAgIGxpbmstPnByaXYgPSBkZXY7CgogICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCiAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwogICAgLyogbGluay0+aW8uTnVtUG9ydHMyID0gMTY7IAogICAgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7ICovCiAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CiAgICAKICAgIC8qIEludGVycnVwdCBzZXR1cCAqLwogICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CiAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CiAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZuZXR3YXZlX2ludGVycnVwdDsKICAgIAogICAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLwogICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CiAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOwoKICAgIC8qIE5ldHdhdmUgcHJpdmF0ZSBzdHJ1Y3QgaW5pdC4gbGluay9kZXYvbm9kZSBhbHJlYWR5IHRha2VuIGNhcmUgb2YsCiAgICAgKiBvdGhlciBzdHVmZiB6ZXJvJ2QgLSBKZWFuIElJICovCiAgICBzcGluX2xvY2tfaW5pdCgmcHJpdi0+c3BpbmxvY2spOwoKICAgIC8qIE5ldHdhdmUgc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZSAqLwogICAgU0VUX01PRFVMRV9PV05FUihkZXYpOwogICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbmV0d2F2ZV9zdGFydF94bWl0OwogICAgZGV2LT5nZXRfc3RhdHMgID0gJm5ldHdhdmVfZ2V0X3N0YXRzOwogICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OwogICAgLyogd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwogICAgZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmbmV0d2F2ZV9oYW5kbGVyX2RlZjsKCiAgICBkZXYtPnR4X3RpbWVvdXQgPSAmbmV0d2F2ZV93YXRjaGRvZzsKICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwoKICAgIGRldi0+b3BlbiA9ICZuZXR3YXZlX29wZW47CiAgICBkZXYtPnN0b3AgPSAmbmV0d2F2ZV9jbG9zZTsKICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKCiAgICByZXR1cm4gbmV0d2F2ZV9wY21jaWFfY29uZmlnKCBsaW5rKTsKfSAvKiBuZXR3YXZlX2F0dGFjaCAqLwoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9kZXRhY2ggKGxpbmspCiAqCiAqICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCiAqICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQogKiAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAogKiAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCiAqLwpzdGF0aWMgdm9pZCBuZXR3YXZlX2RldGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CgoJREVCVUcoMCwgIm5ldHdhdmVfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKCgluZXR3YXZlX3JlbGVhc2UobGluayk7CgoJaWYgKGxpbmstPmRldl9ub2RlKQoJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CgoJZnJlZV9uZXRkZXYoZGV2KTsKfSAvKiBuZXR3YXZlX2RldGFjaCAqLwoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgY2hhciAqZXh0cmEpCnsKCXN0cmNweSh3cnF1LT5uYW1lLCAiTmV0d2F2ZSIpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTmV0d29yayBJRAogKi8Kc3RhdGljIGludCBuZXR3YXZlX3NldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKCQkJICAgIGNoYXIgKmV4dHJhKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Cgl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgoJaWYoIXdycXUtPm53aWQuZGlzYWJsZWQpIHsKCSAgICBkb21haW4gPSB3cnF1LT5ud2lkLnZhbHVlOwoJICAgIHByaW50ayggS0VSTl9ERUJVRyAiU2V0dGluZyBkb21haW4gdG8gMHgleCUwMnhcbiIsIAoJCSAgICAoZG9tYWluID4+IDgpICYgMHgwMSwgZG9tYWluICYgMHhmZik7CgkgICAgd2FpdF9XT0MoaW9iYXNlKTsKCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfU01ELCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CgkgICAgd3JpdGViKCBkb21haW4gJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CgkgICAgd3JpdGViKChkb21haW4gPj44ICkgJiAweDAxLHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IrMik7CgkgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOwoJfQoKCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwogICAgCglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBOZXR3b3JrIElECiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgY2hhciAqZXh0cmEpCnsKCXdycXUtPm53aWQudmFsdWUgPSBkb21haW47Cgl3cnF1LT5ud2lkLmRpc2FibGVkID0gMDsKCXdycXUtPm53aWQuZml4ZWQgPSAxOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgc2NyYW1ibGUga2V5CiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfc2V0X3NjcmFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKCQkJCWNoYXIgKmtleSkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CgluZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwoJdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOwoKCS8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwoKCXNjcmFtYmxlX2tleSA9IChrZXlbMF0gPDwgOCkgfCBrZXlbMV07Cgl3YWl0X1dPQyhpb2Jhc2UpOwoJd3JpdGViKE5FVFdBVkVfQ01EX1NTSywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwoJd3JpdGViKHNjcmFtYmxlX2tleSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKCXdyaXRlYigoc2NyYW1ibGVfa2V5Pj44KSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKCXdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKCgkvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKICAgIAoJcmV0dXJuIDA7Cn0KCi8qCiAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgc2NyYW1ibGUga2V5CiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X3NjcmFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKCQkJCWNoYXIgKmtleSkKewoJa2V5WzFdID0gc2NyYW1ibGVfa2V5ICYgMHhmZjsKCWtleVswXSA9IChzY3JhbWJsZV9rZXk+PjgpICYgMHhmZjsKCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7Cgl3cnF1LT5lbmNvZGluZy5sZW5ndGggPSAyOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgbW9kZQogKi8Kc3RhdGljIGludCBuZXR3YXZlX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKCQkJICAgIGNoYXIgKmV4dHJhKQp7CglpZihkb21haW4gJiAweDEwMCkKCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKCWVsc2UKCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9BREhPQzsKCglyZXR1cm4gMDsKfQoKLyoKICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCByYW5nZSBpbmZvCiAqLwpzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCQkgICAgIGNoYXIgKmV4dHJhKQp7CglzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKCWludCByZXQgPSAwOwoKCS8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CgoJLyogU2V0IGFsbCB0aGUgaW5mbyB3ZSBkb24ndCBjYXJlIG9yIGRvbid0IGtub3cgYWJvdXQgdG8gemVybyAqLwoJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CgoJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwoJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gOTsJLyogTm90aGluZyBmb3IgdXMgaW4gdjEwIGFuZCB2MTEgKi8KCQkgICAKCS8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0ICovCglyYW5nZS0+dGhyb3VnaHB1dCA9IDQ1MCAqIDEwMDA7CS8qIGRvbid0IGFyZ3VlIG9uIHRoaXMgISAqLwoJcmFuZ2UtPm1pbl9ud2lkID0gMHgwMDAwOwoJcmFuZ2UtPm1heF9ud2lkID0gMHgwMUZGOwoKCXJhbmdlLT5udW1fY2hhbm5lbHMgPSByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CgkJICAgCglyYW5nZS0+c2Vuc2l0aXZpdHkgPSAweDNGOwoJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAyNTU7CglyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAyNTU7CglyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOwoJCSAgIAoJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDE7CglyYW5nZS0+Yml0cmF0ZVswXSA9IDEwMDAwMDA7CS8qIDEgTWIvcyAqLwoKCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gMjsJCS8qIDE2IGJpdHMgc2NyYW1ibGluZyAqLwoJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDE7CglyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDE7CS8qIE9ubHkgb25lIGtleSBwb3NzaWJsZSAqLwoKCXJldHVybiByZXQ7Cn0KCi8qCiAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBzbmFwc2hvdAogKi8Kc3RhdGljIGludCBuZXR3YXZlX2dldF9zbmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKCQkJICAgIGNoYXIgKmV4dHJhKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Cgl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CgoJLyogVGFrZSBzbmFwc2hvdCBvZiBlbnZpcm9ubWVudCAqLwoJbmV0d2F2ZV9zbmFwc2hvdCggcHJpdiwgcmFtQmFzZSwgaW9iYXNlKTsKCXdycXUtPmRhdGEubGVuZ3RoID0gcHJpdi0+bnNzLmxlbmd0aDsKCW1lbWNweShleHRyYSwgKHVfY2hhciAqKSAmcHJpdi0+bnNzLCBzaXplb2YoIHN0cnVjdCBzaXRlX3N1cnZleSkpOwoKCXByaXYtPmxhc3RFeGVjID0gamlmZmllczsKCgkvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKICAgIAoJcmV0dXJuKDApOwp9CgovKgogKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMKICogICAgIFRoaXMgaXMgdGhlIHN0dWZmIHRoYXQgYXJlIHRyZWF0ZWQgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgKGl3Y29uZmlnKQogKi8KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIG5ldHdhdmVfcHJpdmF0ZV9hcmdzW10gPSB7Ci8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KICB7IFNJT0NHSVBTTkFQLCAwLCAKICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgc2l6ZW9mKHN0cnVjdCBzaXRlX3N1cnZleSksIAogICAgImdldHNpdGVzdXJ2ZXkiIH0sCn07CgpzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJbmV0d2F2ZV9oYW5kbGVyW10gPQp7CglOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLwoJbmV0d2F2ZV9nZXRfbmFtZSwJCS8qIFNJT0NHSVdOQU1FICovCgluZXR3YXZlX3NldF9ud2lkLAkJLyogU0lPQ1NJV05XSUQgKi8KCW5ldHdhdmVfZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSRVEgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdGUkVRICovCglOVUxMLAkJCQkvKiBTSU9DU0lXTU9ERSAqLwoJbmV0d2F2ZV9nZXRfbW9kZSwJCS8qIFNJT0NHSVdNT0RFICovCglOVUxMLAkJCQkvKiBTSU9DU0lXU0VOUyAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV1NFTlMgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdSQU5HRSAqLwoJbmV0d2F2ZV9nZXRfcmFuZ2UsCQkvKiBTSU9DR0lXUkFOR0UgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdQUklWICovCglOVUxMLAkJCQkvKiBTSU9DR0lXUFJJViAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1NUQVRTICovCglOVUxMLAkJCQkvKiBTSU9DR0lXU1RBVFMgKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdTUFkgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdTUFkgKi8KCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdBUCAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV0FQICovCglOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCglOVUxMLAkJCQkvKiBTSU9DR0lXQVBMSVNUICovCglOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCglOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCglOVUxMLAkJCQkvKiBTSU9DU0lXRVNTSUQgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdFU1NJRCAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV05JQ0tOICovCglOVUxMLAkJCQkvKiBTSU9DR0lXTklDS04gKi8KCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KCU5VTEwsCQkJCS8qIFNJT0NTSVdSQVRFICovCglOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1JUUyAqLwoJTlVMTCwJCQkJLyogU0lPQ0dJV1JUUyAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdGUkFHICovCglOVUxMLAkJCQkvKiBTSU9DU0lXVFhQT1cgKi8KCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLwoJTlVMTCwJCQkJLyogU0lPQ1NJV1JFVFJZICovCglOVUxMLAkJCQkvKiBTSU9DR0lXUkVUUlkgKi8KCW5ldHdhdmVfc2V0X3NjcmFtYmxlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLwoJbmV0d2F2ZV9nZXRfc2NyYW1ibGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCn07CgpzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJbmV0d2F2ZV9wcml2YXRlX2hhbmRsZXJbXSA9CnsKCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLwoJbmV0d2F2ZV9nZXRfc25hcCwJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDEgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJbmV0d2F2ZV9oYW5kbGVyX2RlZiA9CnsKCS5udW1fc3RhbmRhcmQJPSBzaXplb2YobmV0d2F2ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCgkubnVtX3ByaXZhdGUJPSBzaXplb2YobmV0d2F2ZV9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCgkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBuZXR3YXZlX2hhbmRsZXIsCgkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIG5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyLAoJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIG5ldHdhdmVfcHJpdmF0ZV9hcmdzLAoJLmdldF93aXJlbGVzc19zdGF0cyA9IG5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzLAp9OwoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9wY21jaWFfY29uZmlnIChsaW5rKQogKgogKiAgICAgbmV0d2F2ZV9wY21jaWFfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIAogKiAgICAgZXZlbnQgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCiAqICAgICBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uIAogKgogKi8KCiNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXApkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQoKc3RhdGljIGludCBuZXR3YXZlX3BjbWNpYV9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspIHsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHR1cGxlX3QgdHVwbGU7CiAgICBjaXNwYXJzZV90IHBhcnNlOwogICAgaW50IGksIGosIGxhc3RfcmV0LCBsYXN0X2ZuOwogICAgdV9jaGFyIGJ1Zls2NF07CiAgICB3aW5fcmVxX3QgcmVxOwogICAgbWVtcmVxX3QgbWVtOwogICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBOVUxMOwoKICAgIERFQlVHKDAsICJuZXR3YXZlX3BjbWNpYV9jb25maWcoMHglcClcbiIsIGxpbmspOwoKICAgIC8qCiAgICAgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgogICAgICByZWdpc3RlcnMuCiAgICAqLwogICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwogICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwogICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CiAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CgogICAgLyoKICAgICAqICBUcnkgYWxsb2NhdGluZyBJTyBwb3J0cy4gIFRoaXMgdHJpZXMgYSBmZXcgZml4ZWQgYWRkcmVzc2VzLgogICAgICogIElmIHlvdSB3YW50LCB5b3UgY2FuIGFsc28gcmVhZCB0aGUgY2FyZCdzIGNvbmZpZyB0YWJsZSB0bwogICAgICogIHBpY2sgYWRkcmVzc2VzIC0tIHNlZSB0aGUgc2VyaWFsIGRyaXZlciBmb3IgYW4gZXhhbXBsZS4KICAgICAqLwogICAgZm9yIChpID0gaiA9IDB4MDsgaiA8IDB4NDAwOyBqICs9IDB4MjApIHsKCWxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwoJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CiAgICB9CiAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7Cgljc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIGkpOwoJZ290byBmYWlsZWQ7CiAgICB9CgogICAgLyoKICAgICAqICBOb3cgYWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAogICAgICogIGFjdHVhbGx5IGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4KICAgICAqLwogICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpKTsKCiAgICAvKgogICAgICogIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCiAgICAgKiAgdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCiAgICAgKi8KICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKSk7CgogICAgLyoKICAgICAqICBBbGxvY2F0ZSBhIDMySyBtZW1vcnkgd2luZG93LiAgTm90ZSB0aGF0IHRoZSBzdHJ1Y3QgcGNtY2lhX2RldmljZQogICAgICogIHN0cnVjdHVyZSBwcm92aWRlcyBzcGFjZSBmb3Igb25lIHdpbmRvdyBoYW5kbGUgLS0gaWYgeW91cgogICAgICogIGRldmljZSBuZWVkcyBzZXZlcmFsIHdpbmRvd3MsIHlvdSdsbCBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKICAgICAqICB0aGUgaGFuZGxlcyBpbiB5b3VyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGRldi0+cHJpdi4KICAgICAqLwogICAgREVCVUcoMSwgIlNldHRpbmcgbWVtIHNwZWVkIG9mICVkXG4iLCBtZW1fc3BlZWQpOwoKICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQ018V0lOX0VOQUJMRTsKICAgIHJlcS5CYXNlID0gMDsgcmVxLlNpemUgPSAweDgwMDA7CiAgICByZXEuQWNjZXNzU3BlZWQgPSBtZW1fc3BlZWQ7CiAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmssICZyZXEsICZsaW5rLT53aW4pKTsKICAgIG1lbS5DYXJkT2Zmc2V0ID0gMHgyMDAwMDsgbWVtLlBhZ2UgPSAwOyAKICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKSk7CgogICAgLyogU3RvcmUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb21tb24gd2luZG93IGZyYW1lICovCiAgICByYW1CYXNlID0gaW9yZW1hcChyZXEuQmFzZSwgMHg4MDAwKTsKICAgIHByaXYtPnJhbUJhc2UgPSByYW1CYXNlOwoKICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROwogICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CiAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGxpbmspKTsKCiAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgewoJcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7Cglnb3RvIGZhaWxlZDsKICAgIH0KCiAgICBzdHJjcHkocHJpdi0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKICAgIGxpbmstPmRldl9ub2RlID0gJnByaXYtPm5vZGU7CgogICAgLyogUmVzZXQgY2FyZCBiZWZvcmUgcmVhZGluZyBwaHlzaWNhbCBhZGRyZXNzICovCiAgICBuZXR3YXZlX2RvcmVzZXQoZGV2LT5iYXNlX2FkZHIsIHJhbUJhc2UpOwoKICAgIC8qIFJlYWQgdGhlIGV0aGVybmV0IGFkZHJlc3MgYW5kIGZpbGwgaW4gdGhlIE5ldHdhdmUgcmVnaXN0ZXJzLiAqLwogICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCglkZXYtPmRldl9hZGRyW2ldID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19QQSArIGkpOwoKICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBOZXR3YXZlOiBwb3J0ICUjM2x4LCBpcnEgJWQsIG1lbSAlbHggaWQgIgoJICAgIiVjJWMsIGh3X2FkZHIgIiwgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsCgkgICAodV9sb25nKSByYW1CYXNlLCAoaW50KSByZWFkYihyYW1CYXNlK05FVFdBVkVfRVJFR19OSSksCgkgICAoaW50KSByZWFkYihyYW1CYXNlK05FVFdBVkVfRVJFR19OSSsxKSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQoJcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CgogICAgLyogZ2V0IHJldmlzaW9uIHdvcmRzICovCiAgICBwcmludGsoS0VSTl9ERUJVRyAiTmV0d2F2ZV9yZXNldDogcmV2aXNpb24gJTA0eCAlMDR4XG4iLCAKCSAgIGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19BUlcpLAoJICAgZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FSVysyKSk7CiAgICByZXR1cm4gMDsKCmNzX2ZhaWxlZDoKICAgIGNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKZmFpbGVkOgogICAgbmV0d2F2ZV9yZWxlYXNlKGxpbmspOwogICAgcmV0dXJuIC1FTk9ERVY7Cn0gLyogbmV0d2F2ZV9wY21jaWFfY29uZmlnICovCgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX3JlbGVhc2UgKGFyZykKICoKICogICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIG5ldHdhdmVfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CiAqICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcwogKiAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfcmVsZWFzZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CgluZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwoKCURFQlVHKDAsICJuZXR3YXZlX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOwoKCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKCWlmIChsaW5rLT53aW4pCgkJaW91bm1hcChwcml2LT5yYW1CYXNlKTsKfQoKc3RhdGljIGludCBuZXR3YXZlX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwoKCWlmIChsaW5rLT5vcGVuKQoJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBuZXR3YXZlX3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CgoJaWYgKGxpbmstPm9wZW4pIHsKCQluZXR3YXZlX3Jlc2V0KGRldik7CgkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwoJfQoKCXJldHVybiAwOwp9CgoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9kb3Jlc2V0IChpb0Jhc2UsIHJhbUJhc2UpCiAqCiAqICAgIFByb3BlciBoYXJkd2FyZSByZXNldCBvZiB0aGUgY2FyZC4KICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfZG9yZXNldChraW9fYWRkcl90IGlvQmFzZSwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UpCnsKICAgIC8qIFJlc2V0IGNhcmQgKi8KICAgIHdhaXRfV09DKGlvQmFzZSk7CiAgICBvdXRiKDB4ODAsIGlvQmFzZSArIE5FVFdBVkVfUkVHX1BNUik7CiAgICB3cml0ZWIoMHgwOCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19BU0NDKTsgLyogQml0IDMgaXMgV09DICovCiAgICBvdXRiKDB4MCwgaW9CYXNlICsgTkVUV0FWRV9SRUdfUE1SKTsgLyogcmVsZWFzZSByZXNldCAqLwp9CgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX3Jlc2V0IChkZXYpCiAqCiAqICAgIFJlc2V0IGFuZCByZXN0b3JlIGFsbCBvZiB0aGUgbmV0d2F2ZSByZWdpc3RlcnMgCiAqLwpzdGF0aWMgdm9pZCBuZXR3YXZlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKICAgIC8qIHVfY2hhciBzdGF0ZTsgKi8KICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CiAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwoKICAgIERFQlVHKDAsICJuZXR3YXZlX3Jlc2V0OiBEb25lIHdpdGggaGFyZHdhcmUgcmVzZXRcbiIpOwoKICAgIHByaXYtPnRpbWVvdXRDb3VudGVyID0gMDsKCiAgICAvKiBSZXNldCBjYXJkICovCiAgICBuZXR3YXZlX2RvcmVzZXQoaW9iYXNlLCByYW1CYXNlKTsKICAgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX3Jlc2V0OiBEb25lIHdpdGggaGFyZHdhcmUgcmVzZXRcbiIpOwoJCiAgICAvKiBXcml0ZSBhIE5PUCB0byBjaGVjayB0aGUgY2FyZCAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9OT1AsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKCQogICAgLyogU2V0IHJlY2VpdmUgY29uZiAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9TUkMsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKICAgIHdyaXRlYihyeENvbmZSeEVuYSArIHJ4Q29uZkJjYXN0LCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CiAgICAKICAgIC8qIFNldCB0cmFuc21pdCBjb25mICovCiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX1NUQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKHR4Q29uZlR4RW5hLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CiAgICAKICAgIC8qIE5vdyBzZXQgdGhlIE1VIERvbWFpbiAqLwogICAgcHJpbnRrKEtFUk5fREVCVUcgIlNldHRpbmcgZG9tYWluIHRvIDB4JXglMDJ4XG4iLCAoZG9tYWluID4+IDgpICYgMHgwMSwgZG9tYWluICYgMHhmZik7CiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX1NNRCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKGRvbWFpbiAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKICAgIHdyaXRlYigoZG9tYWluPj44KSAmIDB4MDEsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKCQogICAgLyogU2V0IHNjcmFtYmxlIGtleSAqLwogICAgcHJpbnRrKEtFUk5fREVCVUcgIlNldHRpbmcgc2NyYW1ibGUga2V5IHRvIDB4JXhcbiIsIHNjcmFtYmxlX2tleSk7CiAgICB3YWl0X1dPQyhpb2Jhc2UpOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX1NTSywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKHNjcmFtYmxlX2tleSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKICAgIHdyaXRlYigoc2NyYW1ibGVfa2V5Pj44KSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKCiAgICAvKiBFbmFibGUgaW50ZXJydXB0cywgYml0IDQgaGlnaCB0byBrZWVwIHVudXNlZAogICAgICogc291cmNlIGZyb20gaW50ZXJydXB0aW5nIHVzLCBiaXQgMiBoaWdoIHRvIAogICAgICogc2V0IGludGVycnVwdCBlbmFibGUsIDU2NyB0byBlbmFibGUgVHhETiwgCiAgICAgKiBSeEVyciBhbmQgUnhSZHkKICAgICAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIG91dGIoaW1yQ29uZklFTkEraW1yQ29uZlJGVTEsIGlvYmFzZSArIE5FVFdBVkVfUkVHX0lNUik7CgogICAgLyogSGVudCA0IGJ5dGVzIGZyYSAweDE3MC4gU2thbCB2YWVyZSAwYSwyOSw4OCwzNgogICAgICogd2FpdFdPQwogICAgICogc2tyaXYgODAgdGlsIGQwMDA6MzY4OAogICAgICogc2pla2sgb20gZGV0IGJsZSA4MAogICAgICovCiAgICAKICAgIC8qIEVuYWJsZSBSZWNlaXZlciAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9FUiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOwogICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwoJCiAgICAvKiBTZXQgdGhlIElFTkEgYml0IGluIENPUiAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIG91dGIoY29yQ29uZklFTkEgKyBjb3JDb25mTFZMUkVRLCBpb2Jhc2UgKyBORVRXQVZFX1JFR19DT1IpOwp9CgovKgogKiBGdW5jdGlvbiBuZXR3YXZlX2h3X3htaXQgKGRhdGEsIGxlbiwgZGV2KSAgICAKICovCnN0YXRpYyBpbnQgbmV0d2F2ZV9od194bWl0KHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCBsZW4sCgkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpIHsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICB1bnNpZ25lZCBpbnQgVHhGcmVlTGlzdCwKCSAgICAgICAgIGN1ckJ1ZmYsCgkgICAgICAgICBNYXhEYXRhLCAKICAgICAgICAgICAgICAgICBEYXRhT2Zmc2V0OwogICAgaW50IHRtcGNvdW50OyAKCQogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHVfY2hhciBfX2lvbWVtICogcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CiAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwoKICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwoKICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZSAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIGlmICgoaW5iKGlvYmFzZStORVRXQVZFX1JFR19BU1IpICYgTkVUV0FWRV9BU1JfVFhCQSkgPT0gMCkgewoJLyogTm8gYnVmZmVycyBhdmFpbGFibGUgKi8KCXByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX2h3X3htaXQ6ICVzIC0gbm8geG1pdCBidWZmZXJzIGF2YWlsYWJsZS5cbiIsCgkgICAgICAgZGV2LT5uYW1lKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gMTsKICAgIH0KCiAgICBwcml2LT5zdGF0cy50eF9ieXRlcyArPSBsZW47CgogICAgREVCVUcoMywgIlRyYW5zbWl0dGluZyB3aXRoIFNQQ1EgJXggU1BVICV4IExJRiAleCBJU1BMUSAleFxuIiwKCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUENRKSwKCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUFUpLAoJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0xJRiksCgkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpKTsKCiAgICAvKiBOb3cgdHJ5IHRvIGluc2VydCBpdCBpbnRvIHRoZSBhZGFwdGVycyBmcmVlIG1lbW9yeSAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIFR4RnJlZUxpc3QgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKTsKICAgIE1heERhdGEgICAgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKzIpOwogICAgRGF0YU9mZnNldCA9IGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19URFArNCk7CgkKICAgIERFQlVHKDMsICJUeEZyZWVMaXN0ICV4LCBNYXhEYXRhICV4LCBEYXRhT2Zmc2V0ICV4XG4iLAoJICBUeEZyZWVMaXN0LCBNYXhEYXRhLCBEYXRhT2Zmc2V0KTsKCiAgICAvKiBDb3B5IHBhY2tldCB0byB0aGUgYWRhcHRlciBmcmFnbWVudCBidWZmZXJzICovCiAgICBjdXJCdWZmID0gVHhGcmVlTGlzdDsgCiAgICB0bXBjb3VudCA9IDA7IAogICAgd2hpbGUgKHRtcGNvdW50IDwgbGVuKSB7CglpbnQgdG1wbGVuID0gbGVuIC0gdG1wY291bnQ7IAoJY29weV90b19wYyhyYW1CYXNlICsgY3VyQnVmZiArIERhdGFPZmZzZXQsIGRhdGEgKyB0bXBjb3VudCwgCgkJICAgKHRtcGxlbiA8IE1heERhdGEpID8gdG1wbGVuIDogTWF4RGF0YSk7Cgl0bXBjb3VudCArPSBNYXhEYXRhOwoJCQkKCS8qIEFkdmFuY2UgdG8gbmV4dCBidWZmZXIgKi8KCWN1ckJ1ZmYgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBjdXJCdWZmKTsKICAgIH0KICAgIAogICAgLyogTm93IGlzc3VlIHRyYW5zbWl0IGxpc3QgKi8KICAgIHdhaXRfV09DKGlvYmFzZSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfVEwsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKICAgIHdyaXRlYihsZW4gJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CiAgICB3cml0ZWIoKGxlbj4+OCkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IG5ldHdhdmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CgkvKiBUaGlzIGZsYWcgaW5kaWNhdGUgdGhhdCB0aGUgaGFyZHdhcmUgY2FuJ3QgcGVyZm9ybSBhIHRyYW5zbWlzc2lvbi4KCSAqIFRoZW9yaXRpY2FsbHksIE5FVDMgY2hlY2sgaXQgYmVmb3JlIHNlbmRpbmcgYSBwYWNrZXQgdG8gdGhlIGRyaXZlciwKCSAqIGJ1dCBpbiBmYWN0IGl0IG5ldmVyIGRvIHRoYXQgYW5kIHBvb2wgY29udGludW91c2x5LgoJICogQXMgdGhlIHdhdGNoZG9nIHdpbGwgYWJvcnQgdG9vIGxvbmcgdHJhbnNtaXNzaW9ucywgd2UgYXJlIHF1aXRlIHNhZmUuLi4KCSAqLwoKICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCiAgICB7CglzaG9ydCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKCXVuc2lnbmVkIGNoYXIqIGJ1ZiA9IHNrYi0+ZGF0YTsKCQoJaWYgKG5ldHdhdmVfaHdfeG1pdCggYnVmLCBsZW5ndGgsIGRldikgPT0gMSkgewoJICAgIC8qIFNvbWUgZXJyb3IsIGxldCdzIG1ha2UgdGhlbSBjYWxsIHVzIGFub3RoZXIgdGltZT8gKi8KCSAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOwoJfQoJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAgICB9CiAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CiAgICAKICAgIHJldHVybiAwOwp9IC8qIG5ldHdhdmVfc3RhcnRfeG1pdCAqLwoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV9pbnRlcnJ1cHQgKGlycSwgZGV2X2lkLCByZWdzKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIE5ldHdhdmUgY2FyZC4gVGhpcwogKiAgICByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyOiAKICoJICAxLiBBIHBhY2tldCBpcyByZWNlaXZlZC4KICoJICAyLiBBIHBhY2tldCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSB1bml0IGlzCiAqCSAgICAgcmVhZHkgdG8gdHJhbnNtaXQgYW5vdGhlciBwYWNrZXQuCiAqCSAgMy4gQSBjb21tYW5kIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgogKi8Kc3RhdGljIGlycXJldHVybl90IG5ldHdhdmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCnsKICAgIGtpb19hZGRyX3QgaW9iYXNlOwogICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2U7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOwogICAgc3RydWN0IG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IHByaXYtPnBfZGV2OwogICAgaW50IGk7CiAgICAKICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKCXJldHVybiBJUlFfTk9ORTsKICAgIAogICAgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CiAgICByYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKCQogICAgLyogTm93IGZpbmQgd2hhdCBjYXVzZWQgdGhlIGludGVycnVwdCwgY2hlY2sgd2hpbGUgaW50ZXJydXB0cyByZWFkeSAqLwogICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKCXVfY2hhciBzdGF0dXM7CgkJCgl3YWl0X1dPQyhpb2Jhc2UpOwkKCWlmICghKGluYihpb2Jhc2UrTkVUV0FWRV9SRUdfQ0NTUikgJiAweDAyKSkKCSAgICBicmVhazsgLyogTm9uZSBvZiB0aGUgaW50ZXJydXB0IHNvdXJjZXMgYXNzZXJ0ZWQgKG5vcm1hbCBleGl0KSAqLwoJCiAgICAgICAgc3RhdHVzID0gaW5iKGlvYmFzZSArIE5FVFdBVkVfUkVHX0FTUik7CgkJCglpZiAoIXBjbWNpYV9kZXZfcHJlc2VudChsaW5rKSkgewoJICAgIERFQlVHKDEsICJuZXR3YXZlX2ludGVycnVwdDogSW50ZXJydXB0IHdpdGggc3RhdHVzIDB4JXggIgoJCSAgImZyb20gcmVtb3ZlZCBvciBzdXNwZW5kZWQgY2FyZCFcbiIsIHN0YXR1cyk7CgkgICAgYnJlYWs7Cgl9CgkJCgkvKiBSeFJkeSAqLwoJaWYgKHN0YXR1cyAmIDB4ODApIHsKCSAgICBuZXR3YXZlX3J4KGRldik7CgkgICAgLyogd2FpdF9XT0MoaW9iYXNlKTsgKi8KCSAgICAvKiBSeFJkeSBjYW5ub3QgYmUgcmVzZXQgZGlyZWN0bHkgYnkgdGhlIGhvc3QgKi8KCX0KCS8qIFJ4RXJyICovCglpZiAoc3RhdHVzICYgMHg0MCkgewoJICAgIHVfY2hhciByc2VyOwoJCQkKCSAgICByc2VyID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19SU0VSKTsJCQkKCSAgICAKCSAgICBpZiAocnNlciAmIDB4MDQpIHsKCQkrK3ByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQ7IAoJCSsrcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9yczsKCSAgICB9CgkgICAgaWYgKHJzZXIgJiAweDAyKQoJCSsrcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzOwoJCQkKCSAgICAvKiBDbGVhciB0aGUgUnhFcnIgYml0IGluIFJTRVIuIFJTRVIrNCBpcyB0aGUKCSAgICAgKiB3cml0ZSBwYXJ0LiBBbHNvIGNsZWFyIHRoZSBSeENSQyAoMHgwNCkgYW5kIAoJICAgICAqIFJ4QmlnICgweDAyKSBiaXRzIGlmIHByZXNlbnQgKi8KCSAgICB3YWl0X1dPQyhpb2Jhc2UpOwoJICAgIHdyaXRlYigweDQwIHwgKHJzZXIgJiAweDA2KSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19SU0VSICsgNCk7CgoJICAgIC8qIFdyaXRlIGJpdCA2IGhpZ2ggdG8gQVNDQyB0byBjbGVhciBSeEVyciBpbiBBU1IsCgkgICAgICogV09DIG11c3QgYmUgc2V0IGZpcnN0ISAKCSAgICAgKi8KCSAgICB3YWl0X1dPQyhpb2Jhc2UpOwoJICAgIHdyaXRlYigweDQwLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FTQ0MpOwoKCSAgICAvKiBSZW1lbWJlciB0byBjb3VudCB1cCBwcml2LT5zdGF0cyBvbiBlcnJvciBwYWNrZXRzICovCgkgICAgKytwcml2LT5zdGF0cy5yeF9lcnJvcnM7Cgl9CgkvKiBUeEROICovCglpZiAoc3RhdHVzICYgMHgyMCkgewoJICAgIGludCB0eFN0YXR1czsKCgkgICAgdHhTdGF0dXMgPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIpOwoJICAgIERFQlVHKDMsICJUcmFuc21pdCBkb25lLiBUU0VSID0gJXggaWQgJXhcbiIsIAoJCSAgdHhTdGF0dXMsIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUiArIDEpKTsKCSAgICAKCSAgICBpZiAodHhTdGF0dXMgJiAweDIwKSB7CgkJLyogVHJhbnNtaXR0aW5nIHdhcyBva2F5LCBjbGVhciBiaXRzICovCgkJd2FpdF9XT0MoaW9iYXNlKTsKCQl3cml0ZWIoMHgyZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSICsgNCk7CgkJKytwcml2LT5zdGF0cy50eF9wYWNrZXRzOwoJICAgIH0KCQkJCgkgICAgaWYgKHR4U3RhdHVzICYgMHhkMCkgewoJCWlmICh0eFN0YXR1cyAmIDB4ODApIHsKCQkgICAgKytwcml2LT5zdGF0cy5jb2xsaXNpb25zOyAvKiBCZWNhdXNlIG9mIC9wcm9jL25ldC9kZXYqLwoJCSAgICAvKiArK3ByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzOyAqLwoJCSAgICAvKiBwcmludGsoIkNvbGxpc2lvbi4gJWxkXG4iLCBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydCk7ICovCgkJfQoJCWlmICh0eFN0YXR1cyAmIDB4NDApIAoJCSAgICArK3ByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOwoJCS8qIDB4ODAgVHhHVSBUcmFuc21pdCBnaXZldXAgLSBuaW5lIHRpbWVzIGFuZCBubyBsdWNrCgkJICogMHg0MCBUeE5PQVAgTm8gYWNjZXNzIHBvaW50LiBEaXNjYXJkZWQgcGFja2V0LgoJCSAqIDB4MTAgVHhFcnIgVHJhbnNtaXQgZXJyb3IuIEFsd2F5cyBzZXQgd2hlbiAKCQkgKiAgICAgIFR4R1UgYW5kIFR4Tk9BUCBpcyBzZXQuIChUaG9zZSBhcmUgdGhlIG9ubHkgb25lcwoJCSAqICAgICAgdG8gc2V0IFR4RXJyKS4KCQkgKi8KCQlERUJVRygzLCAibmV0d2F2ZV9pbnRlcnJ1cHQ6IFR4RE4gd2l0aCBlcnJvciBzdGF0dXMgJXhcbiIsIAoJCSAgICAgIHR4U3RhdHVzKTsKCQkKCQkvKiBDbGVhciBvdXQgVHhHVSwgVHhOT0FQLCBUeEVyciBhbmQgVHhUcnlzICovCgkJd2FpdF9XT0MoaW9iYXNlKTsKCQl3cml0ZWIoMHhkZiAmIHR4U3RhdHVzLCByYW1CYXNlK05FVFdBVkVfRVJFR19UU0VSKzQpOwoJCSsrcHJpdi0+c3RhdHMudHhfZXJyb3JzOwoJICAgIH0KCSAgICBERUJVRygzLCAiTmV3IHN0YXR1cyBpcyBUU0VSICV4IEFTUiAleFxuIiwKCQkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUiksCgkJICBpbmIoaW9iYXNlICsgTkVUV0FWRV9SRUdfQVNSKSk7CgoJICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKCX0KCS8qIFR4QkEsIHRoaXMgd291bGQgdHJpZ2dlciBvbiBhbGwgZXJyb3IgcGFja2V0cyByZWNlaXZlZCAqLwoJLyogaWYgKHN0YXR1cyAmIDB4MDEpIHsKCSAgIERFQlVHKDQsICJUcmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZSwgJXhcbiIsIHN0YXR1cyk7CgkgICB9CgkgICAqLwogICAgfQogICAgLyogSGFuZGxlZCBpZiB3ZSBsb29wZWQgYXQgbGVhc3Qgb25lIHRpbWUgLSBKZWFuIElJICovCiAgICByZXR1cm4gSVJRX1JFVFZBTChpKTsKfSAvKiBuZXR3YXZlX2ludGVycnVwdCAqLwoKLyoKICogRnVuY3Rpb24gbmV0d2F2ZV93YXRjaGRvZyAoYSkKICoKICogICAgV2F0Y2hkb2cgOiB3aGVuIHdlIHN0YXJ0IGEgdHJhbnNtaXNzaW9uLCB3ZSBzZXQgYSB0aW1lciBpbiB0aGUKICogICAga2VybmVsLiAgSWYgdGhlIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSwgdGhpcyB0aW1lciBpcyBkaXNhYmxlZC4gSWYKICogICAgaXQgZXhwaXJlLCB3ZSByZXNldCB0aGUgY2FyZC4KICoKICovCnN0YXRpYyB2b2lkIG5ldHdhdmVfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewoKICAgIERFQlVHKDEsICIlczogbmV0d2F2ZV93YXRjaGRvZzogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZFxuIiwgZGV2LT5uYW1lKTsKICAgIG5ldHdhdmVfcmVzZXQoZGV2KTsKICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwp9IC8qIG5ldHdhdmVfd2F0Y2hkb2cgKi8KCnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0d2F2ZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKCiAgICB1cGRhdGVfc3RhdHMoZGV2KTsKCiAgICBERUJVRygyLCAibmV0d2F2ZTogU1BDUSAleCBTUFUgJXggTElGICV4IElTUExRICV4IE1IUyAleCByeHR4ICV4IgoJICAiICV4IHR4ICV4ICV4ICV4ICV4XG4iLCAKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUENRKSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUFUpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0xJRiksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX01IUyksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweGUpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHhmKSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4MTgpLAoJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHgxOSksCgkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDFhKSwKCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4MWIpKTsKCiAgICByZXR1cm4gJnByaXYtPnN0YXRzOwp9CgpzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewogICAgLy91bnNpZ25lZCBsb25nIGZsYWdzOwovKiAgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsgKi8KCiAgICAvL3NwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwoKLyogICAgcHJpdi0+c3RhdHMucnhfcGFja2V0cyA9IHJlYWRiKHByaXYtPnJhbUJhc2UgKyAweDE4ZSk7IAogICAgcHJpdi0+c3RhdHMudHhfcGFja2V0cyA9IHJlYWRiKHByaXYtPnJhbUJhc2UgKyAweDE4Zik7ICovCgogICAgLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOwp9CgpzdGF0aWMgaW50IG5ldHdhdmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CiAgICB1X2NoYXIgcnhTdGF0dXM7CiAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKICAgIHVuc2lnbmVkIGludCBjdXJCdWZmZXIsCgkJcmN2TGlzdDsKICAgIGludCByY3ZMZW47CiAgICBpbnQgdG1wY291bnQgPSAwOwogICAgaW50IGRhdGFDb3VudCwgZGF0YU9mZnNldDsKICAgIGludCBpOwogICAgdV9jaGFyICpwdHI7CgkKICAgIERFQlVHKDMsICJ4aW53X3J4OiBSZWNlaXZpbmcgLi4uIFxuIik7CgogICAgLyogUmVjZWl2ZSBtYXggMTAgcGFja2V0cyBmb3Igbm93LiAqLwogICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKCS8qIEFueSBwYWNrZXRzPyAqLwoJd2FpdF9XT0MoaW9iYXNlKTsKCXJ4U3RhdHVzID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19SU0VSKTsJCQoJaWYgKCAhKCByeFN0YXR1cyAmIDB4ODApKSAvKiBObyBtb3JlIHBhY2tldHMgKi8KCSAgICBicmVhazsKCQkKCS8qIENoZWNrIGlmIG11bHRpY2FzdC9icm9hZGNhc3Qgb3Igb3RoZXIgKi8KCS8qIG11bHRpY2FzdCA9IChyeFN0YXR1cyAmIDB4MjApOyAgKi8KCQkKCS8qIFRoZSByZWNlaXZlIGxpc3QgcG9pbnRlciBhbmQgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgKi8KCXdhaXRfV09DKGlvYmFzZSk7CglyY3ZMZW4gID0gZ2V0X2ludDE2KCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JEUCk7CglyY3ZMaXN0ID0gZ2V0X3VpbnQxNiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19SRFAgKyAyKTsKCQkKCWlmIChyY3ZMZW4gPCAwKSB7CgkgICAgcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfcng6IFJlY2VpdmUgcGFja2V0IHdpdGggbGVuICVkXG4iLCAKCQkgICByY3ZMZW4pOwoJICAgIHJldHVybiAwOwoJfQoJCQoJc2tiID0gZGV2X2FsbG9jX3NrYihyY3ZMZW4rNSk7CglpZiAoc2tiID09IE5VTEwpIHsKCSAgICBERUJVRygxLCAibmV0d2F2ZV9yeDogQ291bGQgbm90IGFsbG9jYXRlIGFuIHNrX2J1ZmYgb2YgIgoJCSAgImxlbmd0aCAlZFxuIiwgcmN2TGVuKTsKCSAgICArK3ByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQ7IAoJICAgIC8qIFRlbGwgdGhlIGFkYXB0ZXIgdG8gc2tpcCB0aGUgcGFja2V0ICovCgkgICAgd2FpdF9XT0MoaW9iYXNlKTsKCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1JQLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CgkgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOwoJICAgIHJldHVybiAwOwoJfQoKCXNrYl9yZXNlcnZlKCBza2IsIDIpOyAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAqLwoJc2tiX3B1dCggc2tiLCByY3ZMZW4pOwoJc2tiLT5kZXYgPSBkZXY7CgoJLyogQ29weSBwYWNrZXQgZnJhZ21lbnRzIHRvIHRoZSBza2IgZGF0YSBhcmVhICovCglwdHIgPSAodV9jaGFyKikgc2tiLT5kYXRhOwoJY3VyQnVmZmVyID0gcmN2TGlzdDsKCXRtcGNvdW50ID0gMDsgCgl3aGlsZSAoIHRtcGNvdW50IDwgcmN2TGVuKSB7CgkgICAgLyogR2V0IGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGN1cnJlbnQgYnVmZmVyICovCgkgICAgZGF0YUNvdW50ICA9IGdldF91aW50MTYoIHJhbUJhc2UrY3VyQnVmZmVyKzIpOwoJICAgIGRhdGFPZmZzZXQgPSBnZXRfdWludDE2KCByYW1CYXNlK2N1ckJ1ZmZlcis0KTsKCQkKCSAgICBjb3B5X2Zyb21fcGMoIHB0ciArIHRtcGNvdW50LAoJCQkgIHJhbUJhc2UrY3VyQnVmZmVyK2RhdGFPZmZzZXQsIGRhdGFDb3VudCk7CgoJICAgIHRtcGNvdW50ICs9IGRhdGFDb3VudDsKCQkKCSAgICAvKiBQb2ludCB0byBuZXh0IGJ1ZmZlciAqLwoJICAgIGN1ckJ1ZmZlciA9IGdldF91aW50MTYocmFtQmFzZSArIGN1ckJ1ZmZlcik7Cgl9CgkKCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsZGV2KTsKCS8qIFF1ZXVlIHBhY2tldCBmb3IgbmV0d29yayBsYXllciAqLwoJbmV0aWZfcngoc2tiKTsKCglkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwoJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOwoJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcmN2TGVuOwoKCS8qIEdvdCB0aGUgcGFja2V0LCB0ZWxsIHRoZSBhZGFwdGVyIHRvIHNraXAgaXQgKi8KCXdhaXRfV09DKGlvYmFzZSk7Cgl3cml0ZWIoTkVUV0FWRV9DTURfU1JQLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7Cgl3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CglERUJVRygzLCAiUGFja2V0IHJlY2VwdGlvbiBva1xuIik7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBuZXR3YXZlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gcHJpdi0+cF9kZXY7CgogICAgREVCVUcoMSwgIm5ldHdhdmVfb3Blbjogc3RhcnRpbmcuXG4iKTsKICAgIAogICAgaWYgKCFwY21jaWFfZGV2X3ByZXNlbnQobGluaykpCglyZXR1cm4gLUVOT0RFVjsKCiAgICBsaW5rLT5vcGVuKys7CgogICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKICAgIG5ldHdhdmVfcmVzZXQoZGV2KTsKCQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbmV0d2F2ZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CiAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBwcml2LT5wX2RldjsKCiAgICBERUJVRygxLCAibmV0d2F2ZV9jbG9zZTogZmluaXNoaW5nLlxuIik7CgogICAgbGluay0+b3Blbi0tOwogICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgbmV0d2F2ZV9pZHNbXSA9IHsKCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJYaXJjb20iLCAiQ3JlZGl0Q2FyZCBOZXR3YXZlIiwgMHgyZTNlZTg0NSwgMHg1NGUyOGEyOCksCglQQ01DSUFfREVWSUNFX05VTEwsCn07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBuZXR3YXZlX2lkcyk7CgpzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbmV0d2F2ZV9kcml2ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuZHJ2CQk9IHsKCQkubmFtZQk9ICJuZXR3YXZlX2NzIiwKCX0sCgkucHJvYmUJCT0gbmV0d2F2ZV9wcm9iZSwKCS5yZW1vdmUJCT0gbmV0d2F2ZV9kZXRhY2gsCgkuaWRfdGFibGUgICAgICAgPSBuZXR3YXZlX2lkcywKCS5zdXNwZW5kCT0gbmV0d2F2ZV9zdXNwZW5kLAoJLnJlc3VtZQkJPSBuZXR3YXZlX3Jlc3VtZSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGluaXRfbmV0d2F2ZV9jcyh2b2lkKQp7CglyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmbmV0d2F2ZV9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uZXR3YXZlX2NzKHZvaWQpCnsKCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmbmV0d2F2ZV9kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdChpbml0X25ldHdhdmVfY3MpOwptb2R1bGVfZXhpdChleGl0X25ldHdhdmVfY3MpOwoKLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCiAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCiAgIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAogICBudW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgYW5kIGRvCiAgIGJlc3QtZWZmb3J0IGZpbHRlcmluZy4KICovCnN0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOwogICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHVfY2hhciBfX2lvbWVtICogcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CiAgICB1X2NoYXIgIHJjdk1vZGUgPSAwOwogICAKI2lmZGVmIFBDTUNJQV9ERUJVRwogICAgaWYgKHBjX2RlYnVnID4gMikgewoJc3RhdGljIGludCBvbGQ7CglpZiAob2xkICE9IGRldi0+bWNfY291bnQpIHsKCSAgICBvbGQgPSBkZXYtPm1jX2NvdW50OwoJICAgIERFQlVHKDAsICIlczogc2V0dGluZyBSeCBtb2RlIHRvICVkIGFkZHJlc3Nlcy5cbiIsCgkJICBkZXYtPm5hbWUsIGRldi0+bWNfY291bnQpOwoJfQogICAgfQojZW5kaWYKCQogICAgaWYgKGRldi0+bWNfY291bnQgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CgkvKiBNdWx0aWNhc3QgTW9kZSAqLwoJcmN2TW9kZSA9IHJ4Q29uZlJ4RW5hICsgcnhDb25mQU1QICsgcnhDb25mQmNhc3Q7CiAgICB9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewoJLyogUHJvbWlzY291cyBtb2RlICovCglyY3ZNb2RlID0gcnhDb25mUnhFbmEgKyByeENvbmZQcm8gKyByeENvbmZBTVAgKyByeENvbmZCY2FzdDsKICAgIH0gZWxzZSB7CgkvKiBOb3JtYWwgbW9kZSAqLwoJcmN2TW9kZSA9IHJ4Q29uZlJ4RW5hICsgcnhDb25mQmNhc3Q7CiAgICB9CgkKICAgIC8qIHByaW50aygibmV0d2F2ZSBzZXRfbXVsdGljYXN0X2xpc3Q6IHJjdk1vZGUgdG8gJXhcbiIsIHJjdk1vZGUpOyovCiAgICAvKiBOb3cgc2V0IHJlY2VpdmUgbW9kZSAqLwogICAgd2FpdF9XT0MoaW9iYXNlKTsKICAgIHdyaXRlYihORVRXQVZFX0NNRF9TUkMsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKICAgIHdyaXRlYihyY3ZNb2RlLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CiAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7Cn0KTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=