Return-Path: From: Michael Terry To: bluez-devel@lists.sourceforge.net Date: Fri, 27 Jun 2008 15:05:57 -0400 Message-Id: <1214593557.6131.26.camel@bongo> Mime-Version: 1.0 Subject: [Bluez-devel] Wizard patch Reply-To: BlueZ development List-Id: BlueZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: multipart/mixed; boundary="===============0655028733==" Sender: bluez-devel-bounces@lists.sourceforge.net Errors-To: bluez-devel-bounces@lists.sourceforge.net --===============0655028733== Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-eyPjwTXXnJ4uIvCZunoY" --=-eyPjwTXXnJ4uIvCZunoY Content-Type: multipart/mixed; boundary="=-22DnaLjCWJZjHATnjIc+" --=-22DnaLjCWJZjHATnjIc+ Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hello, all! I have attached a patch against 0.27 (it applies cleanly against CVS) to complete the wizard in the bluez-gnome source tree. Here's what my patch does in summary, details below: Wizard dialog shows list of device types we know how to handle (only mouse/keyboard/headset right now). Then, it tries to connect to the appropriate bluetooth dbus service and trust the device. Basically the same code steps the Properties -> Services tab does, but more wizardy. :) I made changes to cleanup the wizard interface (removed a couple of pages that had low signal/noise ratio) and made several of the bluetooth_client capable of giving feedback about the operation via a callback. Details of changes: applet/main.c: Uncomments code to add a menu item for the wizard. common/bluetooth-device-selection.c: Fixes broken code to set current filter programmatically. common/client.[ch]: setup_services(): Note presence of audio and input services on startup bluetooth_client_get_name(): Gets user-visible device name for a path bluetooth_client_available_services(): Returns a mask of the device types supported by services the client knows about. Not actually used by the rest of my code, but it seemed possibly useful to one day not show unsupported device types in the wizard if we wanted to. bluetooth_client_cancel_call(): Cancels an async call for a particular adapter/address combo. This is slightly janky because it only allows for one call at a time per pair, but that's all that we ever need right now. connect_to_service(): Handles service-specific calls to initiate a device connection. Stuff like CreateSecureDevice or CreateHeadset. =09 bluetooth_client_connect(): Kicks off a call to connect_to_service =09 bluetooth_client_create_bonding(): bluetooth_client_remove_bonding(): bluetooth_client_set_trusted(): bluetooth_client_remove_trust(): Modified to allow callbacks common/dbus.xml: Add input.CreateSecureDevice and audio.CreateHeadset properties/adapter.c: Update a few calls to client functions do to above prototype changes wizard/agent.[ch]: Mostly a copy of applet/agent.c, except: it only holds passkey code (no auth code) it shows dialogs immediately wrt a parent window wizard/main.c: Comment out intro and info pages -- I think the intro page just gets in the user's way and there was no content in info page, and even if there was, it would probably also just get in user's way. I added a pulsing progress bar to the pairing page to give some feedback. I changed wording from 'setup' and 'pair' to 'connect'. I figure that is more user-friendly (since no real setting up is done by user and they probably think in terms of connecting to devices not pairing with them). Pairing process is two-step: bluetooth_client_connect followed by bluetooth_client_set_trusted. Show an error if either step fails. Connect to agent code to display a password prompt immediately in front of user instead of via bluetooth applet. wizard/Makefile.am: Install bluetooth-wizard and add agent.[ch] Thanks! -mt --=-22DnaLjCWJZjHATnjIc+ Content-Description: Content-Disposition: attachment; filename=bluez-wizard.diff Content-Type: text/x-patch; charset=UTF-8 Content-Transfer-Encoding: base64 ZGlmZiAtcnVwTiBibHVlei1nbm9tZS0wLjI3Lm9yaWcvYXBwbGV0L21haW4uYyBibHVlei1nbm9t ZS0wLjI3L2FwcGxldC9tYWluLmMNCi0tLSBibHVlei1nbm9tZS0wLjI3Lm9yaWcvYXBwbGV0L21h aW4uYwkyMDA4LTA2LTI3IDE0OjEyOjQ5LjAwMDAwMDAwMCAtMDQwMA0KKysrIGJsdWV6LWdub21l LTAuMjcvYXBwbGV0L21haW4uYwkyMDA4LTA2LTI3IDE0OjEzOjA1LjAwMDAwMDAwMCAtMDQwMA0K QEAgLTYyNSw3ICs2MjUsNiBAQCBzdGF0aWMgdm9pZCBzZW5kdG9fY2FsbGJhY2soR09iamVjdCAq d2lkDQogCQlnX3ByaW50ZXJyKCJDb3VsZG4ndCBleGVjdXRlIGNvbW1hbmQ6ICVzXG4iLCBjb21t YW5kKTsNCiB9DQogDQotI2lmIDANCiBzdGF0aWMgdm9pZCB3aXphcmRfY2FsbGJhY2soR09iamVj dCAqd2lkZ2V0LCBncG9pbnRlciB1c2VyX2RhdGEpDQogew0KIAljb25zdCBjaGFyICpjb21tYW5k ID0gImJsdWV0b290aC13aXphcmQgLS1zaW5nbGV0b24iOw0KQEAgLTYzMyw3ICs2MzIsNiBAQCBz dGF0aWMgdm9pZCB3aXphcmRfY2FsbGJhY2soR09iamVjdCAqd2lkDQogCWlmICghZ19zcGF3bl9j b21tYW5kX2xpbmVfYXN5bmMoY29tbWFuZCwgTlVMTCkpDQogCQlnX3ByaW50ZXJyKCJDb3VsZG4n dCBleGVjdXRlIGNvbW1hbmQ6ICVzXG4iLCBjb21tYW5kKTsNCiB9DQotI2VuZGlmDQogDQogc3Rh dGljIHZvaWQgYWN0aXZhdGVfY2FsbGJhY2soR09iamVjdCAqd2lkZ2V0LCBncG9pbnRlciB1c2Vy X2RhdGEpDQogew0KQEAgLTY5NywxNyArNjk1LDE1IEBAIHN0YXRpYyBHdGtXaWRnZXQgKmNyZWF0 ZV9wb3B1cG1lbnUodm9pZCkNCiANCiAJbWVudWl0ZW1fYnJvd3NlID0gaXRlbTsNCiANCi0jaWYg MA0KIAlpdGVtID0gZ3RrX3NlcGFyYXRvcl9tZW51X2l0ZW1fbmV3KCk7DQogCWd0a193aWRnZXRf c2hvdyhpdGVtKTsNCiAJZ3RrX21lbnVfc2hlbGxfYXBwZW5kKEdUS19NRU5VX1NIRUxMKG1lbnUp LCBpdGVtKTsNCiANCi0JaXRlbSA9IGd0a19tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWwoXygiU2V0 dXAgTmV3IERldmljZSIpKTsNCisJaXRlbSA9IGd0a19tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWwo XygiQ29ubmVjdCBOZXcgRGV2aWNlLi4uIikpOw0KIAlnX3NpZ25hbF9jb25uZWN0KGl0ZW0sICJh Y3RpdmF0ZSIsDQogCQkJCUdfQ0FMTEJBQ0sod2l6YXJkX2NhbGxiYWNrKSwgTlVMTCk7DQogCWd0 a193aWRnZXRfc2hvdyhpdGVtKTsNCiAJZ3RrX21lbnVfc2hlbGxfYXBwZW5kKEdUS19NRU5VX1NI RUxMKG1lbnUpLCBpdGVtKTsNCi0jZW5kaWYNCiANCiAJcmV0dXJuIG1lbnU7DQogfQ0KZGlmZiAt cnVwTiBibHVlei1nbm9tZS0wLjI3Lm9yaWcvY29tbW9uL2JsdWV0b290aC1kZXZpY2Utc2VsZWN0 aW9uLmMgYmx1ZXotZ25vbWUtMC4yNy9jb21tb24vYmx1ZXRvb3RoLWRldmljZS1zZWxlY3Rpb24u Yw0KLS0tIGJsdWV6LWdub21lLTAuMjcub3JpZy9jb21tb24vYmx1ZXRvb3RoLWRldmljZS1zZWxl Y3Rpb24uYwkyMDA4LTA2LTI3IDE0OjEyOjQ5LjAwMDAwMDAwMCAtMDQwMA0KKysrIGJsdWV6LWdu b21lLTAuMjcvY29tbW9uL2JsdWV0b290aC1kZXZpY2Utc2VsZWN0aW9uLmMJMjAwOC0wNi0yNyAx NDoxMzowNS4wMDAwMDAwMDAgLTA0MDANCkBAIC05MCw2ICs5MCwxNSBAQCBibHVldG9vdGhfZGV2 aWNlX2NhdGVnb3J5X3RvX3N0cmluZyAoaW50DQogCX0NCiB9DQogDQorc3RhdGljIGludA0KK2lu dF9sb2cyKGludCB2KQ0KK3sNCisJdW5zaWduZWQgcnYgPSAwOw0KKwl3aGlsZSAodiA+Pj0gMSkN CisJICBydisrOw0KKwlyZXR1cm4gcnY7DQorfQ0KKw0KIHN0YXRpYyB2b2lkDQogbmFtZV90b190 ZXh0IChHdGtUcmVlVmlld0NvbHVtbiAqY29sdW1uLCBHdGtDZWxsUmVuZGVyZXIgKmNlbGwsDQog CSAgICAgIEd0a1RyZWVNb2RlbCAqbW9kZWwsIEd0a1RyZWVJdGVyICppdGVyLCBncG9pbnRlciBk YXRhKQ0KQEAgLTU5MSw3ICs2MDAsNyBAQCBibHVldG9vdGhfZGV2aWNlX3NlbGVjdGlvbl9pbml0 KEJsdWV0b290DQogCX0NCiAJZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKHByaXYtPmRldmlj ZV90eXBlKSwgImNoYW5nZWQiLA0KIAkJCSAgR19DQUxMQkFDSyhmaWx0ZXJfdHlwZV9jaGFuZ2Vk X2NiKSwgc2VsZik7DQotCWd0a19jb21ib19ib3hfc2V0X2FjdGl2ZSAoR1RLX0NPTUJPX0JPWChw cml2LT5kZXZpY2VfdHlwZSksIHByaXYtPmRldmljZV90eXBlX2ZpbHRlcik7DQorCWd0a19jb21i b19ib3hfc2V0X2FjdGl2ZSAoR1RLX0NPTUJPX0JPWChwcml2LT5kZXZpY2VfdHlwZSksIGludF9s b2cyKHByaXYtPmRldmljZV90eXBlX2ZpbHRlcikpOw0KIAlpZiAocHJpdi0+c2hvd19kZXZpY2Vf dHlwZSkgew0KIAkJZ3RrX3dpZGdldF9zaG93IChwcml2LT5kZXZpY2VfdHlwZV9sYWJlbCk7DQog CQlndGtfd2lkZ2V0X3Nob3cgKHByaXYtPmRldmljZV90eXBlKTsNCkBAIC02NjUsNyArNjc0LDcg QEAgYmx1ZXRvb3RoX2RldmljZV9zZWxlY3Rpb25fc2V0X3Byb3BlcnR5IA0KIAkJYnJlYWs7DQog CWNhc2UgUFJPUF9ERVZJQ0VfVFlQRV9GSUxURVI6DQogCQlwcml2LT5kZXZpY2VfdHlwZV9maWx0 ZXIgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsNCi0JCWd0a19jb21ib19ib3hfc2V0X2FjdGl2 ZSAoR1RLX0NPTUJPX0JPWChwcml2LT5kZXZpY2VfdHlwZSksIHByaXYtPmRldmljZV90eXBlX2Zp bHRlciA+PiAxKTsNCisJCWd0a19jb21ib19ib3hfc2V0X2FjdGl2ZSAoR1RLX0NPTUJPX0JPWChw cml2LT5kZXZpY2VfdHlwZSksIGludF9sb2cyKHByaXYtPmRldmljZV90eXBlX2ZpbHRlcikpOw0K IAkJYnJlYWs7DQogCWNhc2UgUFJPUF9ERVZJQ0VfQ0FURUdPUllfRklMVEVSOg0KIAkJcHJpdi0+ ZGV2aWNlX2NhdGVnb3J5X2ZpbHRlciA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOw0KQEAgLTc1 MSw3ICs3NjAsNyBAQCBibHVldG9vdGhfZGV2aWNlX3NlbGVjdGlvbl9jbGFzc19pbml0IChCDQog CQkJCQkJCQkJCQkgIE5VTEwsIE5VTEwsIFRSVUUsIEdfUEFSQU1fUkVBRFdSSVRFKSk7DQogCWdf b2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTKGtsYXNzKSwNCiAJ CQkJCSBQUk9QX0RFVklDRV9UWVBFX0ZJTFRFUiwgZ19wYXJhbV9zcGVjX2ludCAoImRldmljZS10 eXBlLWZpbHRlciIsIE5VTEwsIE5VTEwsDQotCQkJCQkJCQkJCSAgICAwLCBCTFVFVE9PVEhfVFlQ RV9OVU1fVFlQRVMsIDAsIEdfUEFSQU1fUkVBRFdSSVRFKSk7DQorCQkJCQkJCQkJCSAgICAxLCAx IDw8IChCTFVFVE9PVEhfVFlQRV9OVU1fVFlQRVMtMSksIDEsIEdfUEFSQU1fUkVBRFdSSVRFKSk7 DQogCWdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTKGtsYXNz KSwNCiAJCQkJCSBQUk9QX0RFVklDRV9DQVRFR09SWV9GSUxURVIsIGdfcGFyYW1fc3BlY19pbnQg KCJkZXZpY2UtY2F0ZWdvcnktZmlsdGVyIiwgTlVMTCwgTlVMTCwNCiAJCQkJCSAJCQkJCQkwLCBC TFVFVE9PVEhfQ0FURUdPUllfTlVNX0NBVEVHT1JJRVMsIDAsIEdfUEFSQU1fUkVBRFdSSVRFKSk7 DQpkaWZmIC1ydXBOIGJsdWV6LWdub21lLTAuMjcub3JpZy9jb21tb24vY2xpZW50LmMgYmx1ZXot Z25vbWUtMC4yNy9jb21tb24vY2xpZW50LmMNCi0tLSBibHVlei1nbm9tZS0wLjI3Lm9yaWcvY29t bW9uL2NsaWVudC5jCTIwMDgtMDYtMjcgMTQ6MTI6NDkuMDAwMDAwMDAwIC0wNDAwDQorKysgYmx1 ZXotZ25vbWUtMC4yNy9jb21tb24vY2xpZW50LmMJMjAwOC0wNi0yNyAxNDoxMzowNS4wMDAwMDAw MDAgLTA0MDANCkBAIC00OCw2ICs0OCw4IEBAIHN0cnVjdCBfQmx1ZXRvb3RoQ2xpZW50UHJpdmF0 ZSB7DQogDQogCURCdXNHQ29ubmVjdGlvbiAqY29ubjsNCiAJREJ1c0dQcm94eSAqbWFuYWdlcl9v YmplY3Q7DQorCURCdXNHUHJveHkgKmlucHV0X3NlcnZpY2U7DQorCURCdXNHUHJveHkgKmF1ZGlv X3NlcnZpY2U7DQogCUd0a1RyZWVTdG9yZSAqc3RvcmU7DQogCWdjaGFyICpkZWZhdWx0X2FkYXB0 ZXI7DQogfTsNCkBAIC05MzUsNiArOTM3LDMzIEBAIHN0YXRpYyB2b2lkIHNldHVwX21hbmFnZXIo Qmx1ZXRvb3RoQ2xpZW4NCiAJCWdfZXJyb3JfZnJlZShlcnJvcik7DQogfQ0KIA0KK3N0YXRpYyB2 b2lkIHNldHVwX3NlcnZpY2VzKEJsdWV0b290aENsaWVudCAqY2xpZW50KQ0KK3sNCisJQmx1ZXRv b3RoQ2xpZW50UHJpdmF0ZSAqcHJpdiA9IEJMVUVUT09USF9DTElFTlRfR0VUX1BSSVZBVEUoY2xp ZW50KTsNCisJZ2NoYXIgKmJ1c25hbWUgPSBOVUxMOw0KKw0KKwlwcml2LT5pbnB1dF9zZXJ2aWNl ID0gTlVMTDsNCisJcHJpdi0+YXVkaW9fc2VydmljZSA9IE5VTEw7DQorDQorCWlmIChkYnVzX2df cHJveHlfY2FsbChwcml2LT5tYW5hZ2VyX29iamVjdCwgIkFjdGl2YXRlU2VydmljZSIsIE5VTEws DQorCSAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfU1RSSU5HLCAiaW5wdXQiLCBHX1RZUEVf SU5WQUxJRCwNCisJICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICZidXNuYW1l LCBHX1RZUEVfSU5WQUxJRCkpIHsNCisJCXByaXYtPmlucHV0X3NlcnZpY2UgPSBkYnVzX2dfcHJv eHlfbmV3X2Zvcl9uYW1lKHByaXYtPmNvbm4sIGJ1c25hbWUsDQorCQkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9ibHVlei9pbnB1dCIsDQorCQkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmJsdWV6 LmlucHV0Lk1hbmFnZXIiKTsNCisJCWdfZnJlZShidXNuYW1lKTsNCisJfQ0KKw0KKwlpZiAoZGJ1 c19nX3Byb3h5X2NhbGwocHJpdi0+bWFuYWdlcl9vYmplY3QsICJBY3RpdmF0ZVNlcnZpY2UiLCBO VUxMLA0KKwkgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX1NUUklORywgImF1ZGlvIiwgR19U WVBFX0lOVkFMSUQsDQorCSAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfU1RSSU5HLCAmYnVz bmFtZSwgR19UWVBFX0lOVkFMSUQpKSB7DQorCQlwcml2LT5hdWRpb19zZXJ2aWNlID0gZGJ1c19n X3Byb3h5X25ld19mb3JfbmFtZShwcml2LT5jb25uLCBidXNuYW1lLA0KKwkJICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvYmx1ZXovYXVkaW8iLA0K KwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5i bHVlei5hdWRpby5NYW5hZ2VyIik7DQorCQlnX2ZyZWUoYnVzbmFtZSk7DQorCX0NCit9DQorDQog c3RhdGljIHZvaWQgbmFtZV9vd25lcl9jaGFuZ2VkKERCdXNHUHJveHkgKm9iamVjdCwgY29uc3Qg Y2hhciAqbmFtZSwNCiAJCQljb25zdCBjaGFyICpwcmV2LCBjb25zdCBjaGFyICpuZXcsIGdwb2lu dGVyIHVzZXJfZGF0YSkNCiB7DQpAQCAtOTg0LDYgKzEwMTMsOCBAQCBzdGF0aWMgdm9pZCBibHVl dG9vdGhfY2xpZW50X2ZpbmFsaXplKEdPDQogCWdfZnJlZShwcml2LT5kZWZhdWx0X2FkYXB0ZXIp Ow0KIAlnX29iamVjdF91bnJlZihHX09CSkVDVChwcml2LT5zdG9yZSkpOw0KIAlnX29iamVjdF91 bnJlZiAocHJpdi0+bWFuYWdlcl9vYmplY3QpOw0KKwlnX29iamVjdF91bnJlZiAocHJpdi0+aW5w dXRfc2VydmljZSk7DQorCWdfb2JqZWN0X3VucmVmIChwcml2LT5hdWRpb19zZXJ2aWNlKTsNCiB9 DQogDQogc3RhdGljIHZvaWQgYmx1ZXRvb3RoX2NsaWVudF9pbml0KEJsdWV0b290aENsaWVudCAq Y2xpZW50KQ0KQEAgLTEwMDAsNiArMTAzMSw4IEBAIHN0YXRpYyB2b2lkIGJsdWV0b290aF9jbGll bnRfaW5pdChCbHVldG8NCiAJc2V0dXBfZGJ1cyhjbGllbnQpOw0KIA0KIAlzZXR1cF9tYW5hZ2Vy KGNsaWVudCk7DQorDQorCXNldHVwX3NlcnZpY2VzKGNsaWVudCk7DQogfQ0KIA0KIHN0YXRpYyB2 b2lkIGJsdWV0b290aF9jbGllbnRfc2V0X3Byb3BlcnR5KEdPYmplY3QgKm9iamVjdCwgZ3VpbnQg cHJvcF9pZCwNCkBAIC0xMDg1LDYgKzExMTgsNTAgQEAgQmx1ZXRvb3RoQ2xpZW50ICpibHVldG9v dGhfY2xpZW50X25ldyh2bw0KIAl9DQogfQ0KIA0KK2NvbnN0IGdjaGFyICpibHVldG9vdGhfY2xp ZW50X2dldF9uYW1lKEJsdWV0b290aENsaWVudCAqc2VsZiwgY29uc3QgZ2NoYXIgKmFkYXB0ZXIp DQorew0KKwlCbHVldG9vdGhDbGllbnRQcml2YXRlICpwcml2ID0gQkxVRVRPT1RIX0NMSUVOVF9H RVRfUFJJVkFURShzZWxmKTsNCisJR3RrVHJlZUl0ZXIgaXRlcjsNCisJZ2Jvb2xlYW4gY29udDsN CisNCisJaWYgKGFkYXB0ZXIgPT0gTlVMTCkNCisJCWFkYXB0ZXIgPSBwcml2LT5kZWZhdWx0X2Fk YXB0ZXI7DQorDQorCWlmIChhZGFwdGVyID09IE5VTEwpDQorCQlyZXR1cm4gRkFMU0U7DQorDQor CWNvbnQgPSBndGtfdHJlZV9tb2RlbF9nZXRfaXRlcl9maXJzdChHVEtfVFJFRV9NT0RFTChwcml2 LT5zdG9yZSksICZpdGVyKTsNCisNCisJd2hpbGUgKGNvbnQgPT0gVFJVRSkgew0KKwkJZ2NoYXIg KnBhdGg7DQorCQlnY2hhciAqbmFtZTsNCisNCisJCWd0a190cmVlX21vZGVsX2dldChHVEtfVFJF RV9NT0RFTChwcml2LT5zdG9yZSksICZpdGVyLA0KKwkJCQkJCUNPTFVNTl9QQVRILCAmcGF0aCwN CisJCQkJCQlDT0xVTU5fTkFNRSwgJm5hbWUsIC0xKTsNCisNCisJCWlmIChnX2FzY2lpX3N0cmNh c2VjbXAocGF0aCwgYWRhcHRlcikgPT0gMCkNCisJCQlyZXR1cm4gZ19zdHJkdXAobmFtZSk7DQor DQorCQljb250ID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0KEdUS19UUkVFX01PREVMKHByaXYt PnN0b3JlKSwgJml0ZXIpOw0KKwl9DQorDQorCXJldHVybiBOVUxMOw0KK30NCisNCitpbnQgYmx1 ZXRvb3RoX2NsaWVudF9hdmFpbGFibGVfc2VydmljZXMoQmx1ZXRvb3RoQ2xpZW50ICpjbGllbnQp DQorew0KKwlCbHVldG9vdGhDbGllbnRQcml2YXRlICpwcml2ID0gQkxVRVRPT1RIX0NMSUVOVF9H RVRfUFJJVkFURShjbGllbnQpOw0KKwlpbnQgcnYgPSAwOw0KKw0KKwlpZiAocHJpdi0+aW5wdXRf c2VydmljZSkNCisJCXJ2IHw9IEJMVUVUT09USF9UWVBFX01PVVNFIHwgQkxVRVRPT1RIX1RZUEVf S0VZQk9BUkQ7DQorCWlmIChwcml2LT5hdWRpb19zZXJ2aWNlKQ0KKwkJcnYgfD0gQkxVRVRPT1RI X1RZUEVfSEVBRFNFVDsNCisNCisJcmV0dXJuIHJ2Ow0KK30NCisNCiBnYm9vbGVhbiBibHVldG9v dGhfY2xpZW50X3JlZ2lzdGVyX3Bhc3NrZXlfYWdlbnQoQmx1ZXRvb3RoQ2xpZW50ICpjbGllbnQs DQogCQljb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphZGRyZXNzLCBjb25zdCB2b2lkICpp bmZvKQ0KIHsNCkBAIC0xMTEyLDEzICsxMTg5LDcgQEAgZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVu dF9yZWdpc3Rlcl9wYXNzaw0KIAlyZXR1cm4gVFJVRTsNCiB9DQogDQotc3RhdGljIHZvaWQgY3Jl YXRlX2JvbmRpbmdfcmVwbHkoREJ1c0dQcm94eSAqcHJveHksDQotCQkJCQlHRXJyb3IgKmVycm9y LCBncG9pbnRlciB1c2VyZGF0YSkNCi17DQotCS8vZ19wcmludGYoImNyZWF0ZSBib25kaW5nIHJl cGx5XG4iKTsNCi19DQotDQotZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVudF9jcmVhdGVfYm9uZGlu ZyhCbHVldG9vdGhDbGllbnQgKmNsaWVudCwNCitnYm9vbGVhbiBibHVldG9vdGhfY2xpZW50X2Nh bmNlbF9jYWxsKEJsdWV0b290aENsaWVudCAqY2xpZW50LA0KIAkJCQkJZ2NoYXIgKmFkYXB0ZXIs IGNvbnN0IGdjaGFyICphZGRyZXNzKQ0KIHsNCiAJQmx1ZXRvb3RoQ2xpZW50UHJpdmF0ZSAqcHJp diA9IEJMVUVUT09USF9DTElFTlRfR0VUX1BSSVZBVEUoY2xpZW50KTsNCkBAIC0xMTQyLDkgKzEy MTMsMTQgQEAgZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVudF9jcmVhdGVfYm9uZGluZw0KIAkJCQkJ CUNPTFVNTl9PQkpFQ1QsICZvYmplY3QsIC0xKTsNCiANCiAJCWlmIChnX2FzY2lpX3N0cmNhc2Vj bXAocGF0aCwgYWRhcHRlcikgPT0gMCkgew0KLQkJCWFkYXB0ZXJfY3JlYXRlX2JvbmRpbmdfYXN5 bmMob2JqZWN0LCBhZGRyZXNzLA0KLQkJCQkJCWNyZWF0ZV9ib25kaW5nX3JlcGx5LCBOVUxMKTsN Ci0JCQlyZXR1cm4gVFJVRTsNCisJCQlEQnVzR1Byb3h5Q2FsbCAqY2FsbDsNCisJCQljYWxsID0g KERCdXNHUHJveHlDYWxsICopZ19vYmplY3RfZ2V0X2RhdGEoR19PQkpFQ1Qob2JqZWN0KSwgImNh bGwiKTsNCisJCQlpZiAoY2FsbCAhPSBOVUxMKSB7DQorCQkJCWRidXNfZ19wcm94eV9jYW5jZWxf Y2FsbChvYmplY3QsIGNhbGwpOw0KKwkJCQlnX29iamVjdF9zZXRfZGF0YShHX09CSkVDVChvYmpl Y3QpLCAiY2FsbCIsIE5VTEwpOw0KKwkJCQlyZXR1cm4gVFJVRTsNCisJCQl9DQorCQkJcmV0dXJu IEZBTFNFOw0KIAkJfQ0KIA0KIAkJY29udCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChHVEtf VFJFRV9NT0RFTChwcml2LT5zdG9yZSksICZpdGVyKTsNCkBAIC0xMTUzLDE0ICsxMjI5LDQ4IEBA IGdib29sZWFuIGJsdWV0b290aF9jbGllbnRfY3JlYXRlX2JvbmRpbmcNCiAJcmV0dXJuIEZBTFNF Ow0KIH0NCiANCi1zdGF0aWMgdm9pZCByZW1vdmVfYm9uZGluZ19yZXBseShEQnVzR1Byb3h5ICpw cm94eSwNCi0JCQkJCUdFcnJvciAqZXJyb3IsIGdwb2ludGVyIHVzZXJkYXRhKQ0KK3N0YXRpYyB2 b2lkIGNhbGxfcmVwbHkoREJ1c0dQcm94eSAqcHJveHksDQorCQkJR0Vycm9yICplcnJvciwgZ3Bv aW50ZXIgdXNlcmRhdGEpDQorew0KKwlEQnVzR0FzeW5jRGF0YSAqZGF0YSA9IChEQnVzR0FzeW5j RGF0YSopIHVzZXJkYXRhOw0KKwlnX29iamVjdF9zZXRfZGF0YShHX09CSkVDVChwcm94eSksICJj YWxsIiwgTlVMTCk7DQorCWlmIChkYXRhKSB7DQorCQkoKihibHVldG9vdGhfY2xpZW50X2NhbGxf cmVwbHkpZGF0YS0+Y2IpIChlcnJvciwgZGF0YS0+dXNlcmRhdGEpOw0KKwkJZ19mcmVlKGRhdGEp Ow0KKwl9DQorCWlmIChlcnJvcikNCisJCWdfZXJyb3JfZnJlZShlcnJvcik7DQorfQ0KKw0KK3N0 YXRpYyB2b2lkIGNhbGxfcmVwbHlfcyhEQnVzR1Byb3h5ICpwcm94eSwgY2hhciAqcywNCisJCQlH RXJyb3IgKmVycm9yLCBncG9pbnRlciB1c2VyZGF0YSkNCiB7DQotCS8vZ19wcmludGYoInJlbW92 ZSBib25kaW5nIHJlcGx5XG4iKTsNCisJY2FsbF9yZXBseShwcm94eSwgZXJyb3IsIHVzZXJkYXRh KTsNCiB9DQogDQotZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVudF9yZW1vdmVfYm9uZGluZyhCbHVl dG9vdGhDbGllbnQgKmNsaWVudCwNCi0JCQkJCWdjaGFyICphZGFwdGVyLCBjb25zdCBnY2hhciAq YWRkcmVzcykNCitzdGF0aWMgZ2Jvb2xlYW4gY29ubmVjdF90b19zZXJ2aWNlKEJsdWV0b290aENs aWVudCAqY2xpZW50LCBEQnVzR1Byb3h5ICpvYmplY3QsDQorCQkJCQkJY29uc3QgZ2NoYXIgKmFk ZHJlc3MsIGd1aW50IHR5cGUsDQorCQkJCQkJZ3BvaW50ZXIgdXNlcmRhdGEpDQorew0KKwlCbHVl dG9vdGhDbGllbnRQcml2YXRlICpwcml2ID0gQkxVRVRPT1RIX0NMSUVOVF9HRVRfUFJJVkFURShj bGllbnQpOw0KKwlEQnVzR1Byb3h5Q2FsbCAqY2FsbCA9IE5VTEw7DQorDQorCS8qIFNwZWNpYWwg Y2FzZSB0aGUgZmV3IHR5cGVzIHdlIGNhbiBoYW5kbGUgKi8NCisJaWYgKHR5cGUgPT0gQkxVRVRP T1RIX1RZUEVfTU9VU0UgfHwgdHlwZSA9PSBCTFVFVE9PVEhfVFlQRV9LRVlCT0FSRCkNCisJCWNh bGwgPSBpbnB1dF9jcmVhdGVfc2VjdXJlX2RldmljZV9hc3luYyhwcml2LT5pbnB1dF9zZXJ2aWNl LCBhZGRyZXNzLA0KKwkJCQkJY2FsbF9yZXBseV9zLCB1c2VyZGF0YSk7DQorCWVsc2UgaWYgKHR5 cGUgPT0gQkxVRVRPT1RIX1RZUEVfSEVBRFNFVCkNCisJCWNhbGwgPSBhdWRpb19jcmVhdGVfaGVh ZHNldF9hc3luYyhwcml2LT5hdWRpb19zZXJ2aWNlLCBhZGRyZXNzLA0KKwkJCQkJY2FsbF9yZXBs eV9zLCB1c2VyZGF0YSk7DQorDQorCWdfb2JqZWN0X3NldF9kYXRhKEdfT0JKRUNUKG9iamVjdCks ICJjYWxsIiwgY2FsbCk7DQorCXJldHVybiBjYWxsICE9IE5VTEw7DQorfQ0KKw0KK2dib29sZWFu IGJsdWV0b290aF9jbGllbnRfY29ubmVjdChCbHVldG9vdGhDbGllbnQgKmNsaWVudCwgZ3VpbnQg dHlwZSwNCisJCQkJCWdjaGFyICphZGFwdGVyLCBjb25zdCBnY2hhciAqYWRkcmVzcywNCisJCQkJ CWJsdWV0b290aF9jbGllbnRfY2FsbF9yZXBseSBjYWxsYmFjaywNCisJCQkJCWdwb2ludGVyIHVz ZXJkYXRhKQ0KIHsNCiAJQmx1ZXRvb3RoQ2xpZW50UHJpdmF0ZSAqcHJpdiA9IEJMVUVUT09USF9D TElFTlRfR0VUX1BSSVZBVEUoY2xpZW50KTsNCiAJR3RrVHJlZUl0ZXIgaXRlcjsNCkBAIC0xMTgz LDkgKzEyOTMsMzYgQEAgZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVudF9yZW1vdmVfYm9uZGluZw0K IAkJCQkJCUNPTFVNTl9PQkpFQ1QsICZvYmplY3QsIC0xKTsNCiANCiAJCWlmIChnX2FzY2lpX3N0 cmNhc2VjbXAocGF0aCwgYWRhcHRlcikgPT0gMCkgew0KLQkJCWFkYXB0ZXJfcmVtb3ZlX2JvbmRp bmdfYXN5bmMob2JqZWN0LCBhZGRyZXNzLA0KLQkJCQkJCXJlbW92ZV9ib25kaW5nX3JlcGx5LCBO VUxMKTsNCi0JCQlyZXR1cm4gVFJVRTsNCisJCQlEQnVzR0FzeW5jRGF0YSAqc3R1ZmY7DQorCQkJ Z2Jvb2xlYW4gY29udDsNCisJCQlHdGtUcmVlSXRlciBjaGlsZDsNCisJCQkNCisJCQlzdHVmZiA9 IGdfbmV3IChEQnVzR0FzeW5jRGF0YSwgMSk7DQorCQkJc3R1ZmYtPmNiID0gR19DQUxMQkFDSyAo Y2FsbGJhY2spOw0KKwkJCXN0dWZmLT51c2VyZGF0YSA9IHVzZXJkYXRhOw0KKwkJCQ0KKwkJCS8v IElmIGNhbGxlciBkaWRuJ3Qgc3BlY2lmeSBhIGZvcmNlZCB0eXBlLCBkZXRlcm1pbmUgaXQgZnJv bSBkZXZpY2UgaW5mbw0KKwkJCWlmICh0eXBlID09IDAgfHwgdHlwZSA9PSBCTFVFVE9PVEhfVFlQ RV9BTlkpIHsNCisJCQkJY29udCA9IGd0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW4oR1RLX1RS RUVfTU9ERUwocHJpdi0+c3RvcmUpLA0KKwkJCQkJCQkJCQkmY2hpbGQsICZpdGVyKTsNCisNCisJ CQkJd2hpbGUgKGNvbnQgPT0gVFJVRSkgew0KKwkJCQkJZ2NoYXIgKnZhbHVlOw0KKw0KKwkJCQkJ Z3RrX3RyZWVfbW9kZWxfZ2V0KEdUS19UUkVFX01PREVMKHByaXYtPnN0b3JlKSwgJmNoaWxkLA0K KwkJCQkJCQkJCUNPTFVNTl9BRERSRVNTLCAmdmFsdWUsIC0xKTsNCisNCisJCQkJCWlmIChnX2Fz Y2lpX3N0cmNhc2VjbXAoYWRkcmVzcywgdmFsdWUpID09IDApIHsNCisJCQkJCQlndGtfdHJlZV9t b2RlbF9nZXQoR1RLX1RSRUVfTU9ERUwocHJpdi0+c3RvcmUpLCAmY2hpbGQsDQorCQkJCQkJCQkJ Q09MVU1OX1RZUEUsICZ0eXBlLCAtMSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorDQorCQkJ CQljb250ID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0KEdUS19UUkVFX01PREVMKHByaXYtPnN0 b3JlKSwgJmNoaWxkKTsNCisJCQkJfQ0KKwkJCX0NCisJCQkNCisJCQlyZXR1cm4gY29ubmVjdF90 b19zZXJ2aWNlKGNsaWVudCwgb2JqZWN0LCBhZGRyZXNzLCB0eXBlLCBzdHVmZik7DQogCQl9DQog DQogCQljb250ID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0KEdUS19UUkVFX01PREVMKHByaXYt PnN0b3JlKSwgJml0ZXIpOw0KQEAgLTExOTQsMTQgKzEzMzEsNTMgQEAgZ2Jvb2xlYW4gYmx1ZXRv b3RoX2NsaWVudF9yZW1vdmVfYm9uZGluZw0KIAlyZXR1cm4gRkFMU0U7DQogfQ0KIA0KLXN0YXRp YyB2b2lkIHNldF90cnVzdGVkX3JlcGx5KERCdXNHUHJveHkgKnByb3h5LA0KLQkJCQkJR0Vycm9y ICplcnJvciwgZ3BvaW50ZXIgdXNlcmRhdGEpDQorZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVudF9j cmVhdGVfYm9uZGluZyhCbHVldG9vdGhDbGllbnQgKmNsaWVudCwNCisJCQkJCWdjaGFyICphZGFw dGVyLCBjb25zdCBnY2hhciAqYWRkcmVzcywNCisJCQkJCWJsdWV0b290aF9jbGllbnRfY2FsbF9y ZXBseSBjYWxsYmFjaywNCisJCQkJCWdwb2ludGVyIHVzZXJkYXRhKQ0KIHsNCi0JLy9nX3ByaW50 Zigic2V0IHRydXN0ZWQgcmVwbHlcbiIpOw0KKwlCbHVldG9vdGhDbGllbnRQcml2YXRlICpwcml2 ID0gQkxVRVRPT1RIX0NMSUVOVF9HRVRfUFJJVkFURShjbGllbnQpOw0KKwlHdGtUcmVlSXRlciBp dGVyOw0KKwlnYm9vbGVhbiBjb250Ow0KKw0KKwlpZiAoYWRhcHRlciA9PSBOVUxMKQ0KKwkJYWRh cHRlciA9IHByaXYtPmRlZmF1bHRfYWRhcHRlcjsNCisNCisJaWYgKGFkYXB0ZXIgPT0gTlVMTCkN CisJCXJldHVybiBGQUxTRTsNCisNCisJY29udCA9IGd0a190cmVlX21vZGVsX2dldF9pdGVyX2Zp cnN0KEdUS19UUkVFX01PREVMKHByaXYtPnN0b3JlKSwgJml0ZXIpOw0KKw0KKwl3aGlsZSAoY29u dCA9PSBUUlVFKSB7DQorCQlEQnVzR1Byb3h5ICpvYmplY3Q7DQorCQlnY2hhciAqcGF0aDsNCisN CisJCWd0a190cmVlX21vZGVsX2dldChHVEtfVFJFRV9NT0RFTChwcml2LT5zdG9yZSksICZpdGVy LA0KKwkJCQkJCUNPTFVNTl9QQVRILCAmcGF0aCwNCisJCQkJCQlDT0xVTU5fT0JKRUNULCAmb2Jq ZWN0LCAtMSk7DQorDQorCQlpZiAoZ19hc2NpaV9zdHJjYXNlY21wKHBhdGgsIGFkYXB0ZXIpID09 IDApIHsNCisJCQlEQnVzR1Byb3h5Q2FsbCAqY2FsbDsNCisJCQlEQnVzR0FzeW5jRGF0YSAqc3R1 ZmY7DQorCQkJc3R1ZmYgPSBnX25ldyAoREJ1c0dBc3luY0RhdGEsIDEpOw0KKwkJCXN0dWZmLT5j YiA9IEdfQ0FMTEJBQ0sgKGNhbGxiYWNrKTsNCisJCQlzdHVmZi0+dXNlcmRhdGEgPSB1c2VyZGF0 YTsNCisJCQljYWxsID0gYWRhcHRlcl9jcmVhdGVfYm9uZGluZ19hc3luYyhvYmplY3QsIGFkZHJl c3MsDQorCQkJCQkJY2FsbF9yZXBseSwgc3R1ZmYpOw0KKwkJCWdfb2JqZWN0X3NldF9kYXRhKEdf T0JKRUNUKG9iamVjdCksICJjYWxsIiwgY2FsbCk7DQorCQkJcmV0dXJuIGNhbGwgIT0gTlVMTDsN CisJCX0NCisNCisJCWNvbnQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQoR1RLX1RSRUVfTU9E RUwocHJpdi0+c3RvcmUpLCAmaXRlcik7DQorCX0NCisNCisJcmV0dXJuIEZBTFNFOw0KIH0NCiAN Ci1nYm9vbGVhbiBibHVldG9vdGhfY2xpZW50X3NldF90cnVzdGVkKEJsdWV0b290aENsaWVudCAq Y2xpZW50LA0KLQkJCQkJZ2NoYXIgKmFkYXB0ZXIsIGNvbnN0IGdjaGFyICphZGRyZXNzKQ0KK2di b29sZWFuIGJsdWV0b290aF9jbGllbnRfcmVtb3ZlX2JvbmRpbmcoQmx1ZXRvb3RoQ2xpZW50ICpj bGllbnQsDQorCQkJCQlnY2hhciAqYWRhcHRlciwgY29uc3QgZ2NoYXIgKmFkZHJlc3MsDQorCQkJ CQlibHVldG9vdGhfY2xpZW50X2NhbGxfcmVwbHkgY2FsbGJhY2ssDQorCQkJCQlncG9pbnRlciB1 c2VyZGF0YSkNCiB7DQogCUJsdWV0b290aENsaWVudFByaXZhdGUgKnByaXYgPSBCTFVFVE9PVEhf Q0xJRU5UX0dFVF9QUklWQVRFKGNsaWVudCk7DQogCUd0a1RyZWVJdGVyIGl0ZXI7DQpAQCAtMTIy NCw4ICsxNDAwLDE0IEBAIGdib29sZWFuIGJsdWV0b290aF9jbGllbnRfc2V0X3RydXN0ZWQoQmwN CiAJCQkJCQlDT0xVTU5fT0JKRUNULCAmb2JqZWN0LCAtMSk7DQogDQogCQlpZiAoZ19hc2NpaV9z dHJjYXNlY21wKHBhdGgsIGFkYXB0ZXIpID09IDApIHsNCi0JCQlhZGFwdGVyX3NldF90cnVzdGVk X2FzeW5jKG9iamVjdCwgYWRkcmVzcywNCi0JCQkJCQlzZXRfdHJ1c3RlZF9yZXBseSwgTlVMTCk7 DQorCQkJREJ1c0dQcm94eUNhbGwgKmNhbGw7DQorCQkJREJ1c0dBc3luY0RhdGEgKnN0dWZmOw0K KwkJCXN0dWZmID0gZ19uZXcgKERCdXNHQXN5bmNEYXRhLCAxKTsNCisJCQlzdHVmZi0+Y2IgPSBH X0NBTExCQUNLIChjYWxsYmFjayk7DQorCQkJc3R1ZmYtPnVzZXJkYXRhID0gdXNlcmRhdGE7DQor CQkJY2FsbCA9IGFkYXB0ZXJfcmVtb3ZlX2JvbmRpbmdfYXN5bmMob2JqZWN0LCBhZGRyZXNzLA0K KwkJCQkJCWNhbGxfcmVwbHksIHN0dWZmKTsNCisJCQlnX29iamVjdF9zZXRfZGF0YShHX09CSkVD VChvYmplY3QpLCAiY2FsbCIsIGNhbGwpOw0KIAkJCXJldHVybiBUUlVFOw0KIAkJfQ0KIA0KQEAg LTEyMzUsMTQgKzE0MTcsNTMgQEAgZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVudF9zZXRfdHJ1c3Rl ZChCbA0KIAlyZXR1cm4gRkFMU0U7DQogfQ0KIA0KLXN0YXRpYyB2b2lkIHJlbW92ZV90cnVzdF9y ZXBseShEQnVzR1Byb3h5ICpwcm94eSwNCi0JCQkJCUdFcnJvciAqZXJyb3IsIGdwb2ludGVyIHVz ZXJkYXRhKQ0KK2dib29sZWFuIGJsdWV0b290aF9jbGllbnRfc2V0X3RydXN0ZWQoQmx1ZXRvb3Ro Q2xpZW50ICpjbGllbnQsDQorCQkJCQlnY2hhciAqYWRhcHRlciwgY29uc3QgZ2NoYXIgKmFkZHJl c3MsDQorCQkJCQlibHVldG9vdGhfY2xpZW50X2NhbGxfcmVwbHkgY2FsbGJhY2ssDQorCQkJCQln cG9pbnRlciB1c2VyZGF0YSkNCiB7DQotCS8vZ19wcmludGYoInJlbW92ZSB0cnVzdCByZXBseVxu Iik7DQorCUJsdWV0b290aENsaWVudFByaXZhdGUgKnByaXYgPSBCTFVFVE9PVEhfQ0xJRU5UX0dF VF9QUklWQVRFKGNsaWVudCk7DQorCUd0a1RyZWVJdGVyIGl0ZXI7DQorCWdib29sZWFuIGNvbnQ7 DQorDQorCWlmIChhZGFwdGVyID09IE5VTEwpDQorCQlhZGFwdGVyID0gcHJpdi0+ZGVmYXVsdF9h ZGFwdGVyOw0KKw0KKwlpZiAoYWRhcHRlciA9PSBOVUxMKQ0KKwkJcmV0dXJuIEZBTFNFOw0KKw0K Kwljb250ID0gZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXJfZmlyc3QoR1RLX1RSRUVfTU9ERUwocHJp di0+c3RvcmUpLCAmaXRlcik7DQorDQorCXdoaWxlIChjb250ID09IFRSVUUpIHsNCisJCURCdXNH UHJveHkgKm9iamVjdDsNCisJCWdjaGFyICpwYXRoOw0KKw0KKwkJZ3RrX3RyZWVfbW9kZWxfZ2V0 KEdUS19UUkVFX01PREVMKHByaXYtPnN0b3JlKSwgJml0ZXIsDQorCQkJCQkJQ09MVU1OX1BBVEgs ICZwYXRoLA0KKwkJCQkJCUNPTFVNTl9PQkpFQ1QsICZvYmplY3QsIC0xKTsNCisNCisJCWlmIChn X2FzY2lpX3N0cmNhc2VjbXAocGF0aCwgYWRhcHRlcikgPT0gMCkgew0KKwkJCURCdXNHUHJveHlD YWxsICpjYWxsOw0KKwkJCURCdXNHQXN5bmNEYXRhICpzdHVmZjsNCisJCQlzdHVmZiA9IGdfbmV3 IChEQnVzR0FzeW5jRGF0YSwgMSk7DQorCQkJc3R1ZmYtPmNiID0gR19DQUxMQkFDSyAoY2FsbGJh Y2spOw0KKwkJCXN0dWZmLT51c2VyZGF0YSA9IHVzZXJkYXRhOw0KKwkJCWNhbGwgPSBhZGFwdGVy X3NldF90cnVzdGVkX2FzeW5jKG9iamVjdCwgYWRkcmVzcywNCisJCQkJCQljYWxsX3JlcGx5LCBz dHVmZik7DQorCQkJZ19vYmplY3Rfc2V0X2RhdGEoR19PQkpFQ1Qob2JqZWN0KSwgImNhbGwiLCBj YWxsKTsNCisJCQlyZXR1cm4gVFJVRTsNCisJCX0NCisNCisJCWNvbnQgPSBndGtfdHJlZV9tb2Rl bF9pdGVyX25leHQoR1RLX1RSRUVfTU9ERUwocHJpdi0+c3RvcmUpLCAmaXRlcik7DQorCX0NCisN CisJcmV0dXJuIEZBTFNFOw0KIH0NCiANCiBnYm9vbGVhbiBibHVldG9vdGhfY2xpZW50X3JlbW92 ZV90cnVzdChCbHVldG9vdGhDbGllbnQgKmNsaWVudCwNCi0JCQkJCWdjaGFyICphZGFwdGVyLCBj b25zdCBnY2hhciAqYWRkcmVzcykNCisJCQkJCWdjaGFyICphZGFwdGVyLCBjb25zdCBnY2hhciAq YWRkcmVzcywNCisJCQkJCWJsdWV0b290aF9jbGllbnRfY2FsbF9yZXBseSBjYWxsYmFjaywNCisJ CQkJCWdwb2ludGVyIHVzZXJkYXRhKQ0KIHsNCiAJQmx1ZXRvb3RoQ2xpZW50UHJpdmF0ZSAqcHJp diA9IEJMVUVUT09USF9DTElFTlRfR0VUX1BSSVZBVEUoY2xpZW50KTsNCiAJR3RrVHJlZUl0ZXIg aXRlcjsNCkBAIC0xMjY1LDggKzE0ODYsMTQgQEAgZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVudF9y ZW1vdmVfdHJ1c3QoQg0KIAkJCQkJCUNPTFVNTl9PQkpFQ1QsICZvYmplY3QsIC0xKTsNCiANCiAJ CWlmIChnX2FzY2lpX3N0cmNhc2VjbXAocGF0aCwgYWRhcHRlcikgPT0gMCkgew0KLQkJCWFkYXB0 ZXJfcmVtb3ZlX3RydXN0X2FzeW5jKG9iamVjdCwgYWRkcmVzcywNCi0JCQkJCQlyZW1vdmVfdHJ1 c3RfcmVwbHksIE5VTEwpOw0KKwkJCURCdXNHUHJveHlDYWxsICpjYWxsOw0KKwkJCURCdXNHQXN5 bmNEYXRhICpzdHVmZjsNCisJCQlzdHVmZiA9IGdfbmV3IChEQnVzR0FzeW5jRGF0YSwgMSk7DQor CQkJc3R1ZmYtPmNiID0gR19DQUxMQkFDSyAoY2FsbGJhY2spOw0KKwkJCXN0dWZmLT51c2VyZGF0 YSA9IHVzZXJkYXRhOw0KKwkJCWNhbGwgPSBhZGFwdGVyX3JlbW92ZV90cnVzdF9hc3luYyhvYmpl Y3QsIGFkZHJlc3MsDQorCQkJCQkJY2FsbF9yZXBseSwgc3R1ZmYpOw0KKwkJCWdfb2JqZWN0X3Nl dF9kYXRhKEdfT0JKRUNUKG9iamVjdCksICJjYWxsIiwgY2FsbCk7DQogCQkJcmV0dXJuIFRSVUU7 DQogCQl9DQogDQpkaWZmIC1ydXBOIGJsdWV6LWdub21lLTAuMjcub3JpZy9jb21tb24vY2xpZW50 LmggYmx1ZXotZ25vbWUtMC4yNy9jb21tb24vY2xpZW50LmgNCi0tLSBibHVlei1nbm9tZS0wLjI3 Lm9yaWcvY29tbW9uL2NsaWVudC5oCTIwMDgtMDYtMjcgMTQ6MTI6NDkuMDAwMDAwMDAwIC0wNDAw DQorKysgYmx1ZXotZ25vbWUtMC4yNy9jb21tb24vY2xpZW50LmgJMjAwOC0wNi0yNyAxNDoxMzow NS4wMDAwMDAwMDAgLTA0MDANCkBAIC05OSwxNCArOTksMzQgQEAgY29uc3QgZ2NoYXIgKmJsdWV0 b290aF90eXBlX3RvX3N0cmluZyhndQ0KIGdib29sZWFuIGJsdWV0b290aF9jbGllbnRfcmVnaXN0 ZXJfcGFzc2tleV9hZ2VudChCbHVldG9vdGhDbGllbnQgKnNlbGYsDQogCQljb25zdCBjaGFyICpw YXRoLCBjb25zdCBjaGFyICphZGRyZXNzLCBjb25zdCB2b2lkICppbmZvKTsNCiANCi1nYm9vbGVh biBibHVldG9vdGhfY2xpZW50X2NyZWF0ZV9ib25kaW5nKEJsdWV0b290aENsaWVudCAqc2VsZiwN Cit0eXBlZGVmIHZvaWQgKCpibHVldG9vdGhfY2xpZW50X2NhbGxfcmVwbHkpIChHRXJyb3IgKmVy cm9yLCBncG9pbnRlciBkYXRhKTsNCisNCitpbnQgYmx1ZXRvb3RoX2NsaWVudF9hdmFpbGFibGVf c2VydmljZXMoQmx1ZXRvb3RoQ2xpZW50ICpzZWxmKTsNCisNCitnYm9vbGVhbiBibHVldG9vdGhf Y2xpZW50X2NhbmNlbF9jYWxsKEJsdWV0b290aENsaWVudCAqc2VsZiwNCiAJCQkJCWdjaGFyICph ZGFwdGVyLCBjb25zdCBnY2hhciAqYWRkcmVzcyk7DQorZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVu dF9jb25uZWN0KEJsdWV0b290aENsaWVudCAqc2VsZiwgZ3VpbnQgdHlwZSwgLy8gc2V0IHRvIG5v bi1BTlkgdG8gZm9yY2UgYSBjZXJ0YWluIHR5cGUgY29ubmVjdGlvbiAtLSB1c2VmdWwgZm9yIGR1 bWIgZGV2aWNlcw0KKwkJCQkJZ2NoYXIgKmFkYXB0ZXIsIGNvbnN0IGdjaGFyICphZGRyZXNzLA0K KwkJCQkJYmx1ZXRvb3RoX2NsaWVudF9jYWxsX3JlcGx5IGNhbGxiYWNrLA0KKwkJCQkJZ3BvaW50 ZXIgZGF0YSk7DQorZ2Jvb2xlYW4gYmx1ZXRvb3RoX2NsaWVudF9jcmVhdGVfYm9uZGluZyhCbHVl dG9vdGhDbGllbnQgKnNlbGYsDQorCQkJCQlnY2hhciAqYWRhcHRlciwgY29uc3QgZ2NoYXIgKmFk ZHJlc3MsDQorCQkJCQlibHVldG9vdGhfY2xpZW50X2NhbGxfcmVwbHkgY2FsbGJhY2ssDQorCQkJ CQlncG9pbnRlciBkYXRhKTsNCiBnYm9vbGVhbiBibHVldG9vdGhfY2xpZW50X3JlbW92ZV9ib25k aW5nKEJsdWV0b290aENsaWVudCAqc2VsZiwNCi0JCQkJCWdjaGFyICphZGFwdGVyLCBjb25zdCBn Y2hhciAqYWRkcmVzcyk7DQorCQkJCQlnY2hhciAqYWRhcHRlciwgY29uc3QgZ2NoYXIgKmFkZHJl c3MsDQorCQkJCQlibHVldG9vdGhfY2xpZW50X2NhbGxfcmVwbHkgY2FsbGJhY2ssDQorCQkJCQln cG9pbnRlciBkYXRhKTsNCiBnYm9vbGVhbiBibHVldG9vdGhfY2xpZW50X3NldF90cnVzdGVkKEJs dWV0b290aENsaWVudCAqc2VsZiwNCi0JCQkJCWdjaGFyICphZGFwdGVyLCBjb25zdCBnY2hhciAq YWRkcmVzcyk7DQorCQkJCQlnY2hhciAqYWRhcHRlciwgY29uc3QgZ2NoYXIgKmFkZHJlc3MsDQor CQkJCQlibHVldG9vdGhfY2xpZW50X2NhbGxfcmVwbHkgY2FsbGJhY2ssDQorCQkJCQlncG9pbnRl ciBkYXRhKTsNCiBnYm9vbGVhbiBibHVldG9vdGhfY2xpZW50X3JlbW92ZV90cnVzdChCbHVldG9v dGhDbGllbnQgKnNlbGYsDQotCQkJCQlnY2hhciAqYWRhcHRlciwgY29uc3QgZ2NoYXIgKmFkZHJl c3MpOw0KKwkJCQkJZ2NoYXIgKmFkYXB0ZXIsIGNvbnN0IGdjaGFyICphZGRyZXNzLA0KKwkJCQkJ Ymx1ZXRvb3RoX2NsaWVudF9jYWxsX3JlcGx5IGNhbGxiYWNrLA0KKwkJCQkJZ3BvaW50ZXIgZGF0 YSk7DQorDQorY29uc3QgZ2NoYXIgKmJsdWV0b290aF9jbGllbnRfZ2V0X25hbWUoQmx1ZXRvb3Ro Q2xpZW50ICpzZWxmLCBjb25zdCBnY2hhciAqYWRhcHRlcik7DQogDQogZ2Jvb2xlYW4gYmx1ZXRv b3RoX2NsaWVudF9kaXNjb25uZWN0KEJsdWV0b290aENsaWVudCAqc2VsZiwNCiAJCQkJCWdjaGFy ICphZGFwdGVyLCBjb25zdCBnY2hhciAqYWRkcmVzcyk7DQpkaWZmIC1ydXBOIGJsdWV6LWdub21l LTAuMjcub3JpZy9jb21tb24vZGJ1cy54bWwgYmx1ZXotZ25vbWUtMC4yNy9jb21tb24vZGJ1cy54 bWwNCi0tLSBibHVlei1nbm9tZS0wLjI3Lm9yaWcvY29tbW9uL2RidXMueG1sCTIwMDgtMDYtMjcg MTQ6MTI6NDkuMDAwMDAwMDAwIC0wNDAwDQorKysgYmx1ZXotZ25vbWUtMC4yNy9jb21tb24vZGJ1 cy54bWwJMjAwOC0wNi0yNyAxNDoxMzowNS4wMDAwMDAwMDAgLTA0MDANCkBAIC05OCw0ICs5OCwy MCBAQA0KICAgICAgIDxhcmcgdHlwZT0icyIgbmFtZT0iYWRkcmVzcyIvPg0KICAgICA8L21ldGhv ZD4NCiAgIDwvaW50ZXJmYWNlPg0KKyAgDQorICA8aW50ZXJmYWNlIG5hbWU9ImlucHV0Ij4NCisg ICAgPG1ldGhvZCBuYW1lPSJDcmVhdGVTZWN1cmVEZXZpY2UiPg0KKyAgICAgIDxhbm5vdGF0aW9u IG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQXN5bmMiIHZhbHVlPSIiLz4NCisgICAg ICA8YXJnIHR5cGU9InMiIG5hbWU9ImFkZHJlc3MiLz4NCisgICAgICA8YXJnIHR5cGU9InMiIGRp cmVjdGlvbj0ib3V0Ii8+DQorICAgIDwvbWV0aG9kPg0KKyAgPC9pbnRlcmZhY2U+DQorDQorICA8 aW50ZXJmYWNlIG5hbWU9ImF1ZGlvIj4NCisgICAgPG1ldGhvZCBuYW1lPSJDcmVhdGVIZWFkc2V0 Ij4NCisgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkFz eW5jIiB2YWx1ZT0iIi8+DQorICAgICAgPGFyZyB0eXBlPSJzIiBuYW1lPSJhZGRyZXNzIi8+DQor ICAgICAgPGFyZyB0eXBlPSJzIiBkaXJlY3Rpb249Im91dCIvPg0KKyAgICA8L21ldGhvZD4NCisg IDwvaW50ZXJmYWNlPg0KIDwvbm9kZT4NCmRpZmYgLXJ1cE4gYmx1ZXotZ25vbWUtMC4yNy5vcmln L3Byb3BlcnRpZXMvYWRhcHRlci5jIGJsdWV6LWdub21lLTAuMjcvcHJvcGVydGllcy9hZGFwdGVy LmMNCi0tLSBibHVlei1nbm9tZS0wLjI3Lm9yaWcvcHJvcGVydGllcy9hZGFwdGVyLmMJMjAwOC0w Ni0yNyAxNDoxMjo0OS4wMDAwMDAwMDAgLTA0MDANCisrKyBibHVlei1nbm9tZS0wLjI3L3Byb3Bl cnRpZXMvYWRhcHRlci5jCTIwMDgtMDYtMjcgMTQ6MTM6MDUuMDAwMDAwMDAwIC0wNDAwDQpAQCAt MzE3LDcgKzMxNyw3IEBAIHN0YXRpYyB2b2lkIGRlbGV0ZV9jYWxsYmFjayhHdGtXaWRnZXQgKmIN CiAJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsLCAmaXRlciwgQ09MVU1OX0FERFJFU1MsICZhZGRy ZXNzLCAtMSk7DQogDQogCWlmIChzaG93X2NvbmZpcm1fZGlhbG9nKCkgPT0gVFJVRSkNCi0JCWJs dWV0b290aF9jbGllbnRfcmVtb3ZlX2JvbmRpbmcoY2xpZW50LCBhZGFwdGVyLT5wYXRoLCBhZGRy ZXNzKTsNCisJCWJsdWV0b290aF9jbGllbnRfcmVtb3ZlX2JvbmRpbmcoY2xpZW50LCBhZGFwdGVy LT5wYXRoLCBhZGRyZXNzLCBOVUxMLCBOVUxMKTsNCiANCiAJZ19mcmVlKGFkZHJlc3MpOw0KIH0N CkBAIC0zMzgsOSArMzM4LDkgQEAgc3RhdGljIHZvaWQgdHJ1c3RlZF9jYWxsYmFjayhHdGtXaWRn ZXQgKg0KIAkJCQkJQ09MVU1OX1RSVVNURUQsICZ0cnVzdGVkLCAtMSk7DQogDQogCWlmICh0cnVz dGVkID09IEZBTFNFKQ0KLQkJYmx1ZXRvb3RoX2NsaWVudF9zZXRfdHJ1c3RlZChjbGllbnQsIGFk YXB0ZXItPnBhdGgsIGFkZHJlc3MpOw0KKwkJYmx1ZXRvb3RoX2NsaWVudF9zZXRfdHJ1c3RlZChj bGllbnQsIGFkYXB0ZXItPnBhdGgsIGFkZHJlc3MsIE5VTEwsIE5VTEwpOw0KIAllbHNlDQotCQli bHVldG9vdGhfY2xpZW50X3JlbW92ZV90cnVzdChjbGllbnQsIGFkYXB0ZXItPnBhdGgsIGFkZHJl c3MpOw0KKwkJYmx1ZXRvb3RoX2NsaWVudF9yZW1vdmVfdHJ1c3QoY2xpZW50LCBhZGFwdGVyLT5w YXRoLCBhZGRyZXNzLCBOVUxMLCBOVUxMKTsNCiANCiAJZ19mcmVlKGFkZHJlc3MpOw0KIH0NCmRp ZmYgLXJ1cE4gYmx1ZXotZ25vbWUtMC4yNy5vcmlnL3dpemFyZC9hZ2VudC5jIGJsdWV6LWdub21l LTAuMjcvd2l6YXJkL2FnZW50LmMNCi0tLSBibHVlei1nbm9tZS0wLjI3Lm9yaWcvd2l6YXJkL2Fn ZW50LmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDANCisrKyBibHVlei1nbm9t ZS0wLjI3L3dpemFyZC9hZ2VudC5jCTIwMDgtMDYtMjcgMTQ6MTM6MDUuMDAwMDAwMDAwIC0wNDAw DQpAQCAtMCwwICsxLDUwNCBAQA0KKy8qDQorICoNCisgKiAgQmx1ZVogLSBCbHVldG9vdGggcHJv dG9jb2wgc3RhY2sgZm9yIExpbnV4DQorICoNCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDgg IE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4NCisgKiAgQ29weXJpZ2h0IChD KSAyMDA2LTIwMDcgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4NCisgKg0KKyAq DQorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5DQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogIHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQorICog IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICoNCisgKiAgVGhpcyBwcm9n cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQor ICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAqICBhbG9uZyB3aXRoIHRoaXMg cHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKyAqICBGb3VuZGF0 aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEw LTEzMDEgIFVTQQ0KKyAqDQorICovDQorDQorI2lmZGVmIEhBVkVfQ09ORklHX0gNCisjaW5jbHVk ZSA8Y29uZmlnLmg+DQorI2VuZGlmDQorDQorI2luY2x1ZGUgPGRidXMvZGJ1cy1nbGliLmg+DQor DQorI2luY2x1ZGUgPGdsaWIvZ2kxOG4uaD4NCisNCisjaW5jbHVkZSA8Z3RrL2d0ay5oPg0KKw0K KyNpbmNsdWRlICJhZ2VudC5oIg0KKw0KKyNkZWZpbmUgUEFTU0tFWV9BR0VOVF9QQVRICSIvb3Jn L2JsdWV6L3Bhc3NrZXkiDQorDQorc3RhdGljIEd0a1dpZGdldCAqbWFpbl9kaWFsb2c7DQorDQor dHlwZWRlZiBlbnVtIHsNCisJQUdFTlRfRVJST1JfUkVKRUNUDQorfSBBZ2VudEVycm9yOw0KKw0K KyNkZWZpbmUgQUdFTlRfRVJST1IgKGFnZW50X2Vycm9yX3F1YXJrKCkpDQorDQorI2RlZmluZSBB R0VOVF9FUlJPUl9UWVBFIChhZ2VudF9lcnJvcl9nZXRfdHlwZSgpKSANCisNCitzdGF0aWMgR1F1 YXJrIGFnZW50X2Vycm9yX3F1YXJrKHZvaWQpDQorew0KKwlzdGF0aWMgR1F1YXJrIHF1YXJrID0g MDsNCisJaWYgKCFxdWFyaykNCisJCXF1YXJrID0gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmco ImFnZW50Iik7DQorDQorCXJldHVybiBxdWFyazsNCit9DQorDQorI2RlZmluZSBFTlVNX0VOVFJZ KE5BTUUsIERFU0MpIHsgTkFNRSwgIiIgI05BTUUgIiIsIERFU0MgfQ0KKw0KK3N0YXRpYyBHTGlz dCAqaW5wdXRfbGlzdCA9IE5VTEw7DQorDQorc3RydWN0IGlucHV0X2RhdGEgew0KKwljaGFyICpw YXRoOw0KKwljaGFyICphZGRyZXNzOw0KKwljaGFyICpzZXJ2aWNlOw0KKwljaGFyICp1dWlkOw0K KwlEQnVzR01ldGhvZEludm9jYXRpb24gKmNvbnRleHQ7DQorCUd0a1dpZGdldCAqZGlhbG9nOw0K KwlHdGtXaWRnZXQgKmJ1dHRvbjsNCisJR3RrV2lkZ2V0ICplbnRyeTsNCit9Ow0KKw0KK3N0YXRp YyBnaW50IGlucHV0X2NvbXBhcmUoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpDQor ew0KKwlzdHJ1Y3QgaW5wdXRfZGF0YSAqYV9kYXRhID0gKHN0cnVjdCBpbnB1dF9kYXRhICopIGE7 DQorCXN0cnVjdCBpbnB1dF9kYXRhICpiX2RhdGEgPSAoc3RydWN0IGlucHV0X2RhdGEgKikgYjsN CisNCisJcmV0dXJuIGdfYXNjaWlfc3RyY2FzZWNtcChhX2RhdGEtPmFkZHJlc3MsIGJfZGF0YS0+ YWRkcmVzcyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGlucHV0X2ZyZWUoc3RydWN0IGlucHV0X2Rh dGEgKmlucHV0KQ0KK3sNCisJZ3RrX3dpZGdldF9kZXN0cm95KGlucHV0LT5kaWFsb2cpOw0KKw0K KwlnX2ZyZWUoaW5wdXQtPnV1aWQpOw0KKwlnX2ZyZWUoaW5wdXQtPnNlcnZpY2UpOw0KKwlnX2Zy ZWUoaW5wdXQtPmFkZHJlc3MpOw0KKwlnX2ZyZWUoaW5wdXQtPnBhdGgpOw0KKwlnX2ZyZWUoaW5w dXQpOw0KK30NCisNCitzdGF0aWMgdm9pZCBwYXNza2V5X2NhbGxiYWNrKEd0a1dpZGdldCAqZGlh bG9nLA0KKwkJCQlnaW50IHJlc3BvbnNlLCBncG9pbnRlciB1c2VyX2RhdGEpDQorew0KKwlzdHJ1 Y3QgaW5wdXRfZGF0YSAqaW5wdXQgPSB1c2VyX2RhdGE7DQorDQorCWlmIChyZXNwb25zZSA9PSBH VEtfUkVTUE9OU0VfQUNDRVBUKSB7DQorCQljb25zdCBjaGFyICpwYXNza2V5Ow0KKwkJcGFzc2tl eSA9IGd0a19lbnRyeV9nZXRfdGV4dChHVEtfRU5UUlkoaW5wdXQtPmVudHJ5KSk7DQorCQlkYnVz X2dfbWV0aG9kX3JldHVybihpbnB1dC0+Y29udGV4dCwgcGFzc2tleSk7DQorCX0gZWxzZSB7DQor CQlHRXJyb3IgKmVycm9yOw0KKwkJZXJyb3IgPSBnX2Vycm9yX25ldyhBR0VOVF9FUlJPUiwgQUdF TlRfRVJST1JfUkVKRUNULA0KKwkJCQkJCSJQYWlyaW5nIHJlcXVlc3QgcmVqZWN0ZWQiKTsNCisJ CWRidXNfZ19tZXRob2RfcmV0dXJuX2Vycm9yKGlucHV0LT5jb250ZXh0LCBlcnJvcik7DQorCX0N CisNCisJaW5wdXRfZnJlZShpbnB1dCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGNoYW5nZWRfY2Fs bGJhY2soR3RrV2lkZ2V0ICplZGl0YWJsZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQ0KK3sNCisJc3Ry dWN0IGlucHV0X2RhdGEgKmlucHV0ID0gdXNlcl9kYXRhOw0KKwljb25zdCBnY2hhciAqdGV4dDsN CisNCisJdGV4dCA9IGd0a19lbnRyeV9nZXRfdGV4dChHVEtfRU5UUlkoaW5wdXQtPmVudHJ5KSk7 DQorDQorCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShpbnB1dC0+YnV0dG9uLCAqdGV4dCAhPSAn XDAnID8gVFJVRSA6IEZBTFNFKTsNCit9DQorDQorc3RhdGljIHZvaWQgdG9nZ2xlZF9jYWxsYmFj ayhHdGtXaWRnZXQgKmJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQ0KK3sNCisJc3RydWN0IGlu cHV0X2RhdGEgKmlucHV0ID0gdXNlcl9kYXRhOw0KKwlnYm9vbGVhbiBtb2RlOw0KKw0KKwltb2Rl ID0gZ3RrX3RvZ2dsZV9idXR0b25fZ2V0X2FjdGl2ZShHVEtfVE9HR0xFX0JVVFRPTihidXR0b24p KTsNCisNCisJZ3RrX2VudHJ5X3NldF92aXNpYmlsaXR5KEdUS19FTlRSWShpbnB1dC0+ZW50cnkp LCBtb2RlKTsNCit9DQorDQorc3RhdGljIHZvaWQgcGFzc2tleV9kaWFsb2coY29uc3QgY2hhciAq cGF0aCwgY29uc3QgY2hhciAqYWRkcmVzcywNCisJCQljb25zdCBnY2hhciAqZGV2aWNlLCBEQnVz R01ldGhvZEludm9jYXRpb24gKmNvbnRleHQpDQorew0KKwlHdGtXaWRnZXQgKmRpYWxvZzsNCisJ R3RrV2lkZ2V0ICpidXR0b247DQorCUd0a1dpZGdldCAqaW1hZ2U7DQorCUd0a1dpZGdldCAqbGFi ZWw7DQorCUd0a1dpZGdldCAqZW50cnk7DQorCUd0a1dpZGdldCAqdGFibGU7DQorCUd0a1dpZGdl dCAqdmJveDsNCisJc3RydWN0IGlucHV0X2RhdGEgKmlucHV0Ow0KKwlnY2hhciAqbWFya3VwOw0K Kw0KKwlpbnB1dCA9IGdfdHJ5X21hbGxvYzAoc2l6ZW9mKCppbnB1dCkpOw0KKwlpZiAoIWlucHV0 KQ0KKwkJcmV0dXJuOw0KKw0KKwlpbnB1dC0+cGF0aCA9IGdfc3RyZHVwKHBhdGgpOw0KKwlpbnB1 dC0+YWRkcmVzcyA9IGdfc3RyZHVwKGFkZHJlc3MpOw0KKw0KKwlpbnB1dC0+Y29udGV4dCA9IGNv bnRleHQ7DQorDQorCWRpYWxvZyA9IGd0a19kaWFsb2dfbmV3KCk7DQorDQorCWd0a193aW5kb3df c2V0X3RpdGxlKEdUS19XSU5ET1coZGlhbG9nKSwgXygiQXV0aGVudGljYXRpb24gcmVxdWVzdCIp KTsNCisNCisJZ3RrX3dpbmRvd19zZXRfcmVzaXphYmxlKEdUS19XSU5ET1coZGlhbG9nKSwgRkFM U0UpOw0KKw0KKwlndGtfd2luZG93X3NldF9wb3NpdGlvbihHVEtfV0lORE9XKGRpYWxvZyksIEdU S19XSU5fUE9TX0NFTlRFUik7DQorDQorCWd0a193aW5kb3dfc2V0X2tlZXBfYWJvdmUoR1RLX1dJ TkRPVyhkaWFsb2cpLCBUUlVFKTsNCisNCisJZ3RrX3dpbmRvd19zZXRfdXJnZW5jeV9oaW50KEdU S19XSU5ET1coZGlhbG9nKSwgVFJVRSk7DQorDQorCWd0a19kaWFsb2dfc2V0X2hhc19zZXBhcmF0 b3IoR1RLX0RJQUxPRyhkaWFsb2cpLCBGQUxTRSk7DQorDQorCWd0a193aW5kb3dfc2V0X3RyYW5z aWVudF9mb3IoR1RLX1dJTkRPVyhkaWFsb2cpLCBHVEtfV0lORE9XKG1haW5fZGlhbG9nKSk7DQor DQorCWlucHV0LT5kaWFsb2cgPSBkaWFsb2c7DQorDQorCWJ1dHRvbiA9IGd0a19kaWFsb2dfYWRk X2J1dHRvbihHVEtfRElBTE9HKGRpYWxvZyksDQorCQkJCUdUS19TVE9DS19DQU5DRUwsIEdUS19S RVNQT05TRV9SRUpFQ1QpOw0KKw0KKwlidXR0b24gPSBndGtfZGlhbG9nX2FkZF9idXR0b24oR1RL X0RJQUxPRyhkaWFsb2cpLA0KKwkJCQkJR1RLX1NUT0NLX09LLCBHVEtfUkVTUE9OU0VfQUNDRVBU KTsNCisNCisJZ3RrX3dpZGdldF9ncmFiX2RlZmF1bHQoYnV0dG9uKTsNCisNCisJZ3RrX3dpZGdl dF9zZXRfc2Vuc2l0aXZlKGJ1dHRvbiwgRkFMU0UpOw0KKw0KKwlpbnB1dC0+YnV0dG9uID0gYnV0 dG9uOw0KKw0KKwl0YWJsZSA9IGd0a190YWJsZV9uZXcoNSwgMiwgRkFMU0UpOw0KKw0KKwlndGtf dGFibGVfc2V0X3Jvd19zcGFjaW5ncyhHVEtfVEFCTEUodGFibGUpLCA0KTsNCisJZ3RrX3RhYmxl X3NldF9jb2xfc3BhY2luZ3MoR1RLX1RBQkxFKHRhYmxlKSwgMjApOw0KKw0KKwlndGtfY29udGFp bmVyX3NldF9ib3JkZXJfd2lkdGgoR1RLX0NPTlRBSU5FUih0YWJsZSksIDEyKTsNCisNCisJZ3Rr X2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUihHVEtfRElBTE9HKGRpYWxvZyktPnZib3gpLCB0 YWJsZSk7DQorDQorCWltYWdlID0gZ3RrX2ltYWdlX25ld19mcm9tX2ljb25fbmFtZShHVEtfU1RP Q0tfRElBTE9HX0FVVEhFTlRJQ0FUSU9OLA0KKwkJCQkJCQlHVEtfSUNPTl9TSVpFX0RJQUxPRyk7 DQorDQorCWd0a19taXNjX3NldF9hbGlnbm1lbnQoR1RLX01JU0MoaW1hZ2UpLCAwLjAsIDAuMCk7 DQorDQorCWd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgaW1hZ2UsIDAsIDEsIDAs IDUsDQorCQkJCQkJR1RLX1NIUklOSywgR1RLX0ZJTEwsIDAsIDApOw0KKw0KKwl2Ym94ID0gZ3Rr X3Zib3hfbmV3KEZBTFNFLCA2KTsNCisNCisJbGFiZWwgPSBndGtfbGFiZWxfbmV3KF8oIlBhaXJp bmcgcmVxdWVzdCBmb3IgZGV2aWNlOiIpKTsNCisNCisJZ3RrX21pc2Nfc2V0X2FsaWdubWVudChH VEtfTUlTQyhsYWJlbCksIDAuMCwgMC4wKTsNCisNCisJZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NP TlRBSU5FUih2Ym94KSwgbGFiZWwpOw0KKw0KKwlndGtfdGFibGVfYXR0YWNoKEdUS19UQUJMRSh0 YWJsZSksIHZib3gsIDEsIDIsIDAsIDEsDQorCQkJCUdUS19FWFBBTkQgfCBHVEtfRklMTCwgR1RL X1NIUklOSywgMCwgMCk7DQorDQorCWxhYmVsID0gZ3RrX2xhYmVsX25ldyhOVUxMKTsNCisNCisJ bWFya3VwID0gZ19zdHJkdXBfcHJpbnRmKCI8Yj4lczwvYj4iLCBkZXZpY2UpOw0KKwlndGtfbGFi ZWxfc2V0X21hcmt1cChHVEtfTEFCRUwobGFiZWwpLCBtYXJrdXApOw0KKwlnX2ZyZWUobWFya3Vw KTsNCisNCisJZ3RrX2xhYmVsX3NldF9saW5lX3dyYXAoR1RLX0xBQkVMKGxhYmVsKSwgVFJVRSk7 DQorDQorCWd0a19sYWJlbF9zZXRfc2VsZWN0YWJsZShHVEtfTEFCRUwobGFiZWwpLCBUUlVFKTsN CisNCisJZ3RrX21pc2Nfc2V0X2FsaWdubWVudChHVEtfTUlTQyhsYWJlbCksIDAuMCwgMC4wKTsN CisNCisJZ3RrX3dpZGdldF9zZXRfc2l6ZV9yZXF1ZXN0KEdUS19XSURHRVQobGFiZWwpLCAyODAs IC0xKTsNCisNCisJZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih2Ym94KSwgbGFiZWwp Ow0KKw0KKwl2Ym94ID0gZ3RrX3Zib3hfbmV3KEZBTFNFLCA2KTsNCisNCisJbGFiZWwgPSBndGtf bGFiZWxfbmV3KF8oIkVudGVyIHBhc3NrZXkgZm9yIGF1dGhlbnRpY2F0aW9uOiIpKTsNCisNCisJ Z3RrX21pc2Nfc2V0X2FsaWdubWVudChHVEtfTUlTQyhsYWJlbCksIDAuMCwgMC4wKTsNCisNCisJ Z3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih2Ym94KSwgbGFiZWwpOw0KKw0KKwlndGtf dGFibGVfYXR0YWNoKEdUS19UQUJMRSh0YWJsZSksIHZib3gsIDEsIDIsIDIsIDMsDQorCQkJCUdU S19FWFBBTkQgfCBHVEtfRklMTCwgR1RLX1NIUklOSywgMCwgMCk7DQorDQorCWVudHJ5ID0gZ3Rr X2VudHJ5X25ldygpOw0KKw0KKwlndGtfZW50cnlfc2V0X21heF9sZW5ndGgoR1RLX0VOVFJZKGVu dHJ5KSwgMTYpOw0KKw0KKwlndGtfZW50cnlfc2V0X2FjdGl2YXRlc19kZWZhdWx0KEdUS19FTlRS WShlbnRyeSksIFRSVUUpOw0KKw0KKwlndGtfZW50cnlfc2V0X3Zpc2liaWxpdHkoR1RLX0VOVFJZ KGVudHJ5KSwgRkFMU0UpOw0KKw0KKwlpbnB1dC0+ZW50cnkgPSBlbnRyeTsNCisNCisJZ19zaWdu YWxfY29ubmVjdChHX09CSkVDVChlbnRyeSksICJjaGFuZ2VkIiwNCisJCQkJR19DQUxMQkFDSyhj aGFuZ2VkX2NhbGxiYWNrKSwgaW5wdXQpOw0KKw0KKwlndGtfY29udGFpbmVyX2FkZChHVEtfQ09O VEFJTkVSKHZib3gpLCBlbnRyeSk7DQorDQorCWJ1dHRvbiA9IGd0a19jaGVja19idXR0b25fbmV3 X3dpdGhfbGFiZWwoXygiU2hvdyBpbnB1dCIpKTsNCisNCisJZ19zaWduYWxfY29ubmVjdChHX09C SkVDVChidXR0b24pLCAidG9nZ2xlZCIsDQorCQkJCUdfQ0FMTEJBQ0sodG9nZ2xlZF9jYWxsYmFj ayksIGlucHV0KTsNCisNCisJZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih2Ym94KSwg YnV0dG9uKTsNCisNCisJaW5wdXRfbGlzdCA9IGdfbGlzdF9hcHBlbmQoaW5wdXRfbGlzdCwgaW5w dXQpOw0KKwlndGtfd2lkZ2V0X3Nob3dfYWxsKGRpYWxvZyk7DQorCWd0a193aW5kb3dfcHJlc2Vu dChHVEtfV0lORE9XKGRpYWxvZykpOw0KKw0KKwlnX3NpZ25hbF9jb25uZWN0KEdfT0JKRUNUKGRp YWxvZyksICJyZXNwb25zZSIsDQorCQkJCUdfQ0FMTEJBQ0socGFzc2tleV9jYWxsYmFjayksIGlu cHV0KTsNCit9DQorDQorc3RhdGljIHZvaWQgY29uZmlybV9jYWxsYmFjayhHdGtXaWRnZXQgKmRp YWxvZywNCisJCQkJZ2ludCByZXNwb25zZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQ0KK3sNCisJc3Ry dWN0IGlucHV0X2RhdGEgKmlucHV0ID0gdXNlcl9kYXRhOw0KKw0KKwlpZiAocmVzcG9uc2UgIT0g R1RLX1JFU1BPTlNFX1lFUykgew0KKwkJR0Vycm9yICplcnJvcjsNCisJCWVycm9yID0gZ19lcnJv cl9uZXcoQUdFTlRfRVJST1IsIEFHRU5UX0VSUk9SX1JFSkVDVCwNCisJCQkJCSJDb25maXJtYXRp b24gcmVxdWVzdCByZWplY3RlZCIpOw0KKwkJZGJ1c19nX21ldGhvZF9yZXR1cm5fZXJyb3IoaW5w dXQtPmNvbnRleHQsIGVycm9yKTsNCisJfSBlbHNlDQorCQlkYnVzX2dfbWV0aG9kX3JldHVybihp bnB1dC0+Y29udGV4dCk7DQorDQorCWlucHV0X2ZyZWUoaW5wdXQpOw0KK30NCisNCitzdGF0aWMg dm9pZCBjb25maXJtX2RpYWxvZyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphZGRyZXNz LA0KKwkJCQljb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgZ2NoYXIgKmRldmljZSwNCisJCQkJCURC dXNHTWV0aG9kSW52b2NhdGlvbiAqY29udGV4dCkNCit7DQorCUd0a1dpZGdldCAqZGlhbG9nOw0K KwlHdGtXaWRnZXQgKmJ1dHRvbjsNCisJR3RrV2lkZ2V0ICppbWFnZTsNCisJR3RrV2lkZ2V0ICps YWJlbDsNCisJR3RrV2lkZ2V0ICp0YWJsZTsNCisJR3RrV2lkZ2V0ICp2Ym94Ow0KKwlnY2hhciAq bWFya3VwOw0KKwlzdHJ1Y3QgaW5wdXRfZGF0YSAqaW5wdXQ7DQorDQorCWlucHV0ID0gZ190cnlf bWFsbG9jMChzaXplb2YoKmlucHV0KSk7DQorCWlmICghaW5wdXQpDQorCQlyZXR1cm47DQorDQor CWlucHV0LT5wYXRoID0gZ19zdHJkdXAocGF0aCk7DQorCWlucHV0LT5hZGRyZXNzID0gZ19zdHJk dXAoYWRkcmVzcyk7DQorDQorCWlucHV0LT5jb250ZXh0ID0gY29udGV4dDsNCisNCisJZGlhbG9n ID0gZ3RrX2RpYWxvZ19uZXcoKTsNCisNCisJZ3RrX3dpbmRvd19zZXRfdGl0bGUoR1RLX1dJTkRP VyhkaWFsb2cpLCBfKCJDb25maXJtYXRpb24gcmVxdWVzdCIpKTsNCisNCisJZ3RrX3dpbmRvd19z ZXRfcmVzaXphYmxlKEdUS19XSU5ET1coZGlhbG9nKSwgRkFMU0UpOw0KKw0KKwlndGtfd2luZG93 X3NldF9wb3NpdGlvbihHVEtfV0lORE9XKGRpYWxvZyksIEdUS19XSU5fUE9TX0NFTlRFUik7DQor DQorCWd0a193aW5kb3dfc2V0X2tlZXBfYWJvdmUoR1RLX1dJTkRPVyhkaWFsb2cpLCBUUlVFKTsN CisNCisJZ3RrX3dpbmRvd19zZXRfdXJnZW5jeV9oaW50KEdUS19XSU5ET1coZGlhbG9nKSwgVFJV RSk7DQorDQorCWd0a19kaWFsb2dfc2V0X2hhc19zZXBhcmF0b3IoR1RLX0RJQUxPRyhkaWFsb2cp LCBGQUxTRSk7DQorDQorCWd0a193aW5kb3dfc2V0X3RyYW5zaWVudF9mb3IoR1RLX1dJTkRPVyhk aWFsb2cpLCBHVEtfV0lORE9XKG1haW5fZGlhbG9nKSk7DQorDQorCWlucHV0LT5kaWFsb2cgPSBk aWFsb2c7DQorDQorCWJ1dHRvbiA9IGd0a19kaWFsb2dfYWRkX2J1dHRvbihHVEtfRElBTE9HKGRp YWxvZyksDQorCQkJCQlHVEtfU1RPQ0tfTk8sIEdUS19SRVNQT05TRV9OTyk7DQorIA0KKwlidXR0 b24gPSBndGtfZGlhbG9nX2FkZF9idXR0b24oR1RLX0RJQUxPRyhkaWFsb2cpLA0KKwkJCQkJR1RL X1NUT0NLX1lFUywgR1RLX1JFU1BPTlNFX1lFUyk7DQorDQorCXRhYmxlID0gZ3RrX3RhYmxlX25l dyg1LCAyLCBGQUxTRSk7DQorDQorCWd0a190YWJsZV9zZXRfcm93X3NwYWNpbmdzKEdUS19UQUJM RSh0YWJsZSksIDQpOw0KKwlndGtfdGFibGVfc2V0X2NvbF9zcGFjaW5ncyhHVEtfVEFCTEUodGFi bGUpLCAyMCk7DQorDQorCWd0a19jb250YWluZXJfc2V0X2JvcmRlcl93aWR0aChHVEtfQ09OVEFJ TkVSKHRhYmxlKSwgMTIpOw0KKw0KKwlndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKEdU S19ESUFMT0coZGlhbG9nKS0+dmJveCksIHRhYmxlKTsNCisNCisJaW1hZ2UgPSBndGtfaW1hZ2Vf bmV3X2Zyb21faWNvbl9uYW1lKEdUS19TVE9DS19ESUFMT0dfQVVUSEVOVElDQVRJT04sDQorCQkJ CQkJCUdUS19JQ09OX1NJWkVfRElBTE9HKTsNCisNCisJZ3RrX21pc2Nfc2V0X2FsaWdubWVudChH VEtfTUlTQyhpbWFnZSksIDAuMCwgMC4wKTsNCisNCisJZ3RrX3RhYmxlX2F0dGFjaChHVEtfVEFC TEUodGFibGUpLCBpbWFnZSwgMCwgMSwgMCwgNSwNCisJCQkJCQlHVEtfU0hSSU5LLCBHVEtfRklM TCwgMCwgMCk7DQorDQorCXZib3ggPSBndGtfdmJveF9uZXcoRkFMU0UsIDYpOw0KKwlsYWJlbCA9 IGd0a19sYWJlbF9uZXcoXygiUGFpcmluZyByZXF1ZXN0IGZvciBkZXZpY2U6IikpOw0KKw0KKwln dGtfbWlzY19zZXRfYWxpZ25tZW50KEdUS19NSVNDKGxhYmVsKSwgMC4wLCAwLjApOw0KKw0KKwln dGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKHZib3gpLCBsYWJlbCk7DQorDQorCWd0a190 YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgdmJveCwgMSwgMiwgMCwgMSwNCisJCQkJR1RL X0VYUEFORCB8IEdUS19GSUxMLCBHVEtfU0hSSU5LLCAwLCAwKTsNCisNCisJbGFiZWwgPSBndGtf bGFiZWxfbmV3KE5VTEwpOw0KKw0KKwltYXJrdXAgPSBnX3N0cmR1cF9wcmludGYoIjxiPiVzPC9i PiIsIGRldmljZSk7DQorCWd0a19sYWJlbF9zZXRfbWFya3VwKEdUS19MQUJFTChsYWJlbCksIG1h cmt1cCk7DQorCWdfZnJlZShtYXJrdXApOw0KKw0KKwlndGtfbGFiZWxfc2V0X2xpbmVfd3JhcChH VEtfTEFCRUwobGFiZWwpLCBUUlVFKTsNCisNCisJZ3RrX2xhYmVsX3NldF9zZWxlY3RhYmxlKEdU S19MQUJFTChsYWJlbCksIFRSVUUpOw0KKw0KKwlndGtfbWlzY19zZXRfYWxpZ25tZW50KEdUS19N SVNDKGxhYmVsKSwgMC4wLCAwLjApOw0KKw0KKwlndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3Qo R1RLX1dJREdFVChsYWJlbCksIDI4MCwgLTEpOw0KKw0KKwlndGtfY29udGFpbmVyX2FkZChHVEtf Q09OVEFJTkVSKHZib3gpLCBsYWJlbCk7DQorDQorCXZib3ggPSBndGtfdmJveF9uZXcoRkFMU0Us IDYpOw0KKw0KKwlsYWJlbCA9IGd0a19sYWJlbF9uZXcoXygiQ29uZmlybSB2YWx1ZSBmb3IgYXV0 aGVudGljYXRpb246IikpOw0KKw0KKwlndGtfbWlzY19zZXRfYWxpZ25tZW50KEdUS19NSVNDKGxh YmVsKSwgMC4wLCAwLjApOw0KKw0KKwlndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKHZi b3gpLCBsYWJlbCk7DQorDQorCWd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgdmJv eCwgMSwgMiwgMiwgMywNCisJCQkJR1RLX0VYUEFORCB8IEdUS19GSUxMLCBHVEtfU0hSSU5LLCAw LCAwKTsNCisNCisJbGFiZWwgPSBndGtfbGFiZWxfbmV3KE5VTEwpOw0KKw0KKwltYXJrdXAgPSBn X3N0cmR1cF9wcmludGYoIjxiPiVzPC9iPlxuIiwgdmFsdWUpOw0KKw0KKwlndGtfbGFiZWxfc2V0 X21hcmt1cChHVEtfTEFCRUwobGFiZWwpLCBtYXJrdXApOw0KKw0KKwlnX2ZyZWUobWFya3VwKTsN CisNCisJZ3RrX21pc2Nfc2V0X2FsaWdubWVudChHVEtfTUlTQyhsYWJlbCksIDAuMCwgMC4wKTsN CisNCisJZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih2Ym94KSwgbGFiZWwpOw0KKw0K KwlpbnB1dF9saXN0ID0gZ19saXN0X2FwcGVuZChpbnB1dF9saXN0LCBpbnB1dCk7DQorCWd0a193 aWRnZXRfc2hvd19hbGwoZGlhbG9nKTsNCisJZ3RrX3dpbmRvd19wcmVzZW50KEdUS19XSU5ET1co ZGlhbG9nKSk7DQorDQorCWdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QoZGlhbG9nKSwgInJlc3Bv bnNlIiwNCisJCQkJR19DQUxMQkFDSyhjb25maXJtX2NhbGxiYWNrKSwgaW5wdXQpOw0KK30NCisN CitzdGF0aWMgZ2Jvb2xlYW4gcGFzc2tleV9hZ2VudF9yZXF1ZXN0KEdPYmplY3QgKmFnZW50LA0K KwkJCQljb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphZGRyZXNzLA0KKwkJCQkJREJ1c0dN ZXRob2RJbnZvY2F0aW9uICpjb250ZXh0KQ0KK3sNCisJQmx1ZXRvb3RoQ2xpZW50ICpjbGllbnQg PSBCTFVFVE9PVEhfQ0xJRU5UKGFnZW50KTsNCisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7DQor CWdjaGFyICpkZXZpY2U7DQorDQorCW5hbWUgPSBibHVldG9vdGhfY2xpZW50X2dldF9uYW1lKGNs aWVudCwgcGF0aCk7DQorDQorCWlmIChuYW1lKSB7DQorCQlpZiAoZ19zdHJyc3RyKG5hbWUsIGFk ZHJlc3MpKQ0KKwkJCWRldmljZSA9IGdfc3RyZHVwKG5hbWUpOw0KKwkJZWxzZQ0KKwkJCWRldmlj ZSA9IGdfc3RyZHVwX3ByaW50ZigiJXMgKCVzKSIsIG5hbWUsIGFkZHJlc3MpOw0KKwl9IGVsc2UN CisJCWRldmljZSA9IGdfc3RyZHVwKGFkZHJlc3MpOw0KKw0KKwlwYXNza2V5X2RpYWxvZyhwYXRo LCBhZGRyZXNzLCBkZXZpY2UsIGNvbnRleHQpOw0KKw0KKwlnX2ZyZWUoZGV2aWNlKTsNCisJcmV0 dXJuIFRSVUU7DQorfQ0KKw0KK3N0YXRpYyBnYm9vbGVhbiBwYXNza2V5X2FnZW50X2NvbmZpcm0o R09iamVjdCAqYWdlbnQsDQorCQkJY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWRkcmVz cywNCisJCQljb25zdCBjaGFyICp2YWx1ZSwgREJ1c0dNZXRob2RJbnZvY2F0aW9uICpjb250ZXh0 KQ0KK3sNCisJQmx1ZXRvb3RoQ2xpZW50ICpjbGllbnQgPSBCTFVFVE9PVEhfQ0xJRU5UKGFnZW50 KTsNCisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7DQorCWdjaGFyICpkZXZpY2U7DQorDQorCW5h bWUgPSBibHVldG9vdGhfY2xpZW50X2dldF9uYW1lKGNsaWVudCwgcGF0aCk7DQorDQorCWlmIChu YW1lKSB7DQorCQlpZiAoZ19zdHJyc3RyKG5hbWUsIGFkZHJlc3MpKQ0KKwkJCWRldmljZSA9IGdf c3RyZHVwKG5hbWUpOw0KKwkJZWxzZQ0KKwkJCWRldmljZSA9IGdfc3RyZHVwX3ByaW50ZigiJXMg KCVzKSIsIG5hbWUsIGFkZHJlc3MpOw0KKwl9IGVsc2UNCisJCWRldmljZSA9IGdfc3RyZHVwKGFk ZHJlc3MpOw0KKw0KKwljb25maXJtX2RpYWxvZyhwYXRoLCBhZGRyZXNzLCB2YWx1ZSwgZGV2aWNl LCBjb250ZXh0KTsNCisNCisJZ19mcmVlKGRldmljZSk7DQorCXJldHVybiBUUlVFOw0KK30NCisN CitzdGF0aWMgZ2Jvb2xlYW4gcGFzc2tleV9hZ2VudF9jYW5jZWwoR09iamVjdCAqYWdlbnQsDQor CQkJY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWRkcmVzcywgR0Vycm9yICoqZXJyb3Ip DQorew0KKwlHTGlzdCAqbGlzdDsNCisJR0Vycm9yICpyZXN1bHQ7DQorCXN0cnVjdCBpbnB1dF9k YXRhICppbnB1dDsNCisNCisJaW5wdXQgPSBnX3RyeV9tYWxsb2MwKHNpemVvZigqaW5wdXQpKTsN CisJaWYgKCFpbnB1dCkNCisJCXJldHVybiBGQUxTRTsNCisNCisJaW5wdXQtPnBhdGggPSBnX3N0 cmR1cChwYXRoKTsNCisJaW5wdXQtPmFkZHJlc3MgPSBnX3N0cmR1cChhZGRyZXNzKTsNCisNCisJ bGlzdCA9IGdfbGlzdF9maW5kX2N1c3RvbShpbnB1dF9saXN0LCBpbnB1dCwgaW5wdXRfY29tcGFy ZSk7DQorDQorCWdfZnJlZShpbnB1dC0+YWRkcmVzcyk7DQorCWdfZnJlZShpbnB1dC0+cGF0aCk7 DQorCWdfZnJlZShpbnB1dCk7DQorDQorCWlmICghbGlzdCB8fCAhbGlzdC0+ZGF0YSkNCisJCXJl dHVybiBGQUxTRTsNCisNCisJaW5wdXQgPSBsaXN0LT5kYXRhOw0KKw0KKwlyZXN1bHQgPSBnX2Vy cm9yX25ldyhBR0VOVF9FUlJPUiwgQUdFTlRfRVJST1JfUkVKRUNULA0KKwkJCQkJCSJBZ2VudCBj YWxsYmFjayBjYW5jZWxlZCIpOw0KKw0KKwlkYnVzX2dfbWV0aG9kX3JldHVybl9lcnJvcihpbnB1 dC0+Y29udGV4dCwgcmVzdWx0KTsNCisNCisJaW5wdXRfZnJlZShpbnB1dCk7DQorDQorCXJldHVy biBUUlVFOw0KK30NCisNCitzdGF0aWMgZ2Jvb2xlYW4gcGFzc2tleV9hZ2VudF9yZWxlYXNlKEdP YmplY3QgKmFnZW50LCBHRXJyb3IgKiplcnJvcikNCit7DQorCXJldHVybiBUUlVFOw0KK30NCisN CisjaW5jbHVkZSAicGFzc2tleS1hZ2VudC1nbHVlLmgiDQorDQordm9pZCBzZXRfYWdlbnRfcGFy ZW50X3dpbmRvdyhHdGtXaWRnZXQgKndpbmRvdykNCit7DQorCW1haW5fZGlhbG9nID0gd2luZG93 Ow0KK30NCisNCitnYm9vbGVhbiByZWdpc3Rlcl9hZ2VudChCbHVldG9vdGhDbGllbnQgKmNsaWVu dCwNCisJCQkJCQljb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphZGRyZXNzKQ0KK3sNCisJ cmV0dXJuIGJsdWV0b290aF9jbGllbnRfcmVnaXN0ZXJfcGFzc2tleV9hZ2VudChjbGllbnQsIHBh dGgsIGFkZHJlc3MsICZkYnVzX2dsaWJfcGFzc2tleV9hZ2VudF9vYmplY3RfaW5mbyk7DQorfQ0K Kw0KZGlmZiAtcnVwTiBibHVlei1nbm9tZS0wLjI3Lm9yaWcvd2l6YXJkL2FnZW50LmggYmx1ZXot Z25vbWUtMC4yNy93aXphcmQvYWdlbnQuaA0KLS0tIGJsdWV6LWdub21lLTAuMjcub3JpZy93aXph cmQvYWdlbnQuaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMA0KKysrIGJsdWV6 LWdub21lLTAuMjcvd2l6YXJkL2FnZW50LmgJMjAwOC0wNi0yNyAxNDoxMzowNS4wMDAwMDAwMDAg LTA0MDANCkBAIC0wLDAgKzEsMzAgQEANCisvKg0KKyAqDQorICogIEJsdWVaIC0gQmx1ZXRvb3Ro IHByb3RvY29sIHN0YWNrIGZvciBMaW51eA0KKyAqDQorICogIENvcHlyaWdodCAoQykgMjAwNS0y MDA4ICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+DQorICogIENvcHlyaWdo dCAoQykgMjAwNi0yMDA3ICBCYXN0aWVuIE5vY2VyYSA8aGFkZXNzQGhhZGVzcy5uZXQ+DQorICoN CisgKg0KKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0K KyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqDQorICogIFRoaXMg cHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LA0KKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZg0KKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuDQorICoNCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisgKiAgYWxvbmcgd2l0aCB0 aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisgKiAgRm91 bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAw MjExMC0xMzAxICBVU0ENCisgKg0KKyAqLw0KKw0KKyNpbmNsdWRlIDxndGsvZ3RrLmg+DQorI2lu Y2x1ZGUgImNsaWVudC5oIg0KKw0KK3ZvaWQgc2V0X2FnZW50X3BhcmVudF93aW5kb3coR3RrV2lk Z2V0ICp3aW5kb3cpOw0KK2ludCByZWdpc3Rlcl9hZ2VudChCbHVldG9vdGhDbGllbnQgKmNsaWVu dCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWRkcmVzcyk7DQorDQpkaWZmIC1ydXBO IGJsdWV6LWdub21lLTAuMjcub3JpZy93aXphcmQvbWFpbi5jIGJsdWV6LWdub21lLTAuMjcvd2l6 YXJkL21haW4uYw0KLS0tIGJsdWV6LWdub21lLTAuMjcub3JpZy93aXphcmQvbWFpbi5jCTIwMDgt MDYtMjcgMTQ6MTI6NDkuMDAwMDAwMDAwIC0wNDAwDQorKysgYmx1ZXotZ25vbWUtMC4yNy93aXph cmQvbWFpbi5jCTIwMDgtMDYtMjcgMTQ6MjE6NDEuMDAwMDAwMDAwIC0wNDAwDQpAQCAtMzIsNiAr MzIsNyBAQA0KICNpbmNsdWRlIDxndGsvZ3RrLmg+DQogDQogI2luY2x1ZGUgImNsaWVudC5oIg0K KyNpbmNsdWRlICJhZ2VudC5oIg0KIA0KICNpbmNsdWRlICJkYnVzLWdsdWUuaCINCiANCkBAIC00 MSw5MyArNDIsMTQxIEBADQogc3RhdGljIGdib29sZWFuIHNpbmdsZXRvbiA9IEZBTFNFOw0KIA0K IHN0YXRpYyBCbHVldG9vdGhDbGllbnQgKmNsaWVudDsNCitzdGF0aWMgREJ1c0dQcm94eUNhbGwg KmNhbGwgPSBOVUxMOw0KIA0KIHN0YXRpYyBnY2hhciAqYWRkcmVzcyA9IE5VTEw7DQotc3RhdGlj IGdjaGFyICpwYXNza2V5ID0gIjEyMzQ1NiI7DQogDQorc3RhdGljIEd0a1dpZGdldCAqcGFnZV9w cmV2ID0gTlVMTDsNCiBzdGF0aWMgR3RrV2lkZ2V0ICpwYWdlX3NlYXJjaCA9IE5VTEw7DQotc3Rh dGljIEd0a1dpZGdldCAqcGFnZV9pbmZvID0gTlVMTDsNCiBzdGF0aWMgR3RrV2lkZ2V0ICpwYWdl X3BhaXJpbmcgPSBOVUxMOw0KK3N0YXRpYyBHdGtXaWRnZXQgKnBhZ2VfaW5mbyA9IE5VTEw7DQog c3RhdGljIEd0a1dpZGdldCAqcGFnZV9zdW1tYXJ5ID0gTlVMTDsNCitzdGF0aWMgaW50IHBhZ2Vf c3VtbWFyeV9udW0gPSAwOw0KIA0KLXN0YXRpYyBHdGtXaWRnZXQgKmxhYmVsX3BhaXJpbmcgPSBO VUxMOw0KLXN0YXRpYyBHdGtXaWRnZXQgKmxhYmVsX3Bhc3NrZXkgPSBOVUxMOw0KK3N0YXRpYyBH dGtXaWRnZXQgKnBhaXJpbmdfcHJvZ3Jlc3MgPSBOVUxMOw0KK3N0YXRpYyBndWludCBwYWlyaW5n X3Byb2dyZXNzX3RpbWVvdXQgPSAwOw0KK3N0YXRpYyBHdGtXaWRnZXQgKnBhaXJpbmdfbWVzc2Fn ZSA9IE5VTEw7DQogDQorc3RhdGljIEdTTGlzdCAqdHlwZV9ncm91cCA9IE5VTEw7DQogc3RhdGlj IEd0a1dpZGdldCAqc2VsZWN0b3IgPSBOVUxMOw0KIA0KLXN0YXRpYyBnYm9vbGVhbiBwYXNza2V5 X2FnZW50X3JlcXVlc3QoR09iamVjdCAqYWdlbnQsDQotCQkJCWNvbnN0IGNoYXIgKnBhdGgsIGNv bnN0IGNoYXIgKmFkZHJlc3MsDQotCQkJCQlEQnVzR01ldGhvZEludm9jYXRpb24gKmNvbnRleHQp DQotew0KLQljb25zdCBjaGFyICp2YWx1ZSA9IHBhc3NrZXk7DQotDQotCS8qIEFwcGxlIFdpcmVs ZXNzIGFuZCBNaWdodHkgTW91c2UgKi8NCi0JaWYgKGdfc3RyX2hhc19wcmVmaXgoYWRkcmVzcywg IjAwOjBBOjk1OiIpID09IFRSVUUgfHwNCi0JCQkJZ19zdHJfaGFzX3ByZWZpeChhZGRyZXNzLCAi MDA6MTQ6NTE6IikgPT0gVFJVRSkNCi0JCXZhbHVlID0gIjAwMDAiOw0KLQ0KLQlkYnVzX2dfbWV0 aG9kX3JldHVybihjb250ZXh0LCB2YWx1ZSk7DQorc3RhdGljIHZvaWQgY2xvc2VfY2FsbGJhY2so R3RrV2lkZ2V0ICphc3Npc3RhbnQsIGdwb2ludGVyIGRhdGEpDQorew0KKwlndGtfd2lkZ2V0X2Rl c3Ryb3koYXNzaXN0YW50KTsNCiANCi0JcmV0dXJuIFRSVUU7DQorCWd0a19tYWluX3F1aXQoKTsN CiB9DQogDQotc3RhdGljIGdib29sZWFuIHBhc3NrZXlfYWdlbnRfY2FuY2VsKEdPYmplY3QgKmFn ZW50LA0KLQkJCWNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmFkZHJlc3MsIEdFcnJvciAq KmVycm9yKQ0KK3N0YXRpYyB2b2lkIGNhbmNlbF9jYWxsYmFjayhHdGtXaWRnZXQgKmFzc2lzdGFu dCwgZ3BvaW50ZXIgZGF0YSkNCiB7DQotCXJldHVybiBUUlVFOw0KKwlndGtfd2lkZ2V0X2Rlc3Ry b3koYXNzaXN0YW50KTsNCisNCisJZ3RrX21haW5fcXVpdCgpOw0KIH0NCiANCi1zdGF0aWMgZ2Jv b2xlYW4gcGFzc2tleV9hZ2VudF9yZWxlYXNlKEdPYmplY3QgKmFnZW50LCBHRXJyb3IgKiplcnJv cikNCitzdGF0aWMgZ2ludCBzZWxlY3RlZF90eXBlKHZvaWQpDQogew0KLQlyZXR1cm4gVFJVRTsN CisJR1NMaXN0ICppdGVyOw0KKwlmb3IgKGl0ZXIgPSB0eXBlX2dyb3VwOyBpdGVyOyBpdGVyID0g aXRlci0+bmV4dCkgew0KKwkJR3RrVG9nZ2xlQnV0dG9uICpidXR0b24gPSBHVEtfVE9HR0xFX0JV VFRPTihpdGVyLT5kYXRhKTsNCisJCWlmIChndGtfdG9nZ2xlX2J1dHRvbl9nZXRfYWN0aXZlKGJ1 dHRvbikpIHsNCisJCQlncG9pbnRlciBkYXRhID0gZ19vYmplY3RfZ2V0X2RhdGEoR19PQkpFQ1Qo YnV0dG9uKSwgImJsdWV6LXR5cGUiKTsNCisJCQlyZXR1cm4gR1BPSU5URVJfVE9fSU5UKGRhdGEp Ow0KKwkJfQ0KKwl9DQorCXJldHVybiBCTFVFVE9PVEhfVFlQRV9BTlk7DQogfQ0KKyANCitzdGF0 aWMgdm9pZCBzaG93X3BhaXJpbmdfZXJyb3IoR0Vycm9yICplcnJvcikNCit7DQorCWdjaGFyICpt c2c7DQorCWNvbnN0IGdjaGFyICplcnJtc2c7DQorDQorCWd0a193aWRnZXRfaGlkZShwYWlyaW5n X3Byb2dyZXNzKTsNCisJaWYgKHBhaXJpbmdfcHJvZ3Jlc3NfdGltZW91dCA+IDApIHsNCisJCWdf c291cmNlX3JlbW92ZShwYWlyaW5nX3Byb2dyZXNzX3RpbWVvdXQpOw0KKwkJcGFpcmluZ19wcm9n cmVzc190aW1lb3V0ID0gMDsNCisJfQ0KIA0KLSNpbmNsdWRlICJwYXNza2V5LWFnZW50LWdsdWUu aCINCisJaWYgKCFlcnJvcikNCisJCWVycm1zZyA9IF8oIkNvdWxkIG5vdCBjb250YWN0IGJsdWV0 b290aCBzZXJ2aWNlIik7DQorCWVsc2UNCisJCWVycm1zZyA9IGVycm9yLT5tZXNzYWdlOw0KIA0K LSNpZiAwDQotc3RhdGljIGdpbnQgcGFnZV9mb3J3YXJkKGdpbnQgY3VycmVudF9wYWdlLCBncG9p bnRlciBkYXRhKQ0KLXsNCi0JcmV0dXJuIGN1cnJlbnRfcGFnZSArIDE7DQorCW1zZyA9IGdfc3Ry ZHVwX3ByaW50ZigiPGI+JXM8L2I+XG5cbiVzIiwgXygiQ2Fubm90IGNvbm5lY3QgdG8gZGV2aWNl OiIpLCBlcnJtc2cpOw0KKwlndGtfbGFiZWxfc2V0X21hcmt1cChHVEtfTEFCRUwocGFpcmluZ19t ZXNzYWdlKSwgbXNnKTsNCisJZ3RrX3dpZGdldF9zaG93KHBhaXJpbmdfbWVzc2FnZSk7DQorCWdf ZnJlZShtc2cpOw0KIH0NCi0jZW5kaWYNCiANCi1zdGF0aWMgdm9pZCBjbG9zZV9jYWxsYmFjayhH dGtXaWRnZXQgKmFzc2lzdGFudCwgZ3BvaW50ZXIgZGF0YSkNCitzdGF0aWMgdm9pZCB0cnVzdGVk X2NhbGxiYWNrKEdFcnJvciAqZXJyb3IsIGdwb2ludGVyIGRhdGEpDQogew0KLQlndGtfd2lkZ2V0 X2Rlc3Ryb3koYXNzaXN0YW50KTsNCisJR3RrQXNzaXN0YW50ICphc3Npc3RhbnQgPSBHVEtfQVNT SVNUQU5UKGRhdGEpOw0KIA0KLQlndGtfbWFpbl9xdWl0KCk7DQorCWd0a193aWRnZXRfaGlkZShw YWlyaW5nX3Byb2dyZXNzKTsNCisJaWYgKHBhaXJpbmdfcHJvZ3Jlc3NfdGltZW91dCA+IDApIHsN CisJCWdfc291cmNlX3JlbW92ZShwYWlyaW5nX3Byb2dyZXNzX3RpbWVvdXQpOw0KKwkJcGFpcmlu Z19wcm9ncmVzc190aW1lb3V0ID0gMDsNCisJfQ0KKw0KKwlpZiAoZXJyb3IpIHsNCisJCXNob3df cGFpcmluZ19lcnJvcihlcnJvcik7DQorCX0NCisJZWxzZSB7DQorCQlndGtfYXNzaXN0YW50X3Nl dF9wYWdlX2NvbXBsZXRlKGFzc2lzdGFudCwgcGFnZV9wYWlyaW5nLCBUUlVFKTsNCisJCWd0a19h c3Npc3RhbnRfc2V0X2N1cnJlbnRfcGFnZShhc3Npc3RhbnQsIHBhZ2Vfc3VtbWFyeV9udW0pOyAv LyBqdW1wIHRvIHN1bW1hcnkNCisJfQ0KIH0NCiANCi1zdGF0aWMgdm9pZCBjYW5jZWxfY2FsbGJh Y2soR3RrV2lkZ2V0ICphc3Npc3RhbnQsIGdwb2ludGVyIGRhdGEpDQorc3RhdGljIHZvaWQgY29u bmVjdF9jYWxsYmFjayhHRXJyb3IgKmVycm9yLCBncG9pbnRlciBkYXRhKQ0KIHsNCi0JZ3RrX3dp ZGdldF9kZXN0cm95KGFzc2lzdGFudCk7DQorCWlmIChlcnJvciB8fA0KKwkgICAgIWJsdWV0b290 aF9jbGllbnRfc2V0X3RydXN0ZWQoY2xpZW50LCBOVUxMLCBhZGRyZXNzLCB0cnVzdGVkX2NhbGxi YWNrLCBkYXRhKSkNCisJCXNob3dfcGFpcmluZ19lcnJvcihlcnJvcik7DQorfQ0KIA0KLQlndGtf bWFpbl9xdWl0KCk7DQorc3RhdGljIGdib29sZWFuIHB1bHNlX3Byb2dyZXNzKGdwb2ludGVyIGRh dGEpDQorew0KKwlndGtfcHJvZ3Jlc3NfYmFyX3B1bHNlKEdUS19QUk9HUkVTU19CQVIocGFpcmlu Z19wcm9ncmVzcykpOw0KKwlyZXR1cm4gVFJVRTsNCiB9DQogDQogc3RhdGljIHZvaWQgcHJlcGFy ZV9jYWxsYmFjayhHdGtXaWRnZXQgKmFzc2lzdGFudCwNCiAJCQkJR3RrV2lkZ2V0ICpwYWdlLCBn cG9pbnRlciBkYXRhKQ0KIHsNCisJZ2Jvb2xlYW4gY29tcGxldGUgPSBUUlVFOw0KKw0KIAlpZiAo cGFnZSA9PSBwYWdlX3NlYXJjaCkgew0KKwkJZ2ludCB0eXBlID0gc2VsZWN0ZWRfdHlwZSgpOw0K KwkJZ19vYmplY3Rfc2V0KEdfT0JKRUNUKHNlbGVjdG9yKSwgImRldmljZS10eXBlLWZpbHRlciIs IHR5cGUsIE5VTEwpOw0KIAkJYmx1ZXRvb3RoX2RldmljZV9zZWxlY3Rpb25fc3RhcnRfZGlzY292 ZXJ5KEJMVUVUT09USF9ERVZJQ0VfU0VMRUNUSU9OKHNlbGVjdG9yKSk7DQotCQlyZXR1cm47DQor CQlpZiAoYWRkcmVzcykNCisJCQlibHVldG9vdGhfY2xpZW50X2NhbmNlbF9jYWxsKGNsaWVudCwg TlVMTCwgYWRkcmVzcyk7DQorCQljb21wbGV0ZSA9IGFkZHJlc3MgIT0gTlVMTDsNCiAJfQ0KLQ0K LQlpZiAocGFnZSA9PSBwYWdlX3BhaXJpbmcpIHsNCisJZWxzZSBpZiAocGFnZSA9PSBwYWdlX3Bh aXJpbmcpIHsNCiAJCWJsdWV0b290aF9jbGllbnRfY2FuY2VsX2Rpc2NvdmVyeShjbGllbnQsIE5V TEwpOw0KIA0KLQkJYmx1ZXRvb3RoX2NsaWVudF9yZWdpc3Rlcl9wYXNza2V5X2FnZW50KGNsaWVu dCwNCi0JCQkJCSIvb3JnL2JsdWV6L2FwcGxldCIsIGFkZHJlc3MsDQotCQkJCQkmZGJ1c19nbGli X3Bhc3NrZXlfYWdlbnRfb2JqZWN0X2luZm8pOw0KLQ0KLQkJYmx1ZXRvb3RoX2NsaWVudF9jcmVh dGVfYm9uZGluZyhjbGllbnQsIE5VTEwsIGFkZHJlc3MpOw0KLQ0KLQkJZ3RrX2xhYmVsX3NldF9t YXJrdXAoR1RLX0xBQkVMKGxhYmVsX3BhaXJpbmcpLCBhZGRyZXNzKTsNCi0JCWd0a19sYWJlbF9z ZXRfbWFya3VwKEdUS19MQUJFTChsYWJlbF9wYXNza2V5KSwgcGFzc2tleSk7DQotCQlyZXR1cm47 DQorCQlyZWdpc3Rlcl9hZ2VudChjbGllbnQsICIvb3JnL2JsdWV6L2FwcGxldCIsIGFkZHJlc3Mp Ow0KKw0KKwkJaWYgKHBhZ2VfcHJldiA9PSBwYWdlX3NlYXJjaCkgew0KKwkJCXBhaXJpbmdfcHJv Z3Jlc3NfdGltZW91dCA9IGdfdGltZW91dF9hZGQoMTAwLCBwdWxzZV9wcm9ncmVzcywgcGFpcmlu Z19wcm9ncmVzcyk7DQorCQkJZ3RrX3dpZGdldF9zaG93KHBhaXJpbmdfcHJvZ3Jlc3MpOw0KKwkJ CWd0a193aWRnZXRfaGlkZShwYWlyaW5nX21lc3NhZ2UpOw0KKwkJCWNvbXBsZXRlID0gRkFMU0U7 DQorCQkJaWYgKCFibHVldG9vdGhfY2xpZW50X2Nvbm5lY3QoY2xpZW50LCBzZWxlY3RlZF90eXBl KCksIE5VTEwsIGFkZHJlc3MsDQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u bmVjdF9jYWxsYmFjaywgYXNzaXN0YW50KSkNCisJCQkJc2hvd19wYWlyaW5nX2Vycm9yKE5VTEwp Ow0KKwkJfQ0KKwl9DQorDQorCWlmIChwYWdlICE9IHBhZ2VfcGFpcmluZyAmJiBwYWlyaW5nX3By b2dyZXNzX3RpbWVvdXQgPiAwKSB7DQorCQlnX3NvdXJjZV9yZW1vdmUocGFpcmluZ19wcm9ncmVz c190aW1lb3V0KTsNCisJCXBhaXJpbmdfcHJvZ3Jlc3NfdGltZW91dCA9IDA7DQogCX0NCiANCi0J Z3RrX2Fzc2lzdGFudF9zZXRfcGFnZV9jb21wbGV0ZShHVEtfQVNTSVNUQU5UKGFzc2lzdGFudCks IHBhZ2UsIFRSVUUpOw0KKwlndGtfYXNzaXN0YW50X3NldF9wYWdlX2NvbXBsZXRlKEdUS19BU1NJ U1RBTlQoYXNzaXN0YW50KSwgcGFnZSwgY29tcGxldGUpOw0KKwlwYWdlX3ByZXYgPSBwYWdlOw0K IH0NCiANCiBzdGF0aWMgR3RrV2lkZ2V0ICpjcmVhdGVfdmJveChHdGtXaWRnZXQgKmFzc2lzdGFu dCwgR3RrQXNzaXN0YW50UGFnZVR5cGUgdHlwZSwNCkBAIC0yMzgsNTUgKzI4NywzOSBAQCBzdGF0 aWMgdm9pZCBjcmVhdGVfdHlwZShHdGtXaWRnZXQgKmFzc2lzDQogDQogCXZib3ggPSBjcmVhdGVf dmJveChhc3Npc3RhbnQsIEdUS19BU1NJU1RBTlRfUEFHRV9DT05URU5ULA0KIAkJCV8oIkRldmlj ZSB0eXBlIiksDQotCQkJXygiU2VsZWN0IHRoZSB0eXBlIG9mIGRldmljZSB5b3Ugd2FudCB0byBz ZXR1cCIpKTsNCi0NCi0JYnV0dG9uID0gZ3RrX3JhZGlvX2J1dHRvbl9uZXdfd2l0aF9sYWJlbChn cm91cCwgXygiTW91c2UiKSk7DQotDQotCWdyb3VwID0gZ3RrX3JhZGlvX2J1dHRvbl9nZXRfZ3Jv dXAoR1RLX1JBRElPX0JVVFRPTihidXR0b24pKTsNCi0NCi0JLy9ndGtfd2lkZ2V0X3NldF9zZW5z aXRpdmUoR1RLX1dJREdFVChidXR0b24pLCBGQUxTRSk7DQorCQkJXygiU2VsZWN0IHRoZSB0eXBl IG9mIGRldmljZSB5b3Ugd2FudCB0byBjb25uZWN0IikpOw0KIA0KKwlidXR0b24gPSBndGtfcmFk aW9fYnV0dG9uX25ld193aXRoX2xhYmVsKE5VTEwsIF8oIk1vdXNlIikpOw0KKwlnX29iamVjdF9z ZXRfZGF0YShHX09CSkVDVChidXR0b24pLA0KKwkgICAgICAgICAgICAgICAgICAiYmx1ZXotdHlw ZSIsIEdJTlRfVE9fUE9JTlRFUihCTFVFVE9PVEhfVFlQRV9NT1VTRSkpOw0KIAlndGtfYm94X3Bh Y2tfc3RhcnQoR1RLX0JPWCh2Ym94KSwgYnV0dG9uLCBGQUxTRSwgRkFMU0UsIDApOw0KIA0KLQli dXR0b24gPSBndGtfcmFkaW9fYnV0dG9uX25ld193aXRoX2xhYmVsKGdyb3VwLCBfKCJLZXlib2Fy ZCIpKTsNCi0NCi0JZ3JvdXAgPSBndGtfcmFkaW9fYnV0dG9uX2dldF9ncm91cChHVEtfUkFESU9f QlVUVE9OKGJ1dHRvbikpOw0KLQ0KLQkvL2d0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShHVEtfV0lE R0VUKGJ1dHRvbiksIEZBTFNFKTsNCi0NCisJYnV0dG9uID0gZ3RrX3JhZGlvX2J1dHRvbl9uZXdf d2l0aF9sYWJlbF9mcm9tX3dpZGdldChHVEtfUkFESU9fQlVUVE9OKGJ1dHRvbiksIF8oIktleWJv YXJkIikpOw0KKwlnX29iamVjdF9zZXRfZGF0YShHX09CSkVDVChidXR0b24pLA0KKwkgICAgICAg ICAgICAgICAgICAiYmx1ZXotdHlwZSIsIEdJTlRfVE9fUE9JTlRFUihCTFVFVE9PVEhfVFlQRV9L RVlCT0FSRCkpOw0KIAlndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWCh2Ym94KSwgYnV0dG9uLCBG QUxTRSwgRkFMU0UsIDApOw0KIA0KLQlidXR0b24gPSBndGtfcmFkaW9fYnV0dG9uX25ld193aXRo X2xhYmVsKGdyb3VwLCBfKCJNb2JpbGUgcGhvbmUiKSk7DQotDQotCWdyb3VwID0gZ3RrX3JhZGlv X2J1dHRvbl9nZXRfZ3JvdXAoR1RLX1JBRElPX0JVVFRPTihidXR0b24pKTsNCi0NCi0JZ3RrX3dp ZGdldF9zZXRfc2Vuc2l0aXZlKEdUS19XSURHRVQoYnV0dG9uKSwgRkFMU0UpOw0KLQ0KKyNpZiAw DQorCWJ1dHRvbiA9IGd0a19yYWRpb19idXR0b25fbmV3X3dpdGhfbGFiZWxfZnJvbV93aWRnZXQo R1RLX1JBRElPX0JVVFRPTihidXR0b24pLCBfKCJNb2JpbGUgcGhvbmUiKSk7DQogCWd0a19ib3hf cGFja19zdGFydChHVEtfQk9YKHZib3gpLCBidXR0b24sIEZBTFNFLCBGQUxTRSwgMCk7DQogDQot CWJ1dHRvbiA9IGd0a19yYWRpb19idXR0b25fbmV3X3dpdGhfbGFiZWwoZ3JvdXAsIF8oIlByaW50 ZXIiKSk7DQotDQotCWdyb3VwID0gZ3RrX3JhZGlvX2J1dHRvbl9nZXRfZ3JvdXAoR1RLX1JBRElP X0JVVFRPTihidXR0b24pKTsNCi0NCi0JZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKEdUS19XSURH RVQoYnV0dG9uKSwgRkFMU0UpOw0KLQ0KKwlidXR0b24gPSBndGtfcmFkaW9fYnV0dG9uX25ld193 aXRoX2xhYmVsX2Zyb21fd2lkZ2V0KEdUS19SQURJT19CVVRUT04oYnV0dG9uKSwgXygiUHJpbnRl ciIpKTsNCiAJZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1godmJveCksIGJ1dHRvbiwgRkFMU0Us IEZBTFNFLCAwKTsNCisjZW5kaWYNCiANCi0JYnV0dG9uID0gZ3RrX3JhZGlvX2J1dHRvbl9uZXdf d2l0aF9sYWJlbChncm91cCwgXygiSGVhZHNldCIpKTsNCi0NCi0JZ3JvdXAgPSBndGtfcmFkaW9f YnV0dG9uX2dldF9ncm91cChHVEtfUkFESU9fQlVUVE9OKGJ1dHRvbikpOw0KLQ0KLQlndGtfd2lk Z2V0X3NldF9zZW5zaXRpdmUoR1RLX1dJREdFVChidXR0b24pLCBGQUxTRSk7DQotDQorCWJ1dHRv biA9IGd0a19yYWRpb19idXR0b25fbmV3X3dpdGhfbGFiZWxfZnJvbV93aWRnZXQoR1RLX1JBRElP X0JVVFRPTihidXR0b24pLCBfKCJIZWFkc2V0IikpOw0KKwlnX29iamVjdF9zZXRfZGF0YShHX09C SkVDVChidXR0b24pLA0KKwkgICAgICAgICAgICAgICAgICAiYmx1ZXotdHlwZSIsIEdJTlRfVE9f UE9JTlRFUihCTFVFVE9PVEhfVFlQRV9IRUFEU0VUKSk7DQogCWd0a19ib3hfcGFja19zdGFydChH VEtfQk9YKHZib3gpLCBidXR0b24sIEZBTFNFLCBGQUxTRSwgMCk7DQogDQotCWJ1dHRvbiA9IGd0 a19yYWRpb19idXR0b25fbmV3X3dpdGhfbGFiZWwoZ3JvdXAsIF8oIkFueSBkZXZpY2UiKSk7DQot DQotCWdyb3VwID0gZ3RrX3JhZGlvX2J1dHRvbl9nZXRfZ3JvdXAoR1RLX1JBRElPX0JVVFRPTihi dXR0b24pKTsNCi0NCi0JZ3RrX3RvZ2dsZV9idXR0b25fc2V0X2FjdGl2ZShHVEtfVE9HR0xFX0JV VFRPTihidXR0b24pLCBUUlVFKTsNCi0NCisjaWYgMA0KKwlidXR0b24gPSBndGtfcmFkaW9fYnV0 dG9uX25ld193aXRoX2xhYmVsX2Zyb21fd2lkZ2V0KEdUS19SQURJT19CVVRUT04oYnV0dG9uKSwg XygiQW55IGRldmljZSIpKTsNCisJZ19vYmplY3Rfc2V0X2RhdGEoR19PQkpFQ1QoYnV0dG9uKSwN CisJICAgICAgICAgICAgICAgICAgImJsdWV6LXR5cGUiLCBHSU5UX1RPX1BPSU5URVIoQkxVRVRP T1RIX1RZUEVfQU5ZKSk7DQogCWd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKHZib3gpLCBidXR0 b24sIEZBTFNFLCBGQUxTRSwgMCk7DQorI2VuZGlmDQorDQorCXR5cGVfZ3JvdXAgPSBndGtfcmFk aW9fYnV0dG9uX2dldF9ncm91cChHVEtfUkFESU9fQlVUVE9OKGJ1dHRvbikpOw0KIH0NCiANCiBz dGF0aWMgdm9pZCBzZWxlY3RfY2FsbGJhY2soQmx1ZXRvb3RoRGV2aWNlU2VsZWN0aW9uICpzZWws DQpAQCAtMzEwLDcgKzM0Myw3IEBAIHN0YXRpYyB2b2lkIGNyZWF0ZV9zZWFyY2goR3RrV2lkZ2V0 ICphc3MNCiANCiAJdmJveCA9IGNyZWF0ZV92Ym94KGFzc2lzdGFudCwgR1RLX0FTU0lTVEFOVF9Q QUdFX0NPTlRFTlQsDQogCQkJCV8oIkRldmljZSBzZWFyY2giKSwNCi0JCQkJXygiU2VsZWN0IHRo ZSBkZXZpY2UgeW91IHdhbnQgdG8gc2V0dXAiKSk7DQorCQkJCV8oIlNlbGVjdCB0aGUgZGV2aWNl IHlvdSB3YW50IHRvIGNvbm5lY3QiKSk7DQogDQogCXNlbGVjdG9yID0gYmx1ZXRvb3RoX2Rldmlj ZV9zZWxlY3Rpb25fbmV3KE5VTEwpOw0KIA0KQEAgLTM0OSwyNiArMzgyLDI3IEBAIHN0YXRpYyB2 b2lkIGNyZWF0ZV9wYWlyaW5nKEd0a1dpZGdldCAqYXMNCiB7DQogCUd0a1dpZGdldCAqdmJveDsN CiAJR3RrV2lkZ2V0ICpsYWJlbDsNCisJR3RrV2lkZ2V0ICpwcm9ncmVzczsNCiANCiAJdmJveCA9 IGNyZWF0ZV92Ym94KGFzc2lzdGFudCwgR1RLX0FTU0lTVEFOVF9QQUdFX0NPTlRFTlQsDQotCQkJ CV8oIkRldmljZSBwYWlyaW5nIiksDQotCQkJCV8oIlBhaXJpbmcgd2l0aCBuZXcgZGV2aWNlIikp Ow0KLQ0KLQlsYWJlbCA9IGd0a19sYWJlbF9uZXcoTlVMTCk7DQorCQkJCV8oIkRldmljZSBjb25u ZWN0aW9uIiksDQorCQkJCV8oIkNvbm5lY3Rpbmcgd2l0aCBuZXcgZGV2aWNlIikpOw0KIA0KLQln dGtfbWlzY19zZXRfYWxpZ25tZW50KEdUS19NSVNDKGxhYmVsKSwgMCwgMCk7DQorCXByb2dyZXNz ID0gZ3RrX3Byb2dyZXNzX2Jhcl9uZXcoKTsNCiANCi0JZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19C T1godmJveCksIGxhYmVsLCBGQUxTRSwgVFJVRSwgMCk7DQorCWd0a19ib3hfcGFja19zdGFydChH VEtfQk9YKHZib3gpLCBwcm9ncmVzcywgRkFMU0UsIFRSVUUsIDApOw0KIA0KLQlsYWJlbF9wYWly aW5nID0gbGFiZWw7DQorCXBhaXJpbmdfcHJvZ3Jlc3MgPSBwcm9ncmVzczsNCiANCiAJbGFiZWwg PSBndGtfbGFiZWxfbmV3KE5VTEwpOw0KKwlndGtfbGFiZWxfc2V0X2xpbmVfd3JhcChHVEtfTEFC RUwobGFiZWwpLCBUUlVFKTsNCisJZ3RrX2xhYmVsX3NldF9zZWxlY3RhYmxlKEdUS19MQUJFTChs YWJlbCksIFRSVUUpOw0KIA0KIAlndGtfbWlzY19zZXRfYWxpZ25tZW50KEdUS19NSVNDKGxhYmVs KSwgMCwgMCk7DQogDQogCWd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKHZib3gpLCBsYWJlbCwg RkFMU0UsIFRSVUUsIDApOw0KIA0KLQlsYWJlbF9wYXNza2V5ID0gbGFiZWw7DQorCXBhaXJpbmdf bWVzc2FnZSA9IGxhYmVsOw0KIA0KIAlwYWdlX3BhaXJpbmcgPSB2Ym94Ow0KIH0NCkBAIC0zODEs NiArNDE1LDggQEAgc3RhdGljIHZvaWQgY3JlYXRlX3N1bW1hcnkoR3RrV2lkZ2V0ICphcw0KIAkJ CQlfKCJTdW1tYXJ5IiksDQogCQkJCV8oIlN1Y2Nlc2Z1bGx5IGNvbmZpZ3VyZWQgbmV3IGRldmlj ZSIpKTsNCiANCisJcGFnZV9zdW1tYXJ5X251bSA9IGd0a19hc3Npc3RhbnRfZ2V0X25fcGFnZXMo R1RLX0FTU0lTVEFOVChhc3Npc3RhbnQpKSAtIDE7DQorDQogCXBhZ2Vfc3VtbWFyeSA9IHZib3g7 DQogfQ0KIA0KQEAgLTQwMSwxMyArNDM3LDEzIEBAIHN0YXRpYyBHdGtXaWRnZXQgKmNyZWF0ZV93 aXphcmQodm9pZCkNCiAJCQkJCQlwYWdlX2ZvcndhcmQsIE5VTEwsIE5VTEwpOw0KICNlbmRpZg0K IA0KLQljcmVhdGVfaW50cm8oYXNzaXN0YW50KTsNCisJLypjcmVhdGVfaW50cm8oYXNzaXN0YW50 KTsqLw0KIA0KIAljcmVhdGVfdHlwZShhc3Npc3RhbnQpOw0KIA0KIAljcmVhdGVfc2VhcmNoKGFz c2lzdGFudCk7DQogDQotCWNyZWF0ZV9pbmZvKGFzc2lzdGFudCk7DQorCS8qY3JlYXRlX2luZm8o YXNzaXN0YW50KTsqLw0KIA0KIAljcmVhdGVfcGFpcmluZyhhc3Npc3RhbnQpOw0KIA0KQEAgLTQ2 NSw2ICs1MDEsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0KIAljbGllbnQg PSBibHVldG9vdGhfY2xpZW50X25ldygpOw0KIA0KIAl3aW5kb3cgPSBjcmVhdGVfd2l6YXJkKCk7 DQorCXNldF9hZ2VudF9wYXJlbnRfd2luZG93KHdpbmRvdyk7DQogDQogCWJsdWV0b290aF9pbnN0 YW5jZV9zZXRfd2luZG93KGluc3RhbmNlLCBHVEtfV0lORE9XKHdpbmRvdykpOw0KIA0KZGlmZiAt cnVwTiBibHVlei1nbm9tZS0wLjI3Lm9yaWcvd2l6YXJkL01ha2VmaWxlLmFtIGJsdWV6LWdub21l LTAuMjcvd2l6YXJkL01ha2VmaWxlLmFtDQotLS0gYmx1ZXotZ25vbWUtMC4yNy5vcmlnL3dpemFy ZC9NYWtlZmlsZS5hbQkyMDA4LTA2LTI3IDE0OjEyOjQ5LjAwMDAwMDAwMCAtMDQwMA0KKysrIGJs dWV6LWdub21lLTAuMjcvd2l6YXJkL01ha2VmaWxlLmFtCTIwMDgtMDYtMjcgMTQ6MTM6MDUuMDAw MDAwMDAwIC0wNDAwDQpAQCAtMSw3ICsxLDcgQEANCiANCiBub2luc3RfUFJPR1JBTVMgPSBibHVl dG9vdGgtd2l6YXJkDQogDQotYmx1ZXRvb3RoX3dpemFyZF9TT1VSQ0VTID0gbWFpbi5jDQorYmx1 ZXRvb3RoX3dpemFyZF9TT1VSQ0VTID0gbWFpbi5jIGFnZW50LmMgYWdlbnQuaA0KIA0KIGJsdWV0 b290aF93aXphcmRfTERBREQgPSBAR1RLX0xJQlNAIEBEQlVTX0xJQlNAIFwNCiAJCSQodG9wX2J1 aWxkZGlyKS9jb21tb24vbGliY29tbW9uLmENCk== --=-22DnaLjCWJZjHATnjIc+-- --=-eyPjwTXXnJ4uIvCZunoY Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQBIZToV53i2YxNrdi0RAjLtAKDCsWtHeYE6uURsJhnZfJOZ4bLUdACfbnQq UiDb91If+69GgirfH5Bb+a4= =xWRT -----END PGP SIGNATURE----- --=-eyPjwTXXnJ4uIvCZunoY-- --===============0655028733== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php --===============0655028733== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Bluez-devel mailing list Bluez-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bluez-devel --===============0655028733==--