Return-Path: Message-ID: <664d43d60812182336h37a6034bu9549863fd23464bb@mail.gmail.com> Date: Fri, 19 Dec 2008 09:36:33 +0200 From: event To: "Marcel Holtmann" Subject: Re: [PATCH] Gateway profile Cc: linux-bluetooth@vger.kernel.org In-Reply-To: <1229482133.10889.5.camel@violet> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_23039_28685571.1229672193838" References: <664d43d60812151512y6631ebf2j9665e1473193077d@mail.gmail.com> <664d43d60812151514m6c225403i528453fcb6f08430@mail.gmail.com> <1229482133.10889.5.camel@violet> List-ID: ------=_Part_23039_28685571.1229672193838 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello Marcel, Thank you for your comments. Here are reworked fixed patches attached. I've missed when you changed repo :). I've noticed IPC infrastructure and going to make use of it in future version. I fully agree for code style. Sorry for that. Was too stupid to setup my editor correctly :). Vale, event On Wed, Dec 17, 2008 at 04:48, Marcel Holtmann wrote: > Hi Leonid, > >> I've implemented gateway profile. I've tested basic things, like >> place/cancel/answer call. Others are in development. Some could not be >> tested as my carrier doesn't provide corresponding services (like >> 3-way call, etc.) so any help welcome. > > thanks for the works, but can you please base the patch against the > latest GIT tree. It is kinda hard to review things that might already > have been implemented like sco_listen. > > audio/audio-api.txt | 94 +++++ > audio/device.h | 7 > audio/gateway.c | 938 +++++++++++++++++++++++++++++++++++++++++++++++++++ > audio/gateway.h | 11 > audio/manager.c | 124 ++++-- > common/glib-helper.c | 85 +++- > common/glib-helper.h | 1 > 7 files changed, 1205 insertions(+), 55 deletions(-) > > So any changes to glib-helper.[ch] have to be in a separate patch and > need to be discussed independent from the gateway implementation. > > Any audio-api.txt stuff should also go separately since that has to be > discussed. Also we can't send PCM data over D-Bus. It just doesn't work > like that. We do have the internal IPC for that and plugins for ALSA, > GStreamer and PulseAudio that should be used. > > However the most important part is that you follow the coding style and > that is the kernel coding style. You make it really hard for us to > review the code like this and it can't be applied. I really want you to > add support for the gateway role to BlueZ, but the overall code in the > project needs to follow the same rules. > > So please fix these issues first and then we do a deep review of it. > > Regards > > Marcel > > > ------=_Part_23039_28685571.1229672193838 Content-Type: application/octet-stream; name=gateway.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fowj13ru0 Content-Disposition: attachment; filename=gateway.patch ZGlmZiAtLWdpdCBhL2F1ZGlvL2RldmljZS5oIGIvYXVkaW8vZGV2aWNlLmgKaW5kZXggODBlMWIx MC4uNjBkYmM3NiAxMDA2NDQKLS0tIGEvYXVkaW8vZGV2aWNlLmgKKysrIGIvYXVkaW8vZGV2aWNl LmgKQEAgLTIyLDYgKzIyLDExIEBACiAgKgogICovCiAKKyNpZm5kZWYgX19ERVZJQ0VfSF9fCisj ZGVmaW5lIF9fREVWSUNFX0hfXworCisjaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgor CiAjZGVmaW5lIEdFTkVSSUNfQVVESU9fVVVJRAkiMDAwMDEyMDMtMDAwMC0xMDAwLTgwMDAtMDA4 MDVGOUIzNEZCIgogCiAjZGVmaW5lIEhTUF9IU19VVUlECQkiMDAwMDExMDgtMDAwMC0xMDAwLTgw MDAtMDA4MDVGOUIzNEZCIgpAQCAtNzIsMyArNzcsNiBAQCBzdHJ1Y3QgYXVkaW9fZGV2aWNlICpk ZXZpY2VfcmVnaXN0ZXIoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCiB2b2lkIGRldmljZV91bnJlZ2lz dGVyKHN0cnVjdCBhdWRpb19kZXZpY2UgKmRldmljZSk7CiAKIGdib29sZWFuIGRldmljZV9pc19j b25uZWN0ZWQoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICppbnRlcmZhY2Up OworCisjZW5kaWYgLypfX0RFVklDRV9IX18qLworCmRpZmYgLS1naXQgYS9hdWRpby9nYXRld2F5 LmMgYi9hdWRpby9nYXRld2F5LmMKaW5kZXggYTI5OWQyOC4uNGYwMjk3YyAxMDA2NDQKLS0tIGEv YXVkaW8vZ2F0ZXdheS5jCisrKyBiL2F1ZGlvL2dhdGV3YXkuYwpAQCAtNCw2ICs0LDcgQEAKICAq CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIE5va2lhIENvcnBvcmF0aW9uCiAgKiAgQ29w eXJpZ2h0IChDKSAyMDA0LTIwMDggIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9y Zz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggIExlb25pZCBNb3ZzaG92aWNoIDxldmVudC5yaWdh QGdtYWlsLm9yZz4KICAqCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0yNyw4ICsyOCwxMDY4IEBA CiAjZW5kaWYKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lu Y2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CiAKKyNpbmNsdWRlIDxmY250bC5o PgogI2luY2x1ZGUgPGdsaWIuaD4KICNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxn ZGJ1cy5oPgorCisjaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPGJs dWV0b290aC9oY2kuaD4KKyNpbmNsdWRlIDxibHVldG9vdGgvaGNpX2xpYi5oPgorI2luY2x1ZGUg PGJsdWV0b290aC9zY28uaD4KKyNpbmNsdWRlIDxibHVldG9vdGgvcmZjb21tLmg+CisjaW5jbHVk ZSA8Ymx1ZXRvb3RoL3NkcC5oPgorI2luY2x1ZGUgPGJsdWV0b290aC9zZHBfbGliLmg+CiAKICNp bmNsdWRlICJnYXRld2F5LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJnbGliLWhl bHBlci5oIgorI2luY2x1ZGUgImxvZ2dpbmcuaCIKKworI2RlZmluZSBTQ09fQlVGX1NJWkUgMTAy NAorI2RlZmluZSBSRkNPTU1fQlVGX1NJWkUgMjU2CisjZGVmaW5lIEFHX0lORElDQVRPUl9ERVND Ul9TSVpFIDIwCS8qIG5vdC1tb3JlLXRoZW4tMTYgZGVmaW5lZCBieSBHU00gKyAxIGZvciBOVUxM ICsgcGFkZGluZyAqLworI2RlZmluZSBBR19DQUxMRVJfTlVNX1NJWkUgNjQJLyogc2l6ZSBvZiBu dW1iZXIgKyB0eXBlICovCisKKy8qIGNvbW1hbmRzICovCisjZGVmaW5lIEFHX0ZFQVRVUkVTICJB VCtCUlNGPTI2XHIiCS8vID0gMHg3RiA9IEFsbCBmZWF0dXJlcyBzdXBwb3J0ZWQKKyNkZWZpbmUg QUdfSU5ESUNBVE9SU19TVVBQICJBVCtDSU5EPT9cciIKKyNkZWZpbmUgQUdfSU5ESUNBVE9SU19W QUwgIkFUK0NJTkQ/XHIiCisjZGVmaW5lIEFHX0lORElDQVRPUlNfRU5BQkxFICJBVCtDTUVSPTMs MCwwLDFcciIKKyNkZWZpbmUgQUdfSE9MRF9NUFRZX1NVUFAgIkFUK0NITEQ9P1xyIgorI2RlZmlu ZSBBR19DQUxMRVJfSURFTlRfRU5BQkxFICJBVCtDTElQPTFcciIKKyNkZWZpbmUgQUdfQ0FSUklF Ul9GT1JNQVQgIkFUK0NPUFM9MywwXHIiCisjZGVmaW5lIEFHX0VYVEVOREVEX1JFU1VMVF9DT0RF ICJBVCtDTUVFPTFcciIKKworI2RlZmluZSBBR19GRUFUVVJFXzNXQVkgMHgxCisjZGVmaW5lIEFH X0ZFQVRVUkVfRVhURU5ERURfUkVTX0NPREUgMHgxMDAKKy8qIEhvbGQgYW5kIG11bHRpcGFyeSBB RyBmZWF0dXJlcy4gQ29tbWVudHMgYmVsb3cgYXJlIGNvcGllZCBmcm9tIGhhbmRzLWZyZWUgc3Bl YyBmb3IgcmVmZXJlbmNlICovCisjZGVmaW5lIEFHX0NITERfMCAweDAxCQkvKiBSZWxlYXNlcyBh bGwgaGVsZCBjYWxscyBvciBzZXRzIFVzZXIgRGV0ZXJtaW5lZCBVc2VyIEJ1c3kgKFVEVUIpIGZv ciBhIHdhaXRpbmcgY2FsbCAqLworI2RlZmluZSBBR19DSExEXzEgMHgwMgkJLyogUmVsZWFzZXMg YWxsIGFjdGl2ZSBjYWxscyAoaWYgYW55IGV4aXN0KSBhbmQgYWNjZXB0cyB0aGUgb3RoZXIgKGhl bGQgb3Igd2FpdGluZykgY2FsbCAqLworI2RlZmluZSBBR19DSExEXzF4IDB4MDQJCS8qIFJlbGVh c2VzIHNwZWNpZmllZCBhY3RpdmUgY2FsbCBvbmx5IDx4PiAqLworI2RlZmluZSBBR19DSExEXzIg MHgwOAkJLyogUGxhY2VzIGFsbCBhY3RpdmUgY2FsbHMgKGlmIGFueSBleGlzdCkgb24gaG9sZCBh bmQgYWNjZXB0cyB0aGUgb3RoZXIgKGhlbGQgb3Igd2FpdGluZykgY2FsbCAqLworI2RlZmluZSBB R19DSExEXzJ4IDB4MTAJCS8qIFJlcXVlc3QgcHJpdmF0ZSBjb25zdWx0YXRpb24gbW9kZSB3aXRo IHNwZWNpZmllZCBjYWxsIDx4PiAoUGxhY2UgYWxsIGNhbGxzIG9uIGhvbGQgRVhDRVBUIHRoZSBj YWxsIDx4PikgKi8KKyNkZWZpbmUgQUdfQ0hMRF8zIDB4MjAJCS8qIEFkZHMgYSBoZWxkIGNhbGwg dG8gdGhlIGNvbnZlcnNhdGlvbiAqLworI2RlZmluZSBBR19DSExEXzQgMHg0MAkJLyogQ29ubmVj dHMgdGhlIHR3byBjYWxscyBhbmQgZGlzY29ubmVjdHMgdGhlIHN1YnNjcmliZXIgZnJvbSBib3Ro IGNhbGxzIChFeHBsaWNpdCBDYWxsIFRyYW5zZmVyKS4gCisJCQkJICAgU3VwcG9ydCBmb3IgdGhp cyB2YWx1ZSBhbmQgaXRzIGFzc29jaWF0ZWQgZnVuY3Rpb25hbGl0eSBpcyBvcHRpb25hbCBmb3Ig dGhlIEhGLiAqLworI2RlZmluZSBPS19SRVNQT05TRSAiXHJcbk9LXHJcbiIKKyNkZWZpbmUgRVJS T1JfUkVTUE9OU0UgIlxyXG5FUlJPUlxyXG4iCisKKworc3RydWN0IGluZGljYXRvciB7CisJZ2No YXIgZGVzY3JbQUdfSU5ESUNBVE9SX0RFU0NSX1NJWkVdOworCWdpbnQgdmFsdWU7Cit9OworCitz dHJ1Y3QgZ2F0ZXdheSB7CisJR0lPQ2hhbm5lbCAqcmZjb21tOworCWd1aW50IHJmY29tbV93YXRj aF9pZDsKKwlHSU9DaGFubmVsICpzY287CisJR0lPQ2hhbm5lbCAqc2NvX3NlcnZlcjsKKwlEQnVz TWVzc2FnZSAqY29ubmVjdF9tZXNzYWdlOworCWd1aW50IGFnX2ZlYXR1cmVzOworCWd1aW50IGhv bGRfbXVsdGlwYXJ0eV9mZWF0dXJlczsKKwlHU0xpc3QgKmluZGllczsKKwlnYm9vbGVhbiBpc19k aWFsaW5nOworfTsKKworCitzdGF0aWMgZ2Jvb2xlYW4gcmZjb21tX2FnX2RhdGFfY2IoR0lPQ2hh bm5lbCAqIGNoYW4sIEdJT0NvbmRpdGlvbiBjb25kLAorCQkJCSAgc3RydWN0IGF1ZGlvX2Rldmlj ZSAqZGV2aWNlKTsKKworc3RhdGljIHZvaWQgcmZjb21tX3N0YXJ0X3dhdGNoKHN0cnVjdCBhdWRp b19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2F0ZXdheSAqZ3cgPSBkZXYtPmdhdGV3YXk7CisJ Z3ctPnJmY29tbV93YXRjaF9pZCA9CisJICAgIGdfaW9fYWRkX3dhdGNoKGd3LT5yZmNvbW0sCisJ CQkgICBHX0lPX0lOIHwgR19JT19FUlIgfCBHX0lPX0hVUCB8IEdfSU9fTlZBTCwKKwkJCSAgIChH SU9GdW5jKSByZmNvbW1fYWdfZGF0YV9jYiwgZGV2KTsKK30KKworc3RhdGljIHZvaWQgcmZjb21t X3N0b3Bfd2F0Y2goc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnYXRld2F5 ICpndyA9IGRldi0+Z2F0ZXdheTsKKwlnX3NvdXJjZV9yZW1vdmUoZ3ctPnJmY29tbV93YXRjaF9p ZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiBpb19jaGFubmVsX3dyaXRlX2FsbChHSU9DaGFubmVs ICogaW8sIGdjaGFyICogZGF0YSwKKwkJCQkgICAgIGdzaXplIGNvdW50KQoreworCWdzaXplIHdy aXR0ZW4gPSAwOworCUdJT1N0YXR1cyBzdGF0dXM7CisJd2hpbGUgKDAgPCBjb3VudCkgeworCQlz dGF0dXMgPQorCQkgICAgZ19pb19jaGFubmVsX3dyaXRlX2NoYXJzKGlvLCBkYXRhLCBjb3VudCwg JndyaXR0ZW4sCisJCQkJCSAgICAgTlVMTCk7CisJCWlmIChHX0lPX1NUQVRVU19OT1JNQUwgIT0g c3RhdHVzKSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJZGF0YSArPSB3cml0dGVuOworCQlj b3VudCAtPSB3cml0dGVuOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLyogaXQncyB3b3J0aCB0 byBtZW50aW9uIHRoYXQgZGF0YSBhbmQgcmVzcG9uc2UgY291bGQgYmUgdGhlIHNhbWUgcG9pbnRl cnMgKi8KK3N0YXRpYyBnYm9vbGVhbiByZmNvbW1fc2VuZF9hbmRfcmVhZChzdHJ1Y3QgZ2F0ZXdh eSAqZ3csIGdjaGFyICogZGF0YSwKKwkJCQkgICAgIGdjaGFyICogcmVzcG9uc2UsIGdzaXplIGNv dW50KQoreworCUdJT0NoYW5uZWwgKnJmY29tbSA9IGd3LT5yZmNvbW07CisKKwlpZiAoIWlvX2No YW5uZWxfd3JpdGVfYWxsKHJmY29tbSwgZGF0YSwgY291bnQpKSB7CisJCXJldHVybiBGQUxTRTsK Kwl9CisKKwlnc2l6ZSByZWFkID0gMDsKKwlnYm9vbGVhbiBnb3Rfb2sgPSBGQUxTRTsKKwlnYm9v bGVhbiBnb3RfZXJyb3IgPSBGQUxTRTsKKwlnY2hhciAqcmVzcF9idWYgPSByZXNwb25zZTsKKwln c2l6ZSB0b3JlYWQgPSBSRkNPTU1fQlVGX1NJWkUgLSAxOworCUdJT1N0YXR1cyBzdGF0dXM7CisJ d2hpbGUgKCEoZ290X29rIHx8IGdvdF9lcnJvcikpIHsKKwkJc3RhdHVzID0KKwkJICAgIGdfaW9f Y2hhbm5lbF9yZWFkX2NoYXJzKHJmY29tbSwgcmVzcF9idWYsIHRvcmVhZCwKKwkJCQkJICAgICZy ZWFkLCBOVUxMKTsKKwkJaWYgKEdfSU9fU1RBVFVTX05PUk1BTCA9PSBzdGF0dXMpIHsKKwkJCXJl c3BfYnVmW3JlYWRdID0gJ1wwJzsKKwkJfSBlbHNlIHsKKwkJCWRlYnVnKCJyZmNvbW1fc2VuZF9h bmRfcmVhZCgpOiAlbSIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCWdvdF9vayA9IE5VTEwg IT0gc3Ryc3RyKHJlc3BfYnVmLCBPS19SRVNQT05TRSk7CisJCWdvdF9lcnJvciA9IE5VTEwgIT0g c3Ryc3RyKHJlc3BfYnVmLCBFUlJPUl9SRVNQT05TRSk7CisJCXJlc3BfYnVmICs9IHJlYWQ7CisJ CXRvcmVhZCAtPSByZWFkOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLyogZ2V0IDxkZXNjcj4g ZnJvbSB0aGUgbmFtZXM6ICg8ZGVzY3I+LCAoPHZhbHVlcz4pKSwgKDxkZXNjcj4sICg8dmFsdWVz PikpIC4uLiAqLworR1NMaXN0ICpwYXJzZV9pbmRpY2F0b3JfbmFtZXMoZ2NoYXIgKiBuYW1lcywg R1NMaXN0ICogaW5kaWVzKQoreworCWdjaGFyICpjdXJyZW50ID0gbmFtZXMgLSAxOworCUdTTGlz dCAqcmVzdWx0ID0gaW5kaWVzOworCWdjaGFyICpuZXh0OworCXdoaWxlIChOVUxMICE9IGN1cnJl bnQpIHsKKwkJY3VycmVudCArPSAyOworCQluZXh0ID0gc3Ryc3RyKGN1cnJlbnQsICIsKCIpOwor CQlzdHJ1Y3QgaW5kaWNhdG9yICppbmQgPQorCQkgICAgKHN0cnVjdCBpbmRpY2F0b3IgKikgZ19z bGljZV9uZXcoc3RydWN0IGluZGljYXRvcik7CisJCXN0cm5jcHkoaW5kLT5kZXNjciwgY3VycmVu dCwgMjApOworCQlpbmQtPmRlc2NyWyhnaW50KSBuZXh0IC0gKGdpbnQpIGN1cnJlbnRdID0gJ1ww JzsKKwkJcmVzdWx0ID0gZ19zbGlzdF9hcHBlbmQocmVzdWx0LCAoZ3BvaW50ZXIpIGluZCk7CisJ CWN1cnJlbnQgPSBzdHJzdHIobmV4dCArIDEsICIsKCIpOworCX0KKwlyZXR1cm4gcmVzdWx0Owor fQorCisvKiBnZXQgdmFsdWVzIGZyb20gPHZhbDA+LDx2YWwxPiwuLi4gKi8KK0dTTGlzdCAqcGFy c2VfaW5kaWNhdG9yX3ZhbHVlcyhnY2hhciAqIHZhbHVlcywgR1NMaXN0ICogaW5kaWVzKQorewor CWdpbnQgdmFsOworCWdjaGFyICpjdXJyZW50ID0gdmFsdWVzIC0gMTsKKwlHU0xpc3QgKnJ1bm5l ciA9IGluZGllczsKKwl3aGlsZSAoTlVMTCAhPSBjdXJyZW50KSB7CisJCWN1cnJlbnQgKz0gMTsK KwkJc3NjYW5mKGN1cnJlbnQsICIlZCIsICZ2YWwpOworCQljdXJyZW50ID0gc3RyY2hyKGN1cnJl bnQsICcsJyk7CisJCXN0cnVjdCBpbmRpY2F0b3IgKmluZCA9CisJCSAgICAoc3RydWN0IGluZGlj YXRvciAqKSBnX3NsaXN0X250aF9kYXRhKHJ1bm5lciwgMCk7CisJCWluZC0+dmFsdWUgPSB2YWw7 CisJCXJ1bm5lciA9IGdfc2xpc3RfbmV4dChydW5uZXIpOworCX0KKwlyZXR1cm4gaW5kaWVzOwor fQorCisvKiBnZXQgdmFsdWVzIGZyb20gPHZhbDA+LDx2YWwxPiwuLi4gKi8KK3N0YXRpYyBndWlu dCBnZXRfaG9sZF9tcHR5X2ZlYXR1cmVzKGdjaGFyICogZmVhdHVyZXMpCit7CisJZ3VpbnQgcmVz dWx0ID0gMDsKKwlpZiAoTlVMTCAhPSBzdHJzdHIoZmVhdHVyZXMsICIwIikpIHsKKwkJcmVzdWx0 IHw9IEFHX0NITERfMDsKKwl9CisJaWYgKE5VTEwgIT0gc3Ryc3RyKGZlYXR1cmVzLCAiMSIpKSB7 CisJCXJlc3VsdCB8PSBBR19DSExEXzE7CisJfQorCWlmIChOVUxMICE9IHN0cnN0cihmZWF0dXJl cywgIjF4IikpIHsKKwkJcmVzdWx0IHw9IEFHX0NITERfMXg7CisJfQorCWlmIChOVUxMICE9IHN0 cnN0cihmZWF0dXJlcywgIjIiKSkgeworCQlyZXN1bHQgfD0gQUdfQ0hMRF8yOworCX0KKwlpZiAo TlVMTCAhPSBzdHJzdHIoZmVhdHVyZXMsICIyeCIpKSB7CisJCXJlc3VsdCB8PSBBR19DSExEXzJ4 OworCX0KKwlpZiAoTlVMTCAhPSBzdHJzdHIoZmVhdHVyZXMsICIzIikpIHsKKwkJcmVzdWx0IHw9 IEFHX0NITERfMzsKKwl9CisJaWYgKE5VTEwgIT0gc3Ryc3RyKGZlYXR1cmVzLCAiNCIpKSB7CisJ CXJlc3VsdCB8PSBBR19DSExEXzQ7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBn Ym9vbGVhbiBlc3RhYmxpc2hfc2VydmljZV9sZXZlbF9jb25uKHN0cnVjdCBnYXRld2F5ICpndykK K3sKKwlnY2hhciBidWZbUkZDT01NX0JVRl9TSVpFXTsKKwlnaW50IHJlYWQ7CisJZ2Jvb2xlYW4g cmVzOworCXJlcyA9CisJICAgIHJmY29tbV9zZW5kX2FuZF9yZWFkKGd3LCBBR19GRUFUVVJFUywg YnVmLAorCQkJCSBzaXplb2YoQUdfRkVBVFVSRVMpIC0gMSk7CisJaWYgKCFyZXMgfHwgMSAhPSBz c2NhbmYoYnVmLCAiXHJcbitCUlNGOiVkIiwgJmd3LT5hZ19mZWF0dXJlcykpIHsKKwkJcmV0dXJu IEZBTFNFOworCX0KKwlkZWJ1ZygiZmVhdHVyZXMgYXJlIDB4JVgiLCBndy0+YWdfZmVhdHVyZXMp OworCXJlcyA9CisJICAgIHJmY29tbV9zZW5kX2FuZF9yZWFkKGd3LCBBR19JTkRJQ0FUT1JTX1NV UFAsIGJ1ZiwKKwkJCQkgc2l6ZW9mKEFHX0lORElDQVRPUlNfU1VQUCkgLSAxKTsKKwlpZiAoIXJl cyB8fCAhc3Ryc3RyKGJ1ZiwgIitDSU5EOiIpKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZ3ct PmluZGllcyA9IHBhcnNlX2luZGljYXRvcl9uYW1lcyhzdHJjaHIoYnVmLCAnKCcpLCBOVUxMKTsK KworCXJlcyA9CisJICAgIHJmY29tbV9zZW5kX2FuZF9yZWFkKGd3LCBBR19JTkRJQ0FUT1JTX1ZB TCwgYnVmLAorCQkJCSBzaXplb2YoQUdfSU5ESUNBVE9SU19WQUwpIC0gMSk7CisJaWYgKCFyZXMg fHwgIXN0cnN0cihidWYsICIrQ0lORDoiKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCWd3LT5p bmRpZXMgPQorCSAgICBwYXJzZV9pbmRpY2F0b3JfdmFsdWVzKHN0cmNocihidWYsICc6JykgKyAx LCBndy0+aW5kaWVzKTsKKworCXJlcyA9CisJICAgIHJmY29tbV9zZW5kX2FuZF9yZWFkKGd3LCBB R19JTkRJQ0FUT1JTX0VOQUJMRSwgYnVmLAorCQkJCSBzaXplb2YoQUdfSU5ESUNBVE9SU19FTkFC TEUpIC0gMSk7CisJaWYgKCFyZXMgfHwgIXN0cnN0cihidWYsICJPSyIpKSB7CisJCXJldHVybiBG QUxTRTsKKwl9CisJaWYgKDAgIT0gZ3ctPmFnX2ZlYXR1cmVzICYgQUdfRkVBVFVSRV8zV0FZKSB7 CisJCXJlcyA9CisJCSAgICByZmNvbW1fc2VuZF9hbmRfcmVhZChndywgQUdfSE9MRF9NUFRZX1NV UFAsIGJ1ZiwKKwkJCQkJIHNpemVvZihBR19IT0xEX01QVFlfU1VQUCkgLSAxKTsKKwkJaWYgKCFy ZXMgfHwgIXN0cnN0cihidWYsICIrQ0hMRDoiKSkgeworCQkJZ19zbGljZV9mcmVlMShSRkNPTU1f QlVGX1NJWkUsIGJ1Zik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJZ3ctPmhvbGRfbXVsdGlw YXJ0eV9mZWF0dXJlcyA9CisJCSAgICBnZXRfaG9sZF9tcHR5X2ZlYXR1cmVzKHN0cmNocihidWYs ICcoJykpOworCX0gZWxzZSB7CisJCWd3LT5ob2xkX211bHRpcGFydHlfZmVhdHVyZXMgPSAwOwor CX0KKwlkZWJ1ZygiU2VydmljZSBsYXllciBjb25uZWN0aW9uIHN1Y2Nlc3NmdWxseSBlc3RhYmxp c2hlZCEiKTsKKwlyZmNvbW1fc2VuZF9hbmRfcmVhZChndywgQUdfQ0FMTEVSX0lERU5UX0VOQUJM RSwgYnVmLAorCQkJICAgICBzaXplb2YoQUdfQ0FMTEVSX0lERU5UX0VOQUJMRSkgLSAxKTsKKwly ZmNvbW1fc2VuZF9hbmRfcmVhZChndywgQUdfQ0FSUklFUl9GT1JNQVQsIGJ1ZiwKKwkJCSAgICAg c2l6ZW9mKEFHX0NBUlJJRVJfRk9STUFUKSAtIDEpOworCWlmICgwICE9IGd3LT5hZ19mZWF0dXJl cyAmIEFHX0ZFQVRVUkVfRVhURU5ERURfUkVTX0NPREUpIHsKKwkJcmZjb21tX3NlbmRfYW5kX3Jl YWQoZ3csIEFHX0VYVEVOREVEX1JFU1VMVF9DT0RFLCBidWYsCisJCQkJICAgICBzaXplb2YoQUdf RVhURU5ERURfUkVTVUxUX0NPREUpIC0gMSk7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0 aWMgdm9pZCBwcm9jZXNzX2luZF9jaGFuZ2Uoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2LCBnY2hh ciAqIG5hbWUsCisJCQkgICAgICAgZ2ludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2F0ZXdheSAqZ3cg PSBkZXYtPmdhdGV3YXk7CisJaWYgKDAgPT0gc3RyY21wKG5hbWUsICJjYWxsIikpIHsKKwkJaWYg KDAgPCB2YWx1ZSkgeworCQkJZ19kYnVzX2VtaXRfc2lnbmFsKGRldi0+Y29ubiwgZGV2LT5wYXRo LAorCQkJCQkgICBBVURJT19HQVRFV0FZX0lOVEVSRkFDRSwKKwkJCQkJICAgIkNhbGxTdGFydCIs IERCVVNfVFlQRV9JTlZBTElEKTsKKwkJCWd3LT5pc19kaWFsaW5nID0gRkFMU0U7CisJCX0gZWxz ZSB7CisJCQlnX2RidXNfZW1pdF9zaWduYWwoZGV2LT5jb25uLCBkZXYtPnBhdGgsCisJCQkJCSAg IEFVRElPX0dBVEVXQVlfSU5URVJGQUNFLAorCQkJCQkgICAiQ2FsbEVuZCIsIERCVVNfVFlQRV9J TlZBTElEKTsKKwkJfQorCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAobmFtZSwgImNhbGxzdGF0dXMi KQorCQkgICAmJiBndy0+aXNfZGlhbGluZykgeworCQlpZiAoMCA9PSB2YWx1ZSkgeworCQkJZ19k YnVzX2VtaXRfc2lnbmFsKGRldi0+Y29ubiwgZGV2LT5wYXRoLAorCQkJCQkgICBBVURJT19HQVRF V0FZX0lOVEVSRkFDRSwKKwkJCQkJICAgIkNhbGxDYW5jZWxsZWQiLAorCQkJCQkgICBEQlVTX1RZ UEVfSU5WQUxJRCk7CisJCQlndy0+aXNfZGlhbGluZyA9IEZBTFNFOworCQl9IGVsc2UgeworCQkJ Z3ctPmlzX2RpYWxpbmcgPSBUUlVFOworCQl9CisJfSBlbHNlIGlmICgwID09IHN0cmNtcChuYW1l LCAiY2FsbGhlbGQiKSkgeworCQkvKiBGSVhNRTogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGJhc2Vk IG9uIGFzc3VtcHRpb25zIG9ubHkuIEhhcyB0byBiZSB0ZXN0ZWQgZm9yIGludGVyb3BlcmFiaWxp dHkKKwkJICAgSSBhc3N1bWUgdGhhdCBjYWxsaGVsZD0yIHdvdWxkIGJlIHNlbnQgd2hlbiBkaWFs IGZyb20gSEYgZmFpbGVkIGluIGNhc2Ugb2YgMy13YXkgY2FsbCAKKwkJICAgVW5mb3J0dW5hdGVs eSB0aGlzIHBhdGggaXMgbm90IGNvdmVyZWQgYnkgdGhlIEhGIHNwZWMgc28gdGhlIGNvZGUgaGFz IHRvIGJlIHRlc3RlZCBmb3IgaW50ZXJvcAorCQkgKi8KKwkJaWYgKDIgPT0gdmFsdWUpIHsJLyog JzInIG1lYW5zOiBhbGwgY2FsbHMgaGVsZCwgbm8gYWN0aXZlIGNhbGxzICovCisJCQlpZiAoZ3ct PmlzX2RpYWxpbmcpIHsKKwkJCQlnX2RidXNfZW1pdF9zaWduYWwoZGV2LT5jb25uLCBkZXYtPnBh dGgsCisJCQkJCQkgICBBVURJT19HQVRFV0FZX0lOVEVSRkFDRSwKKwkJCQkJCSAgICJDYWxsQ2Fu Y2VsbGVkIiwKKwkJCQkJCSAgIERCVVNfVFlQRV9JTlZBTElEKTsKKwkJCQlndy0+aXNfZGlhbGlu ZyA9PSBGQUxTRTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWdfZGJ1c19lbWl0X3NpZ25hbChk ZXYtPmNvbm4sIGRldi0+cGF0aCwKKwkJCQkgICBBVURJT19HQVRFV0FZX0lOVEVSRkFDRSwgIlN0 YXR1c1VwZGF0ZSIsCisJCQkJICAgREJVU19UWVBFX1NUUklORywgbmFtZSwgREJVU19UWVBFX0lO VDMyLAorCQkJCSAgIHZhbHVlLCBEQlVTX1RZUEVfSU5WQUxJRCk7CisJfQorfQorCitzdGF0aWMg dm9pZCBwcm9jZXNzX3Jpbmcoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2aWNlLCBHSU9DaGFubmVs ICogY2hhbiwKKwkJCSBnY2hhciAqIGJ1ZikKK3sKKwlnY2hhciBudW1iZXJbQUdfQ0FMTEVSX05V TV9TSVpFXTsKKwlnY2hhciAqc2VwOworCWdpbnQgcmVhZDsKKworCXJmY29tbV9zdG9wX3dhdGNo KGRldmljZSk7CisJZ19pb19jaGFubmVsX3JlYWRfY2hhcnMoY2hhbiwgYnVmLCBSRkNPTU1fQlVG X1NJWkUgLSAxLCAmcmVhZCwKKwkJCQlOVUxMKTsKKwlpZiAoMSA9PSBzc2NhbmYoYnVmLCAiXHJc bitDTElQOiVzXHJcbiIsIG51bWJlcikpIHsKKwkJc2VwID0gc3RyY2hyKG51bWJlciwgJywnKTsK KwkJc2VwWzBdID0gJ1wwJzsKKwkJLyogRklYTUU6IHNpZ25hbCB3aWxsIGJlIGVtaXR0ZWQgb24g ZWFjaCBSSU5HK0NMSVAuIFRoYXQncyBiYWQgKi8KKwkJZ19kYnVzX2VtaXRfc2lnbmFsKGRldmlj ZS0+Y29ubiwgZGV2aWNlLT5wYXRoLAorCQkJCSAgIEFVRElPX0dBVEVXQVlfSU5URVJGQUNFLCAi UmluZyIsCisJCQkJICAgREJVU19UWVBFX1NUUklORywgbnVtYmVyLAorCQkJCSAgIERCVVNfVFlQ RV9JTlZBTElEKTsKKwl9IGVsc2UgeworCQl3YXJuCisJCSAgICAoInJmY29tbV9hZ19kYXRhX2Ni KCk6ICclcycgaW4gcGxhY2Ugb2YgK0NMSVAgYWZ0ZXIgUklORyIsCisJCSAgICAgYnVmKTsKKwl9 CisJcmZjb21tX3N0YXJ0X3dhdGNoKGRldmljZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiByZmNv bW1fYWdfZGF0YV9jYihHSU9DaGFubmVsICogY2hhbiwgR0lPQ29uZGl0aW9uIGNvbmQsCisJCQkJ ICBzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UpCit7CisJZ2NoYXIgYnVmW1JGQ09NTV9CVUZf U0laRV07CisJc3RydWN0IGdhdGV3YXkgKmd3OworCWdpbnQgcmVhZDsKKwlnY2hhciBpbmRpY2F0 b3JbQUdfSU5ESUNBVE9SX0RFU0NSX1NJWkUgKyA0XTsJLyogc29tZSBzcGFjZSBmb3IgdmFsdWUg Ki8KKwlnaW50IHZhbHVlOworCWdpbnQgcmVzdWx0OworCWdjaGFyICpzZXA7CisKKwlpZiAoY29u ZCAmIEdfSU9fTlZBTCkKKwkJcmV0dXJuIEZBTFNFOworCisJZ3cgPSBkZXZpY2UtPmdhdGV3YXk7 CisKKwlpZiAoY29uZCAmIChHX0lPX0VSUiB8IEdfSU9fSFVQKSkKKwkJcmV0dXJuIEZBTFNFOwor CisKKwlpZiAoR19JT19FUlJPUl9OT05FICE9CisJICAgIGdfaW9fY2hhbm5lbF9yZWFkX2NoYXJz KGNoYW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAmcmVhZCwKKwkJCQkgICAgTlVMTCkpCisJCXJl dHVybiBUUlVFOworCisJYnVmW3JlYWRdID0gJ1wwJzsKKwlpZiAoMSA9PSBzc2NhbmYoYnVmLCAi XHJcbitDSUVWOiVzXHJcbiIsIGluZGljYXRvcikpIHsKKwkJc2VwID0gc3RyY2hyKGluZGljYXRv ciwgJywnKTsKKwkJc2VwWzBdID0gJ1wwJzsKKwkJc2VwICs9IDE7CisJCXZhbHVlID0gYXRvaShz ZXApOworCQlwcm9jZXNzX2luZF9jaGFuZ2UoZGV2aWNlLCBpbmRpY2F0b3IsIHZhbHVlKTsKKwl9 IGVsc2UgaWYgKE5VTEwgIT0gc3Ryc3RyKGJ1ZiwgIlJJTkciKSkgeworCQlwcm9jZXNzX3Jpbmco ZGV2aWNlLCBjaGFuLCBidWYpOworCX0gZWxzZSBpZiAoMSA9PSBzc2NhbmYoYnVmLCAiXHJcbitC VlJBOiVkXHJcbiIsIHZhbHVlKSkgeworCQlpZiAoMCA9PSB2YWx1ZSkgeworCQkJZ19kYnVzX2Vt aXRfc2lnbmFsKGRldmljZS0+Y29ubiwgZGV2aWNlLT5wYXRoLAorCQkJCQkgICBBVURJT19HQVRF V0FZX0lOVEVSRkFDRSwKKwkJCQkJICAgIlZvaWNlUmVjb2duaXRpb25BY3RpdmUiLAorCQkJCQkg ICBEQlVTX1RZUEVfSU5WQUxJRCk7CisJCX0gZWxzZSB7CisJCQlnX2RidXNfZW1pdF9zaWduYWwo ZGV2aWNlLT5jb25uLCBkZXZpY2UtPnBhdGgsCisJCQkJCSAgIEFVRElPX0dBVEVXQVlfSU5URVJG QUNFLAorCQkJCQkgICAiVm9pY2VSZWNvZ25pdGlvbkluYWN0aXZlIiwKKwkJCQkJICAgREJVU19U WVBFX0lOVkFMSUQpOworCQl9CisJfSBlbHNlIGlmICgxID09IHNzY2FuZihidWYsICJcclxuK1ZH UzolZFxyXG4iLCB2YWx1ZSkpIHsKKwkJZ19kYnVzX2VtaXRfc2lnbmFsKGRldmljZS0+Y29ubiwg ZGV2aWNlLT5wYXRoLAorCQkJCSAgIEFVRElPX0dBVEVXQVlfSU5URVJGQUNFLCAiU3BlYWtlckdh aW4iLAorCQkJCSAgIERCVVNfVFlQRV9JTlQzMiwgdmFsdWUsCisJCQkJICAgREJVU19UWVBFX0lO VkFMSUQpOworCisJfSBlbHNlIGlmICgxID09IHNzY2FuZihidWYsICJcclxuK1ZHTTolZFxyXG4i LCB2YWx1ZSkpIHsKKwkJZ19kYnVzX2VtaXRfc2lnbmFsKGRldmljZS0+Y29ubiwgZGV2aWNlLT5w YXRoLAorCQkJCSAgIEFVRElPX0dBVEVXQVlfSU5URVJGQUNFLCAiTWljR2FpbiIsCisJCQkJICAg REJVU19UWVBFX0lOVDMyLCB2YWx1ZSwKKwkJCQkgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisJfSBl bHNlIHsKKwkJZXJyb3IoInJmY29tbV9hZ19kYXRhX2NiKCk6IHJlYWQgd3JvbmcgZGF0YSAnJXMn IiwgYnVmKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiBzY29faW9f Y2IoR0lPQ2hhbm5lbCAqIGNoYW4sIEdJT0NvbmRpdGlvbiBjb25kLAorCQkJICBzdHJ1Y3QgYXVk aW9fZGV2aWNlICpkZXYpCit7CisJZ2NoYXIgYnVmW1NDT19CVUZfU0laRV07CisJZ2ludCByZWFk OworCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldi0+Z2F0ZXdheTsKKworCWlmIChjb25kICYgR19J T19OVkFMKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoY29uZCAmIChHX0lPX0VSUiB8IEdfSU9f SFVQKSkgeworCQlHSU9DaGFubmVsICpjaGFuID0gZ3ctPnNjbzsKKwkJZ19pb19jaGFubmVsX3Vu cmVmKGNoYW4pOworCQlnX2lvX2NoYW5uZWxfY2xvc2UoY2hhbik7CisJCWd3LT5zY28gPSBOVUxM OworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogTWF5IGJlIGhlcmUgc29tZSBtb3JlIGRhdGEg aGF2ZSB0byBiZSByZWFkLiBEZXBlbmRzIG9uIHJlc3VsdCBwZXJmb3JtYW5jZS4gCisJICAgRm9y IE5va2lhIEU1MSB2b2x1bWUgaXMgNDggYnl0ZXMgcGVyIGNhbGwgKi8KKwlpZiAoR19JT19FUlJP Ul9OT05FID09CisJICAgIGdfaW9fY2hhbm5lbF9yZWFkKGNoYW4sIGJ1Ziwgc2l6ZW9mKGJ1Ziks ICZyZWFkKSkgeworLy8gICAgaWYgKEdfSU9fRVJST1JfTk9ORSA9PSBnX2lvX2NoYW5uZWxfcmVh ZF9jaGFycyhjaGFuLCBidWYsIHNpemVvZihidWYpICwgJnJlYWQsIE5VTEwpKSB7CisJCWdjaGFy ICpwX2J1ZiA9IGJ1ZjsKKwkJZ19kYnVzX2VtaXRfc2lnbmFsKGRldi0+Y29ubiwgZGV2LT5wYXRo LAorCQkJCSAgIEFVRElPX0dBVEVXQVlfSU5URVJGQUNFLCAiQXVkaW9EYXRhIiwKKwkJCQkgICBE QlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9CWVRFLCAmcF9idWYsCisJCQkJICAgcmVhZCwgREJV U19UWVBFX0lOVkFMSUQpOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgdm9pZCBz Y29fY29ubmVjdF9jYihHSU9DaGFubmVsICogY2hhbiwgaW50IGVyciwKKwkJCSAgIGNvbnN0IGJk YWRkcl90ICogc3JjLCBjb25zdCBiZGFkZHJfdCAqIGRzdCwKKwkJCSAgIGdwb2ludGVyIHVzZXJf ZGF0YSkKK3sKKwlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYgPSAoc3RydWN0IGF1ZGlvX2Rldmlj ZSAqKSB1c2VyX2RhdGE7CisJc3RydWN0IGdhdGV3YXkgKmd3ID0gZGV2LT5nYXRld2F5OworCisJ aWYgKDAgPiBlcnIpIHsKKwkJZXJyb3IoInNjb19jb25uZWN0X2NiKCk6ICVzICglZCkiLCBzdHJl cnJvcigtZXJyKSwgLWVycik7CisJCS8qIG5vdCBzdXJlLCBidXQgZnJvbSBvdGhlciBwb2ludCBv ZiB2aWV3LCAKKwkJICAgd2hhdCBpcyB0aGUgcmVhc29uIHRvIGhhdmUgaGVhZHNldCB3aGljaCBj YW5ub3QgcGxheSBhdWRpbz8gKi8KKwkJZ2F0ZXdheV9jbG9zZShndyk7CisJCXJldHVybjsKKwl9 CisKKwlndy0+c2NvID0gY2hhbjsKKwlmY250bChnX2lvX2NoYW5uZWxfdW5peF9nZXRfZmQoY2hh biksIEZfU0VURkwsIDApOwkvKiB3aHkgaXMgdGhpcyBoZXJlPyAqLworCWdfaW9fYWRkX3dhdGNo KGd3LT5zY28sIEdfSU9fRVJSIHwgR19JT19IVVAgfCBHX0lPX05WQUwgfCBHX0lPX0lOLAorCQkg ICAgICAgKEdJT0Z1bmMpIHNjb19pb19jYiwgZGV2KTsKK30KKworCitzdGF0aWMgdm9pZCByZmNv bW1fY29ubmVjdF9jYihHSU9DaGFubmVsICogY2hhbiwgaW50IGVyciwKKwkJCSAgICAgIGNvbnN0 IGJkYWRkcl90ICogc3JjLCBjb25zdCBiZGFkZHJfdCAqIGRzdCwKKwkJCSAgICAgIGdwb2ludGVy IHVzZXJfZGF0YSkKK3sKKwlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYgPSB1c2VyX2RhdGE7CisJ c3RydWN0IGdhdGV3YXkgKmd3ID0gZGV2LT5nYXRld2F5OworCURCdXNNZXNzYWdlICpjb25uX21l cyA9IGd3LT5jb25uZWN0X21lc3NhZ2U7CisJZ2NoYXIgZ3dfYWRkclsxOF07CisKKwlpZiAoZXJy IDwgMCkgeworCQllcnJvcigiY29ubmVjdCgpOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1l cnIpOworCQlyZXR1cm47CisJfQorCisJYmEyc3RyKCZkZXYtPmRzdCwgZ3dfYWRkcik7CisJLyog QmxvY2tpbmcgbW9kZSBzaG91bGQgYmUgZGVmYXVsdCwgYnV0IGp1c3QgaW4gY2FzZTogKi8KKwlH SU9GbGFncyBmbGFncyA9IGdfaW9fY2hhbm5lbF9nZXRfZmxhZ3MoY2hhbik7CisJZmxhZ3MgJj0g fkdfSU9fRkxBR19OT05CTE9DSzsKKwlmbGFncyAmPSBHX0lPX0ZMQUdfTUFTSzsKKwlnX2lvX2No YW5uZWxfc2V0X2ZsYWdzKGNoYW4sIGZsYWdzLCBOVUxMKTsKKwlnX2lvX2NoYW5uZWxfc2V0X2Vu Y29kaW5nKGNoYW4sIE5VTEwsIE5VTEwpOworCWdfaW9fY2hhbm5lbF9zZXRfYnVmZmVyZWQoY2hh biwgRkFMU0UpOworCWd3LT5yZmNvbW0gPSBjaGFuOworCWlmIChlc3RhYmxpc2hfc2VydmljZV9s ZXZlbF9jb25uKGRldi0+Z2F0ZXdheSkpIHsKKwkJR0lPQ2hhbm5lbCAqc2NvX3NlcnZlciA9CisJ CSAgICBidF9zY29fbGlzdGVuKCZkZXYtPnNyYywgMCwgc2NvX2Nvbm5lY3RfY2IsIGRldik7CisJ CWlmIChOVUxMICE9IHNjb19zZXJ2ZXIpIHsKKwkJCWRlYnVnKCIlczogQ29ubmVjdGVkIHRvICVz IiwgZGV2LT5wYXRoLCBnd19hZGRyKTsKKwkJCXJmY29tbV9zdGFydF93YXRjaChkZXYpOworCQkJ Z3ctPnNjb19zZXJ2ZXIgPSBzY29fc2VydmVyOworCQkJREJ1c01lc3NhZ2UgKnJlcGx5ID0KKwkJ CSAgICBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4oY29ubl9tZXMpOworCQkJZGJ1c19j b25uZWN0aW9uX3NlbmQoZGV2LT5jb25uLCByZXBseSwgTlVMTCk7CisJCQlkYnVzX21lc3NhZ2Vf dW5yZWYocmVwbHkpOworCQkJZGJ1c19tZXNzYWdlX3VucmVmKGNvbm5fbWVzKTsKKwkJCWd3LT5j b25uZWN0X21lc3NhZ2UgPSBOVUxMOworCisJCQlnX2RidXNfZW1pdF9zaWduYWwoZGV2LT5jb25u LCBkZXYtPnBhdGgsCisJCQkJCSAgIEFVRElPX0dBVEVXQVlfSU5URVJGQUNFLAorCQkJCQkgICAi Q29ubmVjdGVkIiwgREJVU19UWVBFX1VJTlQzMiwKKwkJCQkJICAgJmd3LT5hZ19mZWF0dXJlcywK KwkJCQkJICAgREJVU19UWVBFX0lOVkFMSUQpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJ ZXJyb3IoIiVzOiBGYWlsZWQgdG8gc2V0dXAgU0NPIHNlcnZlciBzb2NrZXQiLAorCQkJICAgICAg ZGV2LT5wYXRoKTsKKwkJfQorCX0gZWxzZSB7CisJCWVycm9yCisJCSAgICAoIiVzOiBGYWlsZWQg dG8gZXN0YWJsaXNoIHNlcnZpY2UgbGF5ZXIgY29ubmVjdGlvbiB0byAlcyIsCisJCSAgICAgZGV2 LT5wYXRoLCBnd19hZGRyKTsKKwl9CisJZ2F0ZXdheV9jbG9zZShndyk7Cit9CisKK3N0YXRpYyB2 b2lkIGdldF9yZWNvcmRfY2Ioc2RwX2xpc3RfdCAqIHJlY3MsIGludCBlcnIsIGdwb2ludGVyIHVz ZXJfZGF0YSkKK3sKKwlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYgPSB1c2VyX2RhdGE7CisJREJ1 c01lc3NhZ2UgKmNvbm5fbWVzID0gZGV2LT5nYXRld2F5LT5jb25uZWN0X21lc3NhZ2U7CisJaW50 IGNoID0gLTE7CisJc2RwX2xpc3RfdCAqcHJvdG9zLCAqY2xhc3NlcyA9IE5VTEw7CisJc2RwX3Jl Y29yZF90ICpyZWNvcmQgPSBOVUxMOworCXV1aWRfdCB1dWlkOworCisJaWYgKGVyciA8IDApIHsK KwkJZXJyb3IoIlVuYWJsZSB0byBnZXQgc2VydmljZSByZWNvcmQ6ICVzICglZCkiLAorCQkgICAg ICBzdHJlcnJvcigtZXJyKSwgLWVycik7CisJfSBlbHNlIGlmIChOVUxMID09IHJlY3MgfHwgTlVM TCA9PSByZWNzLT5kYXRhKSB7CisJCWVycm9yKCJObyByZWNvcmRzIGZvdW5kIik7CisJfSBlbHNl IGlmIChzZHBfZ2V0X3NlcnZpY2VfY2xhc3NlcyhyZWNzLT5kYXRhLCAmY2xhc3NlcykgPCAwKSB7 CisJCWVycm9yKCJVbmFibGUgdG8gZ2V0IHNlcnZpY2UgY2xhc3NlcyBmcm9tIHJlY29yZCIpOwor CX0gZWxzZSB7CisJCW1lbWNweSgmdXVpZCwgY2xhc3Nlcy0+ZGF0YSwgc2l6ZW9mKHV1aWQpKTsK KworCQlpZiAoMCA9PSBzZHBfdXVpZDEyOF90b191dWlkKCZ1dWlkKQorCQkgICAgfHwgdXVpZC50 eXBlICE9IFNEUF9VVUlEMTYpIHsKKwkJCWVycm9yKCJOb3QgYSAxNiBiaXQgVVVJRCIpOworCQl9 IGVsc2UgaWYgKHV1aWQudmFsdWUudXVpZDE2ICE9IEhBTkRTRlJFRV9BR1dfU1ZDTEFTU19JRCkg eworCQkJZXJyb3IKKwkJCSAgICAoIlNlcnZpY2UgcmVjb3JkIGRpZG4ndCBjb250YWluIHRoZSBI RlAgVVVJRCIpOworCQl9IGVsc2UgaWYgKDAgPT0gc2RwX2dldF9hY2Nlc3NfcHJvdG9zKHJlY3Mt PmRhdGEsICZwcm90b3MpKSB7CisJCQljaCA9IHNkcF9nZXRfcHJvdG9fcG9ydChwcm90b3MsIFJG Q09NTV9VVUlEKTsKKwkJCXNkcF9saXN0X2ZvcmVhY2gocHJvdG9zLAorCQkJCQkgKHNkcF9saXN0 X2Z1bmNfdCkgc2RwX2xpc3RfZnJlZSwKKwkJCQkJIE5VTEwpOworCQkJc2RwX2xpc3RfZnJlZShw cm90b3MsIE5VTEwpOworCQkJaWYgKGNoID09IC0xKSB7CisJCQkJZXJyb3IKKwkJCQkgICAgKCJV bmFibGUgdG8gZXh0cmFjdCBSRkNPTU0gY2hhbm5lbCBmcm9tIHNlcnZpY2UgcmVjb3JkIik7CisJ CQl9IGVsc2UgeworCQkJCWRlYnVnKCJDb25uZWN0aW5nIG9uIGNoYW5uZWwgJWQiLCBjaCk7CisJ CQkJaWYgKGJ0X3JmY29tbV9jb25uZWN0CisJCQkJICAgICgmZGV2LT5zcmMsICZkZXYtPmRzdCwg Y2gsCisJCQkJICAgICByZmNvbW1fY29ubmVjdF9jYiwgZGV2KSA8IDApIHsKKwkJCQkJZXJyb3Io IlVuYWJsZSB0byBjb25uZWN0OiAlcyAoJXMpIiwKKwkJCQkJICAgICAgc3RyZXJyb3IoLWVyciks IC1lcnIpOworCQkJCQllcnJvcl9jb25uZWN0aW9uX2F0dGVtcHRfZmFpbGVkCisJCQkJCSAgICAo ZGV2LT5jb25uLCBjb25uX21lcywgLWVycik7CisJCQkJCWdhdGV3YXlfY2xvc2UoZGV2LT5nYXRl d2F5KTsKKwkJCQl9CisJCQkJc2RwX2xpc3RfZnJlZShjbGFzc2VzLCBmcmVlKTsKKwkJCQlzZHBf cmVjb3JkX2ZyZWUocmVjcy0+ZGF0YSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCXNk cF9saXN0X2ZyZWUoY2xhc3NlcywgZnJlZSk7CisJc2RwX3JlY29yZF9mcmVlKHJlY3MtPmRhdGEp OworCWVycm9yX25vdF9zdXBwb3J0ZWQoZGV2LT5jb25uLCBjb25uX21lcyk7CisJZGJ1c19tZXNz YWdlX3VucmVmKGNvbm5fbWVzKTsKKwlkZXYtPmdhdGV3YXktPmNvbm5lY3RfbWVzc2FnZSA9IE5V TEw7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlY29yZHMoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2 aWNlKQoreworCXV1aWRfdCB1dWlkOworCisJc2RwX3V1aWQxNl9jcmVhdGUoJnV1aWQsIEhBTkRT RlJFRV9BR1dfU1ZDTEFTU19JRCk7CisJcmV0dXJuIGJ0X3NlYXJjaF9zZXJ2aWNlKCZkZXZpY2Ut PnNyYywgJmRldmljZS0+ZHN0LCAmdXVpZCwKKwkJCQkgZ2V0X3JlY29yZF9jYiwgZGV2aWNlLCBO VUxMKTsKK30KKworCitzdGF0aWMgREJ1c01lc3NhZ2UgKmFnX2Nvbm5lY3QoREJ1c0Nvbm5lY3Rp b24gKiBjb25uLCBEQnVzTWVzc2FnZSAqIG1zZywKKwkJCSAgICAgICB2b2lkICpkYXRhKQorewor CXN0cnVjdCBhdWRpb19kZXZpY2UgKmF1X2RldiA9IChzdHJ1Y3QgYXVkaW9fZGV2aWNlICopIGRh dGE7CisJc3RydWN0IGdhdGV3YXkgKmd3ID0gYXVfZGV2LT5nYXRld2F5OworCisJaWYgKE5VTEwg IT0gZ3ctPnJmY29tbSkgeworCQlyZXR1cm4gZ19kYnVzX2NyZWF0ZV9lcnJvcihtc2csIEVSUk9S X0lOVEVSRkFDRQorCQkJCQkgICAiLkFscmVhZHlDb25uZWN0ZWQiLAorCQkJCQkgICAiQWxyZWFk eSBDb25uZWN0ZWQiKTsKKwl9CisKKwlndy0+Y29ubmVjdF9tZXNzYWdlID0gZGJ1c19tZXNzYWdl X3JlZihtc2cpOworCWlmIChnZXRfcmVjb3JkcyhhdV9kZXYpIDwgMCkgeworCQlkYnVzX21lc3Nh Z2VfdW5yZWYoZ3ctPmNvbm5lY3RfbWVzc2FnZSk7CisJCXJldHVybiBnX2RidXNfY3JlYXRlX2Vy cm9yKG1zZywgRVJST1JfSU5URVJGQUNFCisJCQkJCSAgICIuQ29ubmVjdEF0dGVtcHRGYWlsZWQi LAorCQkJCQkgICAiQ29ubmVjdCBBdHRlbXB0IEZhaWxlZCIpOworCX0KKwlyZXR1cm4gTlVMTDsK K30KKworc3RhdGljIERCdXNNZXNzYWdlICphZ19kaXNjb25uZWN0KERCdXNDb25uZWN0aW9uICog Y29ubiwgREJ1c01lc3NhZ2UgKiBtc2csCisJCQkJICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBh dWRpb19kZXZpY2UgKmRldmljZSA9IGRhdGE7CisJc3RydWN0IGdhdGV3YXkgKmd3ID0gZGV2aWNl LT5nYXRld2F5OworCURCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisJY2hhciBnd19hZGRyWzE4 XTsKKworCXJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuKG1zZyk7CisJaWYg KCFyZXBseSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoTlVMTCA9PSBndy0+cmZjb21tKQorCQly ZXR1cm4gZ19kYnVzX2NyZWF0ZV9lcnJvcihtc2csIEVSUk9SX0lOVEVSRkFDRQorCQkJCQkgICAi Lk5vdENvbm5lY3RlZCIsCisJCQkJCSAgICJEZXZpY2Ugbm90IENvbm5lY3RlZCIpOworCisJZ2F0 ZXdheV9jbG9zZShndyk7CisJYmEyc3RyKCZkZXZpY2UtPmRzdCwgZ3dfYWRkcik7CisJZGVidWco IkRpc2Nvbm5lY3RlZCBmcm9tICVzLCAlcyIsIGd3X2FkZHIsIGRldmljZS0+cGF0aCk7CisKKwly ZXR1cm4gcmVwbHk7CisKK30KKworc3RhdGljIERCdXNNZXNzYWdlICphZ19pc19jb25uZWN0ZWQo REJ1c0Nvbm5lY3Rpb24gKiBjb25uLAorCQkJCSAgICBEQnVzTWVzc2FnZSAqIG1zZywgdm9pZCAq ZGF0YSkKK3sKKwlnYm9vbGVhbiByZXMgPSBnYXRld2F5X2lzX2Nvbm5lY3RlZCgoc3RydWN0IGF1 ZGlvX2RldmljZSAqKSBkYXRhKTsKKwlEQnVzTWVzc2FnZSAqcmVwbHkgPSBkYnVzX21lc3NhZ2Vf bmV3X21ldGhvZF9yZXR1cm4obXNnKTsKKwlpZiAoTlVMTCAhPSByZXBseSkgeworCQlkYnVzX21l c3NhZ2VfYXBwZW5kX2FyZ3MocmVwbHksIERCVVNfVFlQRV9CT09MRUFOLCAmcmVzLAorCQkJCQkg REJVU19UWVBFX0lOVkFMSUQpOworCX0KKwlyZXR1cm4gcmVwbHk7Cit9CisKK3N0YXRpYyBEQnVz TWVzc2FnZSAqcHJvY2Vzc19hZ19yZXBvbnNlKERCdXNNZXNzYWdlICogbXNnLCBnY2hhciAqIHJl c3BvbnNlKQoreworCURCdXNNZXNzYWdlICpyZXBseTsKKwlpZiAoTlVMTCAhPSBzdHJzdHIocmVz cG9uc2UsIE9LX1JFU1BPTlNFKSkgeworCQlyZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9k X3JldHVybihtc2cpOworCX0gZWxzZSB7CisJCS8qIEZJWE1FOiBzb21lIGNvZGUgc2hvdWxkIGJl IGhlcmUgdG8gcHJvY2Vzc2VzIGVycm9ycyBpbiBiZXR0ZXIgZmFzaW9uICovCisJCWRlYnVnKCJB RyByZXNwb25kZWQgd2l0aCAnJXMnIHRvICVzIG1ldGhvZCBjYWxsIiwgcmVzcG9uc2UsCisJCSAg ICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyKG1zZykpOworCQlyZXBseSA9CisJCSAgICBkYnVz X21lc3NhZ2VfbmV3X2Vycm9yKG1zZywKKwkJCQkJICAgRVJST1JfSU5URVJGQUNFCisJCQkJCSAg ICIuT3BlcmF0aW9uRmFpbGVkIiwKKwkJCQkJICAgIk9wZXJhdGlvbiBmYWlsZWQuIFNlZSBsb2cg Zm9yIGRldGFpbHMiKTsKKwl9CisJcmV0dXJuIHJlcGx5OworfQorCitzdGF0aWMgREJ1c01lc3Nh Z2UgKnByb2Nlc3Nfc2ltcGxlKERCdXNNZXNzYWdlICogbXNnLAorCQkJCSAgIHN0cnVjdCBhdWRp b19kZXZpY2UgKmRldiwgZ2NoYXIgKiBkYXRhKQoreworCXN0cnVjdCBnYXRld2F5ICpndyA9IGRl di0+Z2F0ZXdheTsKKwlnY2hhciBidWZbUkZDT01NX0JVRl9TSVpFXTsKKworCXJmY29tbV9zdG9w X3dhdGNoKGRldik7CisJcmZjb21tX3NlbmRfYW5kX3JlYWQoZ3csIGRhdGEsIGJ1Ziwgc3RybGVu KGRhdGEpKTsKKwlyZmNvbW1fc3RhcnRfd2F0Y2goZGV2KTsKKwlyZXR1cm4gcHJvY2Vzc19hZ19y ZXBvbnNlKG1zZywgYnVmKTsKK30KKworI2RlZmluZSBBR19BTlNXRVIgIkFUQVxyIgorCitzdGF0 aWMgREJ1c01lc3NhZ2UgKmFnX2Fuc3dlcihEQnVzQ29ubmVjdGlvbiAqIGNvbm4sIERCdXNNZXNz YWdlICogbXNnLAorCQkJICAgICAgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gcHJvY2Vzc19zaW1w bGUobXNnLCAoc3RydWN0IGF1ZGlvX2RldmljZSAqKSBkYXRhLAorCQkJICAgICAgQUdfQU5TV0VS KTsKK30KKworI2RlZmluZSBBR19DQU5DRUxfQ1VSICJBVCtDSFVQXHIiCisKK3N0YXRpYyBEQnVz TWVzc2FnZSAqYWdfY2FuY2VsX2N1cihEQnVzQ29ubmVjdGlvbiAqIGNvbm4sIERCdXNNZXNzYWdl ICogbXNnLAorCQkJCSAgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gcHJvY2Vzc19zaW1wbGUobXNn LCAoc3RydWN0IGF1ZGlvX2RldmljZSAqKSBkYXRhLAorCQkJICAgICAgQUdfQ0FOQ0VMX0NVUik7 Cit9CisKKyNkZWZpbmUgQUxMT1dFRF9OVU1CRVJfU1lNQk9MUyAiMTIzNDU2Nzg5MCojK0FCQyIJ LyogYWNjb3JkaW5nIHRvIEdTTSBzcGVjICovCisjZGVmaW5lIEFHX1BMQUNFX0NBTEwgIkFURCVz XHIiCisvKiBkaWFsaW5nIGZyb20gbWVtb3J5IGlzIG5vdCBzdXBwb3J0ZWQgYXMgaGVhZHNldCBz cGVjIGRvZXNuJ3QgZGVmaW5lIGEgd2F5CisgICB0byByZXRyZWl2ZSBwaG9uZSBtZW1vcnkgZW50 cmllcy4KKyovCitzdGF0aWMgREJ1c01lc3NhZ2UgKmFnX2NhbGwoREJ1c0Nvbm5lY3Rpb24gKiBj b25uLCBEQnVzTWVzc2FnZSAqIG1zZywKKwkJCSAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBh dWRpb19kZXZpY2UgKmRldmljZSA9IGRhdGE7CisJc3RydWN0IGdhdGV3YXkgKmd3ID0gZGV2aWNl LT5nYXRld2F5OworCWdjaGFyIGJ1ZltSRkNPTU1fQlVGX1NJWkVdOworCWdjaGFyICpudW1iZXI7 CisJZ2ludCBhdGRfbGVuOworCisJZGJ1c19tZXNzYWdlX2dldF9hcmdzKG1zZywgTlVMTCwgREJV U19UWVBFX1NUUklORywgJm51bWJlciwKKwkJCSAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKwlp ZiAoc3RybGVuKG51bWJlcikgIT0gc3Ryc3BuKG51bWJlciwgQUxMT1dFRF9OVU1CRVJfU1lNQk9M UykpIHsKKwkJcmV0dXJuIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IobXNnLAorCQkJCQkgICAgICBF UlJPUl9JTlRFUkZBQ0UgIi5CYWROdW1iZXIiLAorCQkJCQkgICAgICAiTnVtYmVyIGNvbnRhaW5z IGNoYXJhY3RlcnMgd2hpY2ggYXJlIG5vdCBhbGxvd2VkIik7CisJfQorCWF0ZF9sZW4gPSBzcHJp bnRmKGJ1ZiwgQUdfUExBQ0VfQ0FMTCwgbnVtYmVyKTsKKwlyZmNvbW1fc3RvcF93YXRjaChkZXZp Y2UpOworCXJmY29tbV9zZW5kX2FuZF9yZWFkKGd3LCBidWYsIGJ1ZiwgYXRkX2xlbik7CisJcmZj b21tX3N0YXJ0X3dhdGNoKGRldmljZSk7CisJcmV0dXJuIHByb2Nlc3NfYWdfcmVwb25zZShtc2cs IGJ1Zik7Cit9CisKKyNkZWZpbmUgQUdfR0VUX0NBUlJJRVIgIkFUK0NPUFM/XHIiCisKK3N0YXRp YyBEQnVzTWVzc2FnZSAqYWdfZ2V0X29wZXJhdG9yKERCdXNDb25uZWN0aW9uICogY29ubiwKKwkJ CQkgICAgREJ1c01lc3NhZ2UgKiBtc2csIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGF1ZGlvX2Rl dmljZSAqZGV2ID0gKHN0cnVjdCBhdWRpb19kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgZ2F0ZXdh eSAqZ3cgPSBkZXYtPmdhdGV3YXk7CisJZ2NoYXIgYnVmW1JGQ09NTV9CVUZfU0laRV07CisJR0lP Q2hhbm5lbCAqcmZjb21tID0gZ3ctPnJmY29tbTsKKwlnc2l6ZSByZWFkOworCWdjaGFyICpyZXN1 bHQ7CisJREJ1c01lc3NhZ2UgKnJlcGx5OworCUdJT1N0YXR1cyBzdGF0dXM7CisKKwlyZmNvbW1f c3RvcF93YXRjaChkZXYpOworCWlvX2NoYW5uZWxfd3JpdGVfYWxsKHJmY29tbSwgQUdfR0VUX0NB UlJJRVIsCisJCQkgICAgIHN0cmxlbihBR19HRVRfQ0FSUklFUikpOworCisJc3RhdHVzID0KKwkg ICAgZ19pb19jaGFubmVsX3JlYWRfY2hhcnMocmZjb21tLCBidWYsIFJGQ09NTV9CVUZfU0laRSAt IDEsCisJCQkJICAgICZyZWFkLCBOVUxMKTsKKwlyZmNvbW1fc3RhcnRfd2F0Y2goZGV2KTsKKwlp ZiAoR19JT19TVEFUVVNfTk9STUFMID09IHN0YXR1cykgeworCQlidWZbcmVhZF0gPSAnXDAnOwor CQlpZiAoTlVMTCAhPSBzdHJzdHIoYnVmLCAiK0NPUFMiKSkgeworCQkJcmVzdWx0ID0gc3RycmNo cihidWYsICcsJykgKyAxOworCQkJcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1 cm4obXNnKTsKKwkJCWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyhyZXBseSwgREJVU19UWVBFX1NU UklORywKKwkJCQkJCSAmcmVzdWx0LAorCQkJCQkJIERCVVNfVFlQRV9JTlZBTElEKTsKKwkJfSBl bHNlIHsKKwkJCXdhcm4KKwkJCSAgICAoImFnX2dldF9vcGVyYXRvcigpOiAnK0NPUFMnIGV4cGVj dGVkIGJ1dCAnJXMnIHJlY2VpdmVkIiwKKwkJCSAgICAgYnVmKTsKKwkJCXJlcGx5ID0KKwkJCSAg ICBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yKG1zZywKKwkJCQkJCSAgIEVSUk9SX0lOVEVSRkFDRQor CQkJCQkJICAgIi5GYWlsZWQiLAorCQkJCQkJICAgIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSBB RyIpOworCQl9CisJfSBlbHNlIHsKKwkJZXJyb3IoImFnX2dldF9vcGVyYXRvcigpOiAlbSIpOwor CQlyZXBseSA9CisJCSAgICBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yKG1zZywKKwkJCQkJICAgRVJS T1JfSU5URVJGQUNFCisJCQkJCSAgICIuQ29ubmVjdGlvbkZhaWxlZCIsCisJCQkJCSAgICJGYWls ZWQgdG8gcmVjZWl2ZSByZXNwb25zZSBmcm9tIEFHIik7CisJfQorCXJldHVybiByZXBseTsKK30K KworI2RlZmluZSBBR19WUl9BQ1RJVkFURSAiQVQrQlZSQT0xXHIiCitzdGF0aWMgREJ1c01lc3Nh Z2UgKmFnX3ZyX2FjdGl2YXRlKERCdXNDb25uZWN0aW9uICogY29ubiwKKwkJCQkgICBEQnVzTWVz c2FnZSAqIG1zZywgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gcHJvY2Vzc19zaW1wbGUobXNnLCAo c3RydWN0IGF1ZGlvX2RldmljZSAqKSBkYXRhLAorCQkJICAgICAgQUdfVlJfQUNUSVZBVEUpOwor fQorCisjZGVmaW5lIEFHX1ZSX0RFQUNUSVZBVEUgIkFUK0JWUkE9MFxyIgorc3RhdGljIERCdXNN ZXNzYWdlICphZ192cl9kZWFjdGl2YXRlKERCdXNDb25uZWN0aW9uICogY29ubiwKKwkJCQkgICAg IERCdXNNZXNzYWdlICogbXNnLCB2b2lkICpkYXRhKQoreworCXJldHVybiBwcm9jZXNzX3NpbXBs ZShtc2csIChzdHJ1Y3QgYXVkaW9fZGV2aWNlICopIGRhdGEsCisJCQkgICAgICBBR19WUl9ERUFD VElWQVRFKTsKK30KKworI2RlZmluZSBBR19SRVFVRVNUX05VTUJFUiAiQVQrQklOUD0xXHIiCitz dGF0aWMgREJ1c01lc3NhZ2UgKmFnX2dldF9udW1iZXJfZm9yX3ZvaWNlKERCdXNDb25uZWN0aW9u ICogY29ubiwKKwkJCQkJICAgIERCdXNNZXNzYWdlICogbXNnLCB2b2lkICpkYXRhKQoreworCXN0 cnVjdCBhdWRpb19kZXZpY2UgKmRldmljZSA9IGRhdGE7CisJc3RydWN0IGdhdGV3YXkgKmd3ID0g ZGV2aWNlLT5nYXRld2F5OworCWdjaGFyIGJ1ZltSRkNPTU1fQlVGX1NJWkVdOworCWdjaGFyIG51 bWJlcltBR19DQUxMRVJfTlVNX1NJWkVdOworCisJcmZjb21tX3N0b3Bfd2F0Y2goZGV2aWNlKTsK KwlyZmNvbW1fc2VuZF9hbmRfcmVhZChndywgQUdfUkVRVUVTVF9OVU1CRVIsIGJ1ZiwKKwkJCSAg ICAgc3RybGVuKEFHX1JFUVVFU1RfTlVNQkVSKSk7CisJcmZjb21tX3N0YXJ0X3dhdGNoKGRldmlj ZSk7CisJaWYgKDEgPT0gc3NjYW5mKGJ1ZiwgIlxyXG4rQklOUDolc1xyXG4iLCBudW1iZXIpKSB7 CisJCURCdXNNZXNzYWdlICpyZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiht c2cpOworCQlkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MocmVwbHksIERCVVNfVFlQRV9TVFJJTkcs IG51bWJlciwKKwkJCQkJIERCVVNfVFlQRV9JTlZBTElEKTsKKwkJcmV0dXJuIHJlcGx5OworCX0g ZWxzZSB7CisJCXdhcm4KKwkJICAgICgiYWdfZ2V0X251bWJlcl9mb3Jfdm9pY2UoKTogQUcgcmV0 dXJuZWQgJyVzJyBpbiBwbGFjZSBvZiBudW1iZXIiLAorCQkgICAgIGJ1Zik7CisJCXJldHVybiBk YnVzX21lc3NhZ2VfbmV3X2Vycm9yKG1zZywKKwkJCQkJICAgICAgRVJST1JfSU5URVJGQUNFICIu RmFpbGVkIiwKKwkJCQkJICAgICAgIkFHIGRpZG4ndCByZXR1cm4gYSBudW1iZXIiKTsKKwl9Cit9 CisKKyNkZWZpbmUgQUdfU0VORF9EVE1GICJBVCtWVFM6JWNcciIKK3N0YXRpYyBEQnVzTWVzc2Fn ZSAqYWdfc2VuZF9kdG1mKERCdXNDb25uZWN0aW9uICogY29ubiwgREJ1c01lc3NhZ2UgKiBtc2cs CisJCQkJIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2aWNlID0gZGF0 YTsKKwlzdHJ1Y3QgZ2F0ZXdheSAqZ3cgPSBkZXZpY2UtPmdhdGV3YXk7CisJZ2NoYXIgYnVmW1JG Q09NTV9CVUZfU0laRV07CisJZ2NoYXIgKm51bWJlcjsKKwlnaW50IGNvbV9sZW47CisKKwlkYnVz X21lc3NhZ2VfZ2V0X2FyZ3MobXNnLCBOVUxMLCBEQlVTX1RZUEVfU1RSSU5HLCAmbnVtYmVyLAor CQkJICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCWlmIChzdHJsZW4obnVtYmVyKSAhPSBzdHJz cG4obnVtYmVyLCBBTExPV0VEX05VTUJFUl9TWU1CT0xTKSkgeworCQlyZXR1cm4gZGJ1c19tZXNz YWdlX25ld19lcnJvcihtc2csCisJCQkJCSAgICAgIEVSUk9SX0lOVEVSRkFDRSAiLkJhZE51bWJl ciIsCisJCQkJCSAgICAgICJOdW1iZXIgY29udGFpbnMgY2hhcmFjdGVycyB3aGljaCBhcmUgbm90 IGFsbG93ZWQiKTsKKwl9CisJZ2Jvb2xlYW4gZ290X29rID0gVFJVRTsKKwlnaW50IG51bV9sZW4g PSBzdHJsZW4obnVtYmVyKTsKKwlnaW50IGkgPSAwOworCXJmY29tbV9zdG9wX3dhdGNoKGRldmlj ZSk7CisJd2hpbGUgKGkgPCBudW1fbGVuICYmIGdvdF9vaykgeworCQljb21fbGVuID0gc3ByaW50 ZihidWYsIEFHX1NFTkRfRFRNRiwgbnVtYmVyW2ldKTsKKwkJcmZjb21tX3NlbmRfYW5kX3JlYWQo Z3csIGJ1ZiwgYnVmLCBjb21fbGVuKTsKKwkJZ290X29rID0gTlVMTCAhPSBzdHJzdHIoYnVmLCBP S19SRVNQT05TRSk7CisJCWkgKz0gMTsKKwl9CisJcmZjb21tX3N0YXJ0X3dhdGNoKGRldmljZSk7 CisJcmV0dXJuIHByb2Nlc3NfYWdfcmVwb25zZShtc2csIGJ1Zik7CisKK30KKworI2RlZmluZSBB R19TRVRfTUlDX0dBSU4gIkFUK1ZHTTolZFxyIgorc3RhdGljIERCdXNNZXNzYWdlICphZ19zZW5k X21pY19nYWluKERCdXNDb25uZWN0aW9uICogY29ubiwKKwkJCQkgICAgIERCdXNNZXNzYWdlICog bXNnLCB2b2lkICpkYXRhKQoreworCWdpbnQgdmFsdWU7CisJZ2NoYXIgYnVmW1JGQ09NTV9CVUZf U0laRV07CisJZGJ1c19tZXNzYWdlX2dldF9hcmdzKG1zZywgTlVMTCwgREJVU19UWVBFX0lOVDMy LCAmdmFsdWUsCisJCQkgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisJc3ByaW50ZihidWYsIEFH X1NFVF9NSUNfR0FJTiwgdmFsdWUpOworCXJldHVybiBwcm9jZXNzX3NpbXBsZShtc2csIChzdHJ1 Y3QgYXVkaW9fZGV2aWNlICopIGRhdGEsIGJ1Zik7Cit9CisKKworI2RlZmluZSBBR19TRVRfU1BF QUtFUl9HQUlOICJBVCtWR1M6JWRcciIKK3N0YXRpYyBEQnVzTWVzc2FnZSAqYWdfc2VuZF9zcGVh a2VyX2dhaW4oREJ1c0Nvbm5lY3Rpb24gKiBjb25uLAorCQkJCQkgREJ1c01lc3NhZ2UgKiBtc2cs IHZvaWQgKmRhdGEpCit7CisJZ2ludCB2YWx1ZTsKKwlnY2hhciBidWZbUkZDT01NX0JVRl9TSVpF XTsKKwlkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MobXNnLCBOVUxMLCBEQlVTX1RZUEVfSU5UMzIsICZ2 YWx1ZSwKKwkJCSAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKwlzcHJpbnRmKGJ1ZiwgQUdfU0VU X1NQRUFLRVJfR0FJTiwgdmFsdWUpOworCXJldHVybiBwcm9jZXNzX3NpbXBsZShtc2csIChzdHJ1 Y3QgYXVkaW9fZGV2aWNlICopIGRhdGEsIGJ1Zik7Cit9CisKKyNkZWZpbmUgQUdfR0VUX1NVQlND UklCRVJfTlVNUyAiQVQrQ05VTVxyIgorI2RlZmluZSBDTlVNX0xFTiA1CQkvKiBsZW5ndGggb2Yg IitDTlVNIiBzdHJpbmcgKi8KKyNkZWZpbmUgTUFYX05VTUJFUl9DTlQgMTYKK3N0YXRpYyBEQnVz TWVzc2FnZSAqYWdfZ2V0X3N1YnNjcmliZXJfbnVtcyhEQnVzQ29ubmVjdGlvbiAqIGNvbm4sCisJ CQkJCSAgIERCdXNNZXNzYWdlICogbXNnLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhdWRpb19k ZXZpY2UgKmRldmljZSA9IGRhdGE7CisJc3RydWN0IGdhdGV3YXkgKmd3ID0gZGV2aWNlLT5nYXRl d2F5OworCWdjaGFyIGJ1ZltSRkNPTU1fQlVGX1NJWkVdOworCWdjaGFyICpjdXJfY251bTsKKwln Y2hhciBudW1iZXJzW01BWF9OVU1CRVJfQ05UXVtBR19DQUxMRVJfTlVNX1NJWkVdOworCWludCBu dW1iZXJfY250ID0gMDsKKworCXJmY29tbV9zdG9wX3dhdGNoKGRldmljZSk7CisJcmZjb21tX3Nl bmRfYW5kX3JlYWQoZ3csIEFHX0dFVF9TVUJTQ1JJQkVSX05VTVMsIGJ1ZiwKKwkJCSAgICAgc3Ry bGVuKEFHX0dFVF9TVUJTQ1JJQkVSX05VTVMpKTsKKwlyZmNvbW1fc3RhcnRfd2F0Y2goZGV2aWNl KTsKKwljdXJfY251bSA9IHN0cnN0cihidWYsICIrQ05VTSIpOworCXdoaWxlIChOVUxMICE9IGN1 cl9jbnVtICYmIG51bWJlcl9jbnQgPCBNQVhfTlVNQkVSX0NOVCkgeworCQlzc2NhbmYoY3VyX2Nu dW0sICIrQ05VTTolcywiLCBudW1iZXJzW251bWJlcl9jbnRdKTsKKwkJbnVtYmVyX2NudCArPSAx OworCQljdXJfY251bSA9IHN0cnN0cihjdXJfY251bSArIENOVU1fTEVOLCAiK0NOVU0iKTsKKwl9 CisJREJ1c01lc3NhZ2UgKnJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuKG1z Zyk7CisJZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKHJlcGx5LCBEQlVTX1RZUEVfQVJSQVksIERC VVNfVFlQRV9TVFJJTkcsCisJCQkJICZudW1iZXJzLCBudW1iZXJfY250LCBEQlVTX1RZUEVfSU5W QUxJRCk7CisJcmV0dXJuIHJlcGx5OworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKmFnX3NlbmRf YXVkaW9fZGF0YShEQnVzQ29ubmVjdGlvbiAqIGNvbm4sCisJCQkJICAgICAgIERCdXNNZXNzYWdl ICogbXNnLCB2b2lkICpkYXRhKQoreworCWdjaGFyICphdWRpb19kYXRhOworCWdpbnQgZGF0YV9i eXRlX2NudDsKKwlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYgPSAoc3RydWN0IGF1ZGlvX2Rldmlj ZSAqKSBkYXRhOworCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldi0+Z2F0ZXdheTsKKworCWRidXNf bWVzc2FnZV9nZXRfYXJncyhtc2csIE5VTEwsIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZ VEUsCisJCQkgICAgICAmYXVkaW9fZGF0YSwgJmRhdGFfYnl0ZV9jbnQsCisJCQkgICAgICBEQlVT X1RZUEVfSU5WQUxJRCk7CisKKwlpZiAoaW9fY2hhbm5lbF93cml0ZV9hbGwoZ3ctPnNjbywgYXVk aW9fZGF0YSwgZGF0YV9ieXRlX2NudCkpIHsKKwkJcmV0dXJuIGRidXNfbWVzc2FnZV9uZXdfbWV0 aG9kX3JldHVybihtc2cpOworCX0gZWxzZSB7CisJCWVycm9yKCJhZ19zZW5kX2F1ZGlvX2RhdGEo KTogJW0iKTsKKwkJcmV0dXJuIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IobXNnLAorCQkJCQkgICAg ICBFUlJPUl9JTlRFUkZBQ0UKKwkJCQkJICAgICAgIi5Xcml0ZUZhaWxlZCIsCisJCQkJCSAgICAg ICJTQ08gZGF0YSBzZW5kIGZhaWxlZCIpOworCX0KK30KKworc3RhdGljIERCdXNNZXNzYWdlICph Z19ob2xkX2FsbF9idXRfdGhpcyhEQnVzQ29ubmVjdGlvbiAqIGNvbm4sCisJCQkJCSBEQnVzTWVz c2FnZSAqIG1zZywgdm9pZCAqZGF0YSkKK3sKKworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKmFn X2NhbmNlbF9hbGwoREJ1c0Nvbm5lY3Rpb24gKiBjb25uLCBEQnVzTWVzc2FnZSAqIG1zZywKKwkJ CQkgIHZvaWQgKmRhdGEpCit7CisKK30KKworc3RhdGljIERCdXNNZXNzYWdlICphZ19jYW5jZWxf c3BlYyhEQnVzQ29ubmVjdGlvbiAqIGNvbm4sCisJCQkJICAgREJ1c01lc3NhZ2UgKiBtc2csIHZv aWQgKmRhdGEpCit7CisKK30KKworc3RhdGljIERCdXNNZXNzYWdlICphZ19yYWhfcHV0X29uX2hv bGQoREJ1c0Nvbm5lY3Rpb24gKiBjb25uLAorCQkJCSAgICAgICBEQnVzTWVzc2FnZSAqIG1zZywg dm9pZCAqZGF0YSkKK3sKKworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKmFnX3JhaF9hbnN3ZXJf aGVsZF9jYWxsKERCdXNDb25uZWN0aW9uICogY29ubiwKKwkJCQkJICAgIERCdXNNZXNzYWdlICog bXNnLCB2b2lkICpkYXRhKQoreworCit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSAqYWdfcmFoX2Nh bmNlbF9oZWxkX2NhbGwoREJ1c0Nvbm5lY3Rpb24gKiBjb25uLAorCQkJCQkgICAgREJ1c01lc3Nh Z2UgKiBtc2csIHZvaWQgKmRhdGEpCit7CisKK30KKworc3RhdGljIEdEQnVzTWV0aG9kVGFibGUg Z2F0ZXdheV9tZXRob2RzW10gPSB7CisJeyJDb25uZWN0IiwgIiIsICIiLCBhZ19jb25uZWN0LCBH X0RCVVNfTUVUSE9EX0ZMQUdfQVNZTkN9CisJLCB7IkRpc2Nvbm5lY3QiLCAiIiwgIiIsIGFnX2Rp c2Nvbm5lY3R9CisJLCB7IklzQ29ubmVjdGVkIiwgIiIsICJiIiwgYWdfaXNfY29ubmVjdGVkfQor CSwgeyJBbnN3ZXJDYWxsIiwgIiIsICIiLCBhZ19hbnN3ZXJ9CisJLCB7IkNhbmNlbEN1cnJlbnRD YWxsIiwgIiIsICIiLCBhZ19jYW5jZWxfY3VyfQorCSwgeyJDYWxsIiwgInMiLCAiIiwgYWdfY2Fs bH0KKwksIHsiR2V0T3BlcmF0b3JOYW1lIiwgIiIsICJzIiwgYWdfZ2V0X29wZXJhdG9yfQorCSwg eyJWb2ljZVJlY29nbml0aW9uQWN0dmF0ZSIsICIiLCAiIiwgYWdfdnJfYWN0aXZhdGV9CisJLCB7 IlZvaWNlUmVjb2duaXRpb25EZWFjdHZhdGUiLCAiIiwgIiIsIGFnX3ZyX2RlYWN0aXZhdGV9CisJ LCB7IkdldE51bWJlckZvckxhc3RWb2ljZVRhZyIsICIiLCAicyIsIGFnX2dldF9udW1iZXJfZm9y X3ZvaWNlfQorCSwgeyJTZW5kRFRNRiIsICJzIiwgIiIsIGFnX3NlbmRfZHRtZn0KKwksIHsiU2Vu ZE1pY3JvcGhvbmVHYWluIiwgInkiLCAiIiwgYWdfc2VuZF9taWNfZ2Fpbn0KKwksIHsiU2VuZFNw ZWFrZXJHYWluIiwgInkiLCAiIiwgYWdfc2VuZF9zcGVha2VyX2dhaW59CisJLCB7IkdldFN1YnNj cmliZXJOdW1iZXJzIiwgIiIsICJhcyIsIGFnX2dldF9zdWJzY3JpYmVyX251bXN9CisKKwksIHsi UkFIUHV0T25Ib2xkIiwgIiIsICIiLCBhZ19yYWhfcHV0X29uX2hvbGR9CisJLCB7IlJBSEFuc3dl ckhlbGRDYWxsIiwgIiIsICIiLCBhZ19yYWhfYW5zd2VyX2hlbGRfY2FsbH0KKwksIHsiUkFIQ2Fu Y2VsSGVsZENhbGwiLCAiIiwgIiIsIGFnX3JhaF9jYW5jZWxfaGVsZF9jYWxsfQorCisJLCB7IkNh bmNlbENhbGxGcm9tTnVtYmVyIiwgInMiLCAiIiwgYWdfY2FuY2VsX3NwZWN9CisJLCB7IkNhbmNl bEFsbENhbGxzIiwgIiIsICIiLCBhZ19jYW5jZWxfYWxsfQorCSwgeyJIb2xkQWxsQnV0VGhpcyIs ICJzIiwgIiIsIGFnX2hvbGRfYWxsX2J1dF90aGlzfQorCisJLCB7IlNlbmRBdWRpb0RhdGEiLCAi YXkiLCAiIiwgYWdfc2VuZF9hdWRpb19kYXRhfQorCSwge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9 Cit9OworCitzdGF0aWMgR0RCdXNTaWduYWxUYWJsZSBnYXRld2F5X3NpZ25hbHNbXSA9IHsKKwl7 IkNvbm5lY3RlZCIsICJ1In0KKwksIHsiRGlzY29ubmVjdGVkIiwgIiJ9CisJLCB7IlJpbmciLCAi cyJ9CisJLCB7IlN0YXR1c1VwZGF0ZSIsICJzaSJ9CisJLCB7IkNhbGxDYW5jZWxsZWQiLCAiIn0K KwksIHsiQ2FsbFN0YXJ0IiwgIiJ9CisJLCB7IkNhbGxFbmQiLCAiIn0KKwksIHsiVm9pY2VSZWNv Z25pdGlvbkFjdGl2ZSIsICIifQorCSwgeyJWb2ljZVJlY29nbml0aW9uSW5hY3RpdmUiLCAiIn0K KwksIHsiTWljcm9waG9uZUdhaW4iLCAieSJ9CisJLCB7IlNwZWFrZXJHYWluIiwgInkifQorCSwg eyJSQUhDYWxsT25Ib2xkIiwgIiJ9CisJLCB7Ik5vQ2FsbHNIZWxkIiwgIiJ9CisJLCB7IkhvbGRD YWxscyIsICIifQorCSwgeyJBbGxDYWxsc0hlbGQiLCAiIn0KKwksIHsiQXVkaW9EYXRhIiwgImF5 In0KKwksIHtOVUxMLCBOVUxMfQorfTsKKworZ2Jvb2xlYW4gZ2F0ZXdheV9pc19jb25uZWN0ZWQo c3RydWN0IGF1ZGlvX2RldmljZSAqZGV2KQoreworCXJldHVybiAoTlVMTCA9PSBkZXYpIHx8IChO VUxMID09IGRldi0+Z2F0ZXdheSkKKwkgICAgfHwgKE5VTEwgPT0gZGV2LT5nYXRld2F5LT5yZmNv bW0pOworfQorCitzdHJ1Y3QgZ2F0ZXdheSAqZ2F0ZXdheV9pbml0KHN0cnVjdCBhdWRpb19kZXZp Y2UgKmRldikKK3sKKwlpZiAoIWdfZGJ1c19yZWdpc3Rlcl9pbnRlcmZhY2UoZGV2LT5jb25uLCBk ZXYtPnBhdGgsCisJCQkJICAgICAgIEFVRElPX0dBVEVXQVlfSU5URVJGQUNFLAorCQkJCSAgICAg ICBnYXRld2F5X21ldGhvZHMsIGdhdGV3YXlfc2lnbmFscywKKwkJCQkgICAgICAgTlVMTCwgZGV2 LCBOVUxMKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3RydWN0IGdhdGV3YXkgKmd3ID0gZ19u ZXcwKHN0cnVjdCBnYXRld2F5LCAxKTsKKwlndy0+aW5kaWVzID0gTlVMTDsKKwlndy0+aXNfZGlh bGluZyA9IEZBTFNFOworCXJldHVybiBndzsKK30KKworCitpbnQgZ2F0ZXdheV9jb25uZWN0X3Jm Y29tbShzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYsIEdJT0NoYW5uZWwgKiBpbykKK3sKKwlpZiAo IWlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+Z2F0ZXdheS0+cmZjb21tID0gaW87CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5kaWNhdG9yX3NsaWNlX2ZyZWUoZ3BvaW50 ZXIgbWVtKQoreworCWdfc2xpY2VfZnJlZShzdHJ1Y3QgaW5kaWNhdG9yLCBtZW0pOworfQorCitp bnQgZ2F0ZXdheV9jbG9zZShzdHJ1Y3QgZ2F0ZXdheSAqZ3cpCit7CisJR0lPQ2hhbm5lbCAqcmZj b21tID0gZ3ctPnJmY29tbTsKKwlHSU9DaGFubmVsICpzY28gPSBndy0+c2NvOworCUdJT0NoYW5u ZWwgKnNjb19zZXJ2ZXIgPSBndy0+c2NvX3NlcnZlcjsKKwlnX3NsaXN0X2ZvcmVhY2goZ3ctPmlu ZGllcywgKEdGdW5jKSBpbmRpY2F0b3Jfc2xpY2VfZnJlZSwgTlVMTCk7CisJZ19zbGlzdF9mcmVl KGd3LT5pbmRpZXMpOworCWlmIChyZmNvbW0pIHsKKwkJZ19pb19jaGFubmVsX2Nsb3NlKHJmY29t bSk7CisJCWdfaW9fY2hhbm5lbF91bnJlZihyZmNvbW0pOworCQlndy0+cmZjb21tID0gTlVMTDsK Kwl9CisKKwlpZiAoc2NvKSB7CisJCWdfaW9fY2hhbm5lbF9jbG9zZShzY28pOworCQlnX2lvX2No YW5uZWxfdW5yZWYoc2NvKTsKKwkJZ3ctPnNjbyA9IE5VTEw7CisJfQorCisJaWYgKHNjb19zZXJ2 ZXIpIHsKKwkJZ19pb19jaGFubmVsX2Nsb3NlKHNjb19zZXJ2ZXIpOworCQlnX2lvX2NoYW5uZWxf dW5yZWYoc2NvX3NlcnZlcik7CisJCWd3LT5zY29fc2VydmVyID0gTlVMTDsKKwl9CisJcmV0dXJu IDA7Cit9CmRpZmYgLS1naXQgYS9hdWRpby9nYXRld2F5LmggYi9hdWRpby9nYXRld2F5LmgKaW5k ZXggM2U0NDkzNy4uNjhlMzRhMCAxMDA2NDQKLS0tIGEvYXVkaW8vZ2F0ZXdheS5oCisrKyBiL2F1 ZGlvL2dhdGV3YXkuaApAQCAtMjIsMTMgKzIyLDIzIEBACiAgKgogICovCiAKKworCisjaWZuZGVm IF9fR0FURVdBWV9IX18KKyNkZWZpbmUgX19HQVRFV0FZX0hfXworCisjaW5jbHVkZSAiZGV2aWNl LmgiCisKICNkZWZpbmUgQVVESU9fR0FURVdBWV9JTlRFUkZBQ0UgIm9yZy5ibHVlei5HYXRld2F5 IgogCiAjZGVmaW5lIERFRkFVTFRfSFNQX0hTX0NIQU5ORUwgNgogI2RlZmluZSBERUZBVUxUX0hG UF9IU19DSEFOTkVMIDcKIAotaW50IGdhdGV3YXlfaW5pdChEQnVzQ29ubmVjdGlvbiAqY29ubiwg Z2Jvb2xlYW4gZGlzYWJsZV9oZnAsIGdib29sZWFuIHNjb19oY2kpOworc3RydWN0IGdhdGV3YXkq IGdhdGV3YXlfaW5pdChzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UpOworCitnYm9vbGVhbiBn YXRld2F5X2lzX2Nvbm5lY3RlZChzdHJ1Y3QgYXVkaW9fZGV2aWNlKiBkZXYpOworCitpbnQgZ2F0 ZXdheV9jb25uZWN0X3JmY29tbShzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYsIEdJT0NoYW5uZWwg KmNoYW4pOwogCi12b2lkIGdhdGV3YXlfZXhpdCh2b2lkKTsKKyNlbmRpZiAvKl9fR0FURVdBWV9I X18qLwogCi1nYm9vbGVhbiBnYXRld2F5X2lzX2VuYWJsZWQodWludDE2X3Qgc3ZjKTsKZGlmZiAt LWdpdCBhL2F1ZGlvL21hbmFnZXIuYyBiL2F1ZGlvL21hbmFnZXIuYwppbmRleCA0NTNlMjczLi5h ZDEzNjcwIDEwMDY0NAotLS0gYS9hdWRpby9tYW5hZ2VyLmMKKysrIGIvYXVkaW8vbWFuYWdlci5j CkBAIC05MSwxMCArOTEsMTAgQEAgc3RydWN0IGF1ZGlvX2FkYXB0ZXIgewogCWNoYXIJKnBhdGg7 CiAJdWludDMyX3QgaHNwX2FnX3JlY29yZF9pZDsKIAl1aW50MzJfdCBoZnBfYWdfcmVjb3JkX2lk OwotCXVpbnQzMl90IGhzcF9oc19yZWNvcmRfaWQ7CisJdWludDMyX3QgaGZwX2hzX3JlY29yZF9p ZDsKIAlHSU9DaGFubmVsICpoc3BfYWdfc2VydmVyOwogCUdJT0NoYW5uZWwgKmhmcF9hZ19zZXJ2 ZXI7Ci0JR0lPQ2hhbm5lbCAqaHNwX2hzX3NlcnZlcjsKKwlHSU9DaGFubmVsICpoZnBfaHNfc2Vy dmVyOwogfTsKIAogc3RhdGljIGludCBtYXhfY29ubmVjdGVkX2hlYWRzZXRzID0gMTsKQEAgLTEz MiwxMSArMTMyLDExIEBAIGdib29sZWFuIHNlcnZlcl9pc19lbmFibGVkKGJkYWRkcl90ICpzcmMs IHVpbnQxNl90IHN2YykKIAljYXNlIEhFQURTRVRfU1ZDTEFTU19JRDoKIAkJcmV0dXJuIGVuYWJs ZWQuaGVhZHNldDsKIAljYXNlIEhFQURTRVRfQUdXX1NWQ0xBU1NfSUQ6Ci0JCXJldHVybiBlbmFi bGVkLmdhdGV3YXk7CisJCXJldHVybiAgRkFMU0U7CiAJY2FzZSBIQU5EU0ZSRUVfU1ZDTEFTU19J RDoKIAkJcmV0dXJuIGVuYWJsZWQuaGVhZHNldCAmJiBlbmFibGVkLmhmcDsKIAljYXNlIEhBTkRT RlJFRV9BR1dfU1ZDTEFTU19JRDoKLQkJcmV0dXJuICBGQUxTRTsKKwkJcmV0dXJuIGVuYWJsZWQu Z2F0ZXdheTsKIAljYXNlIEFVRElPX1NJTktfU1ZDTEFTU19JRDoKIAkJcmV0dXJuIGVuYWJsZWQu c2luazsKIAljYXNlIEFWX1JFTU9URV9UQVJHRVRfU1ZDTEFTU19JRDoKQEAgLTE5Miw2ICsxOTIs MTAgQEAgc3RhdGljIHZvaWQgaGFuZGxlX3V1aWQoY29uc3QgY2hhciAqdXVpZHN0ciwgc3RydWN0 IGF1ZGlvX2RldmljZSAqZGV2aWNlKQogCQlicmVhazsKIAljYXNlIEhBTkRTRlJFRV9BR1dfU1ZD TEFTU19JRDoKIAkJZGVidWcoIkZvdW5kIEhhbmRzZnJlZSBBRyByZWNvcmQiKTsKKwkJaWYgKGRl dmljZS0+Z2F0ZXdheSA9PSBOVUxMKSB7CisJCQlkZXZpY2UtPmdhdGV3YXkgPSBnYXRld2F5X2lu aXQoZGV2aWNlKTsKKwkJfQorCiAJCWJyZWFrOwogCWNhc2UgQVVESU9fU0lOS19TVkNMQVNTX0lE OgogCQlkZWJ1ZygiRm91bmQgQXVkaW8gU2luayIpOwpAQCAtMjc3LDcgKzI4MSw3IEBAIHN0YXRp YyBzZHBfcmVjb3JkX3QgKmhzcF9hZ19yZWNvcmQodWludDhfdCBjaCkKIAlyZXR1cm4gcmVjb3Jk OwogfQogCi1zdGF0aWMgc2RwX3JlY29yZF90ICpoc3BfaHNfcmVjb3JkKHVpbnQ4X3QgY2gpCitz dGF0aWMgc2RwX3JlY29yZF90ICpoZnBfaHNfcmVjb3JkKHVpbnQ4X3QgY2gpCiB7CiAJc2RwX2xp c3RfdCAqc3ZjbGFzc19pZCwgKnBmc2VxLCAqYXBzZXEsICpyb290OwogCXV1aWRfdCByb290X3V1 aWQsIHN2Y2xhc3NfdXVpZCwgZ2Ffc3ZjbGFzc191dWlkOwpAQCAtMjk1LDEzICsyOTksMTMgQEAg c3RhdGljIHNkcF9yZWNvcmRfdCAqaHNwX2hzX3JlY29yZCh1aW50OF90IGNoKQogCXJvb3QgPSBz ZHBfbGlzdF9hcHBlbmQoMCwgJnJvb3RfdXVpZCk7CiAJc2RwX3NldF9icm93c2VfZ3JvdXBzKHJl Y29yZCwgcm9vdCk7CiAKLQlzZHBfdXVpZDE2X2NyZWF0ZSgmc3ZjbGFzc191dWlkLCBIRUFEU0VU X1NWQ0xBU1NfSUQpOworCXNkcF91dWlkMTZfY3JlYXRlKCZzdmNsYXNzX3V1aWQsIEhBTkRTRlJF RV9TVkNMQVNTX0lEKTsKIAlzdmNsYXNzX2lkID0gc2RwX2xpc3RfYXBwZW5kKDAsICZzdmNsYXNz X3V1aWQpOwogCXNkcF91dWlkMTZfY3JlYXRlKCZnYV9zdmNsYXNzX3V1aWQsIEdFTkVSSUNfQVVE SU9fU1ZDTEFTU19JRCk7CiAJc3ZjbGFzc19pZCA9IHNkcF9saXN0X2FwcGVuZChzdmNsYXNzX2lk LCAmZ2Ffc3ZjbGFzc191dWlkKTsKIAlzZHBfc2V0X3NlcnZpY2VfY2xhc3NlcyhyZWNvcmQsIHN2 Y2xhc3NfaWQpOwogCi0Jc2RwX3V1aWQxNl9jcmVhdGUoJnByb2ZpbGUudXVpZCwgSEVBRFNFVF9Q Uk9GSUxFX0lEKTsKKwlzZHBfdXVpZDE2X2NyZWF0ZSgmcHJvZmlsZS51dWlkLCBIQU5EU0ZSRUVf UFJPRklMRV9JRCk7CiAJcHJvZmlsZS52ZXJzaW9uID0gMHgwMTAwOwogCXBmc2VxID0gc2RwX2xp c3RfYXBwZW5kKDAsICZwcm9maWxlKTsKIAlzZHBfc2V0X3Byb2ZpbGVfZGVzY3MocmVjb3JkLCBw ZnNlcSk7CkBAIC0zMTksNyArMzIzLDcgQEAgc3RhdGljIHNkcF9yZWNvcmRfdCAqaHNwX2hzX3Jl Y29yZCh1aW50OF90IGNoKQogCWFwcm90byA9IHNkcF9saXN0X2FwcGVuZCgwLCBhcHNlcSk7CiAJ c2RwX3NldF9hY2Nlc3NfcHJvdG9zKHJlY29yZCwgYXByb3RvKTsKIAotCXNkcF9zZXRfaW5mb19h dHRyKHJlY29yZCwgIkhlYWRzZXQiLCAwLCAwKTsKKwlzZHBfc2V0X2luZm9fYXR0cihyZWNvcmQs ICJIYW5kcy1GcmVlIiwgMCwgMCk7CiAKIAlzZHBfZGF0YV9mcmVlKGNoYW5uZWwpOwogCXNkcF9s aXN0X2ZyZWUocHJvdG9bMF0sIDApOwpAQCAtMzk4LDcgKzQwMiw3IEBAIHN0YXRpYyBzZHBfcmVj b3JkX3QgKmhmcF9hZ19yZWNvcmQodWludDhfdCBjaCwgdWludDMyX3QgZmVhdCkKIAlyZXR1cm4g cmVjb3JkOwogfQogCi1zdGF0aWMgdm9pZCBhdXRoX2NiKERCdXNFcnJvciAqZGVyciwgdm9pZCAq dXNlcl9kYXRhKQorc3RhdGljIHZvaWQgaGVhZHNldF9hdXRoX2NiKERCdXNFcnJvciAqZGVyciwg dm9pZCAqdXNlcl9kYXRhKQogewogCXN0cnVjdCBhdWRpb19kZXZpY2UgKmRldmljZSA9IHVzZXJf ZGF0YTsKIAljb25zdCBjaGFyICp1dWlkOwpAQCAtNDc5LDcgKzQ4Myw3IEBAIHN0YXRpYyB2b2lk IGFnX2lvX2NiKEdJT0NoYW5uZWwgKmNoYW4sIGludCBlcnIsIGNvbnN0IGJkYWRkcl90ICpzcmMs CiAJaGVhZHNldF9zZXRfc3RhdGUoZGV2aWNlLCBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RfSU5fUFJP R1JFU1MpOwogCiAJZXJyID0gYnRkX3JlcXVlc3RfYXV0aG9yaXphdGlvbigmZGV2aWNlLT5zcmMs ICZkZXZpY2UtPmRzdCwKLQkJCQkJc2VydmVyX3V1aWQsIGF1dGhfY2IsIGRldmljZSk7CisJCQkJ CXNlcnZlcl91dWlkLCBoZWFkc2V0X2F1dGhfY2IsIGRldmljZSk7CiAJaWYgKGVyciA8IDApIHsK IAkJZGVidWcoIkF1dGhvcml6YXRpb24gZGVuaWVkOiAlcyIsIHN0cmVycm9yKC1lcnIpKTsKIAkJ aGVhZHNldF9zZXRfc3RhdGUoZGV2aWNlLCBIRUFEU0VUX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CkBA IC00OTMsMTAgKzQ5Nyw0OSBAQCBkcm9wOgogCWdfaW9fY2hhbm5lbF91bnJlZihjaGFuKTsKIH0K IAotc3RhdGljIHZvaWQgaHNfaW9fY2IoR0lPQ2hhbm5lbCAqY2hhbiwgaW50IGVyciwgY29uc3Qg YmRhZGRyX3QgKnNyYywKKworc3RhdGljIHZvaWQgZ2F0ZXdheV9hdXRoX2NiKERCdXNFcnJvciAq ZGVyciwgdm9pZCAqdXNlcl9kYXRhKQoreworCWlmIChkZXJyICYmIGRidXNfZXJyb3JfaXNfc2V0 KGRlcnIpKSB7CisJCWVycm9yKCJBY2Nlc3MgZGVuaWVkOiAlcyIsIGRlcnItPm1lc3NhZ2UpOwor CX0gCit9CisKK3N0YXRpYyB2b2lkIGhmX2lvX2NiKEdJT0NoYW5uZWwgKmNoYW4sIGludCBlcnIs IGNvbnN0IGJkYWRkcl90ICpzcmMsCiAJCWNvbnN0IGJkYWRkcl90ICpkc3QsIHZvaWQgKmRhdGEp CiB7Ci0JLypTdHViKi8KKwlzdHJ1Y3QgYXVkaW9fYWRhcHRlciAqYWRhcHRlciA9IGRhdGE7CisJ Y29uc3QgY2hhciAqc2VydmVyX3V1aWQsICpyZW1vdGVfdXVpZDsKKwl1aW50MTZfdCBzdmNsYXNz OworCXN0cnVjdCBhdWRpb19kZXZpY2UgKmRldmljZTsKKworCWlmIChlcnIgPCAwKSB7CisJCWVy cm9yKCJhY2NlcHQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisJCXJldHVybjsK Kwl9CisKKwlzZXJ2ZXJfdXVpZCA9IEhTUF9IU19VVUlEOworCXJlbW90ZV91dWlkID0gSFNQX0FH X1VVSUQ7CisJc3ZjbGFzcyA9IEhFQURTRVRfQUdXX1NWQ0xBU1NfSUQ7CisKKwlkZXZpY2UgPSBt YW5hZ2VyX2dldF9kZXZpY2Uoc3JjLCBkc3QpOworCWlmICghZGV2aWNlKSB7CisJCWRlYnVnKCJG YWlsZWQgdG8gZ2V0IGRldmljZSIpOworCX0gZWxzZSBpZiAoIWRldmljZS0+Z2F0ZXdheSkgewor CQlidGRfZGV2aWNlX2FkZF91dWlkKGRldmljZS0+YnRkX2RldiwgcmVtb3RlX3V1aWQpOworCX0g ZWxzZSBpZiAoZ2F0ZXdheV9pc19jb25uZWN0ZWQoZGV2aWNlKSkgeworCQlkZWJ1ZygiUmVmdXNp bmcgbmV3IGNvbm5lY3Rpb24gc2luY2Ugb25lIGFscmVhZHkgZXhpc3RzIik7CisJfSBlbHNlIGlm ICgwID4gYnRkX3JlcXVlc3RfYXV0aG9yaXphdGlvbigmZGV2aWNlLT5zcmMsICZkZXZpY2UtPmRz dCwKKwkJCQkJICAgICBzZXJ2ZXJfdXVpZCwgZ2F0ZXdheV9hdXRoX2NiLCBkZXZpY2UpKSB7CisJ CWRlYnVnKCJBdXRob3JpemF0aW9uIGRlbmllZCEiKTsKKwl9IGVsc2UgaWYgKGdhdGV3YXlfY29u bmVjdF9yZmNvbW0oZGV2aWNlLCBjaGFuKSA8IDApIHsKKwkJZXJyb3IoIkFsbG9jYXRpbmcgbmV3 IEdJT0NoYW5uZWwgZmFpbGVkISIpOworCX0gZWxzZSB7CisJCXJldHVybjsKKwl9CisKKwlnX2lv X2NoYW5uZWxfY2xvc2UoY2hhbik7CisJZ19pb19jaGFubmVsX3VucmVmKGNoYW4pOwogCXJldHVy bjsKIH0KIApAQCAtNjA5LDI2ICs2NTIsMjYgQEAgc3RhdGljIGludCBnYXRld2F5X3NlcnZlcl9p bml0KHN0cnVjdCBhdWRpb19hZGFwdGVyICphZGFwdGVyKQogCWlmIChtYXN0ZXIpCiAJCWZsYWdz IHw9IFJGQ09NTV9MTV9NQVNURVI7CiAKLQlhZGFwdGVyLT5oc3BfaHNfc2VydmVyID0gYnRfcmZj b21tX2xpc3RlbigmYWRhcHRlci0+c3JjLCBjaGFuLCBmbGFncywKLQkJCQloc19pb19jYiwgYWRh cHRlcik7Ci0JaWYgKCFhZGFwdGVyLT5oc3BfaHNfc2VydmVyKQorCWFkYXB0ZXItPmhmcF9oc19z ZXJ2ZXIgPSBidF9yZmNvbW1fbGlzdGVuKCZhZGFwdGVyLT5zcmMsIGNoYW4sIGZsYWdzLAorCQkJ CWhmX2lvX2NiLCBhZGFwdGVyKTsKKwlpZiAoIWFkYXB0ZXItPmhmcF9oc19zZXJ2ZXIpCiAJCXJl dHVybiAtMTsKIAotCXJlY29yZCA9IGhzcF9oc19yZWNvcmQoY2hhbik7CisJcmVjb3JkID0gaGZw X2hzX3JlY29yZChjaGFuKTsKIAlpZiAoIXJlY29yZCkgewogCQllcnJvcigiVW5hYmxlIHRvIGFs bG9jYXRlIG5ldyBzZXJ2aWNlIHJlY29yZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKGFk ZF9yZWNvcmRfdG9fc2VydmVyKCZhZGFwdGVyLT5zcmMsIHJlY29yZCkgPCAwKSB7Ci0JCWVycm9y KCJVbmFibGUgdG8gcmVnaXN0ZXIgSFNQIEhTIHNlcnZpY2UgcmVjb3JkIik7CisJCWVycm9yKCJV bmFibGUgdG8gcmVnaXN0ZXIgSEZQIEhTIHNlcnZpY2UgcmVjb3JkIik7CiAJCXNkcF9yZWNvcmRf ZnJlZShyZWNvcmQpOwotCQlnX2lvX2NoYW5uZWxfdW5yZWYoYWRhcHRlci0+aHNwX2hzX3NlcnZl cik7Ci0JCWFkYXB0ZXItPmhzcF9oc19zZXJ2ZXIgPSBOVUxMOworCQlnX2lvX2NoYW5uZWxfdW5y ZWYoYWRhcHRlci0+aGZwX2hzX3NlcnZlcik7CisJCWFkYXB0ZXItPmhmcF9oc19zZXJ2ZXIgPSBO VUxMOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JYWRhcHRlci0+aHNwX2hzX3JlY29yZF9pZCA9IHJl Y29yZC0+aGFuZGxlOworCWFkYXB0ZXItPmhmcF9oc19yZWNvcmRfaWQgPSByZWNvcmQtPmhhbmRs ZTsKIAogCXJldHVybiAwOwogfQpAQCAtNzcwLDE0ICs4MTMsMTQgQEAgc3RhdGljIHZvaWQgZ2F0 ZXdheV9zZXJ2ZXJfcmVtb3ZlKHN0cnVjdCBidGRfYWRhcHRlciAqYWRhcHRlcikKIAlpZiAoIWFk cCkKIAkJcmV0dXJuOwogCi0JaWYgKGFkcC0+aHNwX2hzX3JlY29yZF9pZCkgewotCQlyZW1vdmVf cmVjb3JkX2Zyb21fc2VydmVyKGFkcC0+aHNwX2hzX3JlY29yZF9pZCk7Ci0JCWFkcC0+aHNwX2hz X3JlY29yZF9pZCA9IDA7CisJaWYgKGFkcC0+aGZwX2hzX3JlY29yZF9pZCkgeworCQlyZW1vdmVf cmVjb3JkX2Zyb21fc2VydmVyKGFkcC0+aGZwX2hzX3JlY29yZF9pZCk7CisJCWFkcC0+aGZwX2hz X3JlY29yZF9pZCA9IDA7CiAJfQogCi0JaWYgKGFkcC0+aHNwX2hzX3NlcnZlcikgewotCQlnX2lv X2NoYW5uZWxfdW5yZWYoYWRwLT5oc3BfaHNfc2VydmVyKTsKLQkJYWRwLT5oc3BfaHNfc2VydmVy ID0gTlVMTDsKKwlpZiAoYWRwLT5oZnBfaHNfc2VydmVyKSB7CisJCWdfaW9fY2hhbm5lbF91bnJl ZihhZHAtPmhmcF9oc19zZXJ2ZXIpOworCQlhZHAtPmhmcF9oc19zZXJ2ZXIgPSBOVUxMOwogCX0K IH0KIAo= ------=_Part_23039_28685571.1229672193838 Content-Type: application/octet-stream; name=audio-api.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fowj2hd01 Content-Disposition: attachment; filename=audio-api.patch ZGlmZiAtLWdpdCBhL2RvYy9hdWRpby1hcGkudHh0IGIvZG9jL2F1ZGlvLWFwaS50eHQKaW5kZXgg YTczYmEyMC4uY2RiNmRlOSAxMDA2NDQKLS0tIGEvZG9jL2F1ZGlvLWFwaS50eHQKKysrIGIvZG9j L2F1ZGlvLWFwaS50eHQKQEAgLTE5NSwzICsxOTUsMTIwIEBAIHByb3BlcnRpZXMJYm9vbGVhbiBD b25uZWN0ZWQgW3JlYWRvbmx5XQogCiAJCQlJbmRpY2F0ZXMgaWYgYSBzdHJlYW0gaXMgYWN0aXZl IHRvIGEgQTJEUCBzaW5rIG9uCiAJCQl0aGUgcmVtb3RlIGRldmljZS4KKworCitBdWRpb1Npbmsg aGllcmFyY2h5Cis9PT09PT09PT09PT09PT09PT09CisKK1NlcnZpY2UJCW9yZy5ibHVlegorSW50 ZXJmYWNlCW9yZy5ibHVlei5HYXRld2F5CitPYmplY3QgcGF0aAlbdmFyaWFibGUgcHJlZml4XS97 aGNpMCxoY2kxLC4uLn0vZGV2X1hYX1hYX1hYX1hYX1hYX1hYCisKK1RoaXMgaW50ZXJmYWNlIGlz IGF2YWlsYWJsZSBmb3IgcmVtb3RlIGRldmljZXMgd2hpY2ggY2FuIGZ1bmN0aW9uIGluIHRoZSBB dWRpbworR2F0ZXdheSByb2xlIG9mIHRoZSBIRlAgcHJvZmlsZXMuCisKK01ldGhvZHMJCXZvaWQg Q29ubmVjdCgpCisKKwkJICAgICBDb25uZWN0IHRvIHRoZSBBRyBzZXJ2aWNlIG9uIHRoZSByZW1v dGUgZGV2aWNlLgorCisJCXZvaWQgRGlzY29ubmVjdCgpCisJCWJvb2xlYW4gSXNDb25uZWN0ZWQo KQorCisJCXZvaWQgQW5zd2VyQ2FsbCgpCisJCQorCQkgICAgICBJdCBoYXMgdG8gY2FsbGVkIG9u bHkgYWZ0ZXIgUmluZyBzaWduYWwgcmVjZWl2ZWQuCisgICAgCisgICAgCQl2b2lkIENhbmNlbEN1 cnJlbnRDYWxsKCkKKworCQkgICAgICBDYW5jZWwgY2FsbCB3aGljaCBpcyBydW5uaW5nIG5vdy4g VGhpcyBvbmUgZG9lcyBub3RoaW5nIHdpdGggYW55IDMtd2F5CisJCSAgICAgIHNpdHVhdGlvbiBp bmNsLiBSYUguIEp1c3QgcGxhaW4gb2xkIFBESC4KKyAgICAgICAgIAorCSAJdm9pZCBDYWxsKHN0 cmluZyBudW1iZXIpCisKKwkJICAgICAgRGlhbCBhIG51bWJlciAnbnVtYmVyJy4gTm8gbnVtYmVy IHByb2Nlc3NpbmcgaXMgZG9uZSB0aHVzIGlmIEFHIHdvdWxkIAorCQkgICAgICByZWplY3QgdG8g ZGlhbCBpdCBkb24ndCBibGFtZSBtZSA6KQorICAgIAorICAgIAkJc3RyaW5nIEdldE9wZXJhdG9y TmFtZSgpCisgICAgCisgICAgCQl2b2lkIFZvaWNlUmVjb2duaXRpb25BY3RpdmF0ZSgpCisJCSAg ICAgIGluIGRldmVsb3BtZW50CisJCXZvaWQgVm9pY2VSZWNvZ25pdGlvbkRlYWN0aXZhdGUoKQor CQkgICAgICBpbiBkZXZlbG9wbWVudAorCisJCXN0cmluZyBHZXROdW1iZXJGb3JMYXN0Vm9pY2VU YWcoKQorCisJCSAgICAgIEFzayBBRyB0byBwcm92aWRlIGEgcGhvbmUgbnVtYmVyLiBJdCBsb29r cyBsaWtlIEFHIHNoZWxsIGluIHR1cm4gCisJCSAgICAgIGFzayB1c2VyIHRvIGNob29zZSBvbmUu IElkZWEgYmVoaW5kIHRoaXMgaXMgVlIgb24gdGhlIEhGIHNpZGUuCisKKyAgICAJCXZvaWQgU2Vu ZERUTUYoc3RyaW5nIGRpZ2l0cykKKworCQkgICAgICBXaWxsIHNlbmQgZWFjaCBkaWdpdCBpbiB0 aGUgJ2RpZ2l0cycgc2VxdWVudGlhbGx5LiBXb3VsZCBzZW5kIAorCQkgICAgICBub3RoaW5nIGlm IHRoZXJlIGlzIG5vbi1kdG1mIGRpZ2l0LgorCisJCXZvaWQgU2VuZE1pY3JvcGhvbmVHYWluKHVp bnQ4IGdhaW4pCisJCXZvaWQgU2VuZFNwZWFrZXJHYWluKHVpbnQ4IGdhaW4pCisKKwkJICAgICAg RmVlbCB0aGVtIHVzZWxlc3MgYnV0IHJlYWxseSBlYXN5IHRvIGltcGxlbWVudCA6KQorICAgIAor ICAgIAkJc3RyaW5nW10gR2V0U3Vic2NyaWJlck51bWJlcnMoKQorCisJCSAgICAgIEdldCBhbGwg dGhlIG51bWJlcnMgb2YgQUcKKworCQl2b2lkIFNlbmRBdWRpb0RhdGEodWludDhbXSBkYXRhKQor CisJCSAgICAgIFdvdWxkIG9ubHkgYmUgZWZmZWN0aXZlIHdoZW4gY2FsbCBvciBWUiBpcyBydW5u aW5nCisJCSAgICAgIChpLmUuIFNDTyBsaW5rIGFrYSBBdWRpbyBDb25uZWN0aW9uIGV4aXN0cyku IERhdGEgc2hvdWxkIGJlIAorCQkgICAgICBwbGFpbiAxNiBiaXQgTEUgUENNIChlLmcuIGRpcmVj dGx5IGZyb20gQUxTQSkKKworU2lnbmFscworCQl2b2lkIENvbm5lY3RlZCh1aW50MzIgYWdfZmVh dHVyZXMpIAorCisJCSAgICAgIENvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5IGVzdGVibGlzaGVkLiAn YWdfZmVhdHVyZXMnIGFyZQorCQkgICAgICBPUmVkIGZlYXR1cmVzOgorCQkgICAgICAgICAgICAg ICAgICAgIDB4MDAxIFRocmVlLXdheSBjYWxsaW5nCisJCQkJICAgIDB4MDAyIEVjaG8gY2FuY2Vs bGluZyBhbmQvb3Igbm9pY2UgcmVkdWN0aW9uIGZ1bmN0aW9uCisJCQkJICAgIDB4MDA0IFZvaWNl IHJlY29nbml0aW9uIGZ1bmN0aW9uCisJCQkJICAgIDB4MDA4IEluLWJhbmQgcmluZyB0b25lIGNh cGFiaWxpdHkKKyAgICAgICAgICAgICAgCQkJICAgIDB4MDEwIEF0dGFjaCBhIG51bWJlciB0byBh IHZvaWNlIHRhZworICAgICAgICAgICAgICAJCQkgICAgMHgwMjAgQWJpbGl0eSB0byByZWplY3Qg YSBjYWxsCisgICAgICAgICAgICAgIAkJCSAgICAweDA0MCBFbmhhbmNlZCBjYWxsIHN0YXR1cwor ICAgICAgICAgICAgICAJCQkgICAgMHgwODAgRW5oYW5jZWQgY2FsbCBjb250cm9sCisgICAgICAg ICAgICAgIAkJCSAgICAweDEwMCBFeHRlbmRlZCBFcnJvciBSZXN1bHQgQ29kCisKKyAgICAJCXZv aWQgRGlzY29ubmVjdGVkKCkKKworCQl2b2lkIFJpbmcoc3RyaW5nIG51bWJlcikKKworCQkgICAg ICBTb21lb25lJ3MgY2FsbGluZyBmcm9tICdudW1iZXInLiAKKyAgICAgICAgIAkgICAgICBDYWxs ZXIgbnVtYmVyIGlzIHByb3ZpZGVkIGFzIHJlY2VpdmVkIGZyb20gQUcuCisKKwkJdm9pZCBTdGF0 dXNVcGRhdGUoc3RyaW5nIGluZGljYXRvcl9uYW1lLCB1aW50MzIgaW5kaWNhdG9yX3ZhbHVlKQor CisJCSAgICAgIEluZGljYXRvciAnaW5kaWNhdG9yX25hbWUnIGNoYW5nZWQgaXRzIHZhbHVlIHRv ICdpbmRpY2F0b3JfdmFsdWUnLiAKKwkJICAgICAgU3lzdGVtIChjYWxsLCBjYWxsc2V0dXAsIGV0 Yy4pIHN0YXR1c2VzIGFyZSBub3Qgc2lnbmFsbGVkLgorCisJCXZvaWQgQ2FsbENhbmNlbGxlZCgp CisJCQorCQkgICAgICBDYWxsIGZhaWxlZCB0byBzZXQgdXAuIEl0IG1lYW5zIHRoYXQgd2UgdHJp ZWQgdG8gY2FsbCBzb21lb25lIAorCQkgICAgICBvciBzb21lb25lIHRyaWVkIHRvIGNhbGwgdXMg YnV0IGNhbGwgd2FzIG5vdCBhY2NlcHRlZC4KKworCQl2b2lkIENhbGxTdGFydCgpCisKKwkJICAg ICAgQ2FsbCBzZXQgdXAgc3VjY2Vzc2Z1bGx5LgorCisJCXZvaWQgQ2FsbEVuZCgpCisKKwkJICAg ICAgQ2FsbCB3YXMgc3RhcnRlZCBhbmQgbm93IGVuZGVkLiBJbiBjb250cmFzdCB3aXRoIENhbGxD YW5jZWxsZWQgCisJCSAgICAgIHdoZXJlIGNhbGwgZGlkbid0IHN0YXJ0ZWQKKworCQl2b2lkIFZv aWNlUmVjb2duaXRpb25BY3RpdmUoKQorCQl2b2lkIFZvaWNlUmVjb2duaXRpb25JbmFjdGl2ZSgp CisJCSAgICAgIGluIGRldmVsb3BtZW50CisKKwkJdm9pZCBNaWNyb3Bob25lR2Fpbih1aW50OCBn YWluKSAKKwkJdm9pZCBTcGVha2VyR2Fpbih1aW50OCBnYWluKQorCQkgICAgICBBRyBzZW50IHVz IG5ldyBnYWluLgorCisJCXZvaWQgQXVkaW9EYXRhKHVpbnQ4W10gZGF0YSkgCisKKwkJICAgICAg QXJyYXkgb2YgYXVkaW8gZGF0YSBmcm9tIEFHLiBJdCBpcyBwbGFpbiAxNiBiaXQgUENNIHJlYWR5 IGZvciBBTFNBLgo= ------=_Part_23039_28685571.1229672193838--