Received: from localhost (unknown [200.46.204.184]) by developer.postgresql.org (Postfix) with ESMTP id 6EEF62E004A for ; Wed, 30 Apr 2008 17:24:01 -0300 (ADT) Received: from developer.postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.184]) (amavisd-maia, port 10024) with ESMTP id 79281-03 for ; Wed, 30 Apr 2008 17:23:44 -0300 (ADT) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.5 Received: from fg-out-1718.google.com (fg-out-1718.google.com [72.14.220.152]) by developer.postgresql.org (Postfix) with ESMTP id E16372E004D for ; Wed, 30 Apr 2008 17:23:47 -0300 (ADT) Received: by fg-out-1718.google.com with SMTP id 16so274236fgg.23 for ; Wed, 30 Apr 2008 13:23:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:mime-version:content-type; bh=j2nDe48Vod2IWUBDnAo2khZLLRk5pJ3VDqIxGphF0jE=; b=piCPY7GoNLH6BMFARWnKgOn/vJjKSbgu9WFX7wEFanxY9DWzhIN/J685LHoyk4IoG4DeWukPmv+A4A4i3F1+ma/E+I3pa6g6qhlu/WhIAYXfonqCY4fSoB0zRjIr7kmIHecs22hhdiGx/cXBp4who+pl5/cZZAWJVFipiy9n720= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:cc:mime-version:content-type; b=uOY+wnWqEQgqfmoc7iFvOjZjDvVclioRvuezXgVK+A+UwqfBkgqpAloXftnLmX6Tx8kb+S6o3cto1oRReGRUdVgWGUJK83XoFpzF//ssX+JZ0WhopNQhFlLF4SubfgRdfpUxfPFyflPZVcTMJi065ZXmMqmIeucyuONWDCKSTJU= Received: by 10.82.170.2 with SMTP id s2mr179760bue.59.1209587025882; Wed, 30 Apr 2008 13:23:45 -0700 (PDT) Received: by 10.82.145.1 with HTTP; Wed, 30 Apr 2008 13:23:45 -0700 (PDT) Message-ID: Date: Wed, 30 Apr 2008 16:23:45 -0400 From: "Merlin Moncure" To: "Patches (PostgreSQL)" Subject: libpq object hooks Cc: "Andrew Chernow" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_2728_12329237.1209587025873" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200804/522 X-Sequence-Number: 6023 ------=_Part_2728_12329237.1209587025873 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Attached is an updated version of 'libpq object hooks'. The primary purpose for libpq object hooks is to support our libpqtypes system (not attached), but could possibly some nice sideband features to libpq. We are hoping to sneak this into the May commit fest. regards, merlin ------=_Part_2728_12329237.1209587025873 Content-Type: text/x-diff; name=objhooks.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_ffocrayu0 Content-Disposition: attachment; filename=objhooks.patch SW5kZXg6IGV4cG9ydHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNyb290 L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0LHYKcmV0cmlldmluZyByZXZp c2lvbiAxLjE5CmRpZmYgLUM2IC1yMS4xOSBleHBvcnRzLnR4dAoqKiogZXhwb3J0cy50eHQJMTkg TWFyIDIwMDggMDA6Mzk6MzMgLTAwMDAJMS4xOQotLS0gZXhwb3J0cy50eHQJMzAgQXByIDIwMDgg MjA6MDU6MjUgLTAwMDAKKioqKioqKioqKioqKioqCioqKiAxMzgsMTQzICoqKioKLS0tIDEzOCwx NTAgLS0tLQogIFBRc2VuZERlc2NyaWJlUG9ydGFsICAgICAgMTM2CiAgbG9fdHJ1bmNhdGUgICAg ICAgICAgICAgICAxMzcKICBQUWNvbm5lY3Rpb25Vc2VkUGFzc3dvcmQgIDEzOAogIHBnX3ZhbGlk X3NlcnZlcl9lbmNvZGluZ19pZCAxMzkKICBQUWNvbm5lY3Rpb25OZWVkc1Bhc3N3b3JkIDE0MAog IGxvX2ltcG9ydF93aXRoX29pZAkJICAxNDEKKyBQUWNvcHlSZXN1bHQgICAgICAgICAgICAgIDE0 MgorIFBRc2V0dmFsdWUgICAgICAgICAgICAgICAgMTQzCisgUFFyZXN1bHRBbGxvYyAgICAgICAg ICAgICAxNDQKKyBQUWFkZE9iamVjdEhvb2tzICAgICAgICAgIDE0NQorIFBRYWRkR2xvYmFsT2Jq ZWN0SG9va3MgICAgMTQ2CisgUFFob29rRGF0YSAgICAgICAgICAgICAgICAxNDcKKyBQUXJlc3Vs dEhvb2tEYXRhICAgICAgICAgIDE0OApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6 IGZlLWNvbm5lY3QuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3Nx bC9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9u IDEuMzU3CmRpZmYgLUM2IC1yMS4zNTcgZmUtY29ubmVjdC5jCioqKiBmZS1jb25uZWN0LmMJMzEg TWFyIDIwMDggMDI6NDM6MTQgLTAwMDAJMS4zNTcKLS0tIGZlLWNvbm5lY3QuYwkzMCBBcHIgMjAw OCAyMDowNToyNSAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDI0MSwyNTMgKioqKgogIAkJCQkg UFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlKTsKICBzdGF0aWMgY2hhciAqcHdkZk1hdGNoZXNTdHJp bmcoY2hhciAqYnVmLCBjaGFyICp0b2tlbik7CiAgc3RhdGljIGNoYXIgKlBhc3N3b3JkRnJvbUZp bGUoY2hhciAqaG9zdG5hbWUsIGNoYXIgKnBvcnQsIGNoYXIgKmRibmFtZSwKICAJCQkJIGNoYXIg KnVzZXJuYW1lKTsKICBzdGF0aWMgdm9pZCBkZWZhdWx0X3RocmVhZGxvY2soaW50IGFjcXVpcmUp OwogIAotIAogIC8qIGdsb2JhbCB2YXJpYWJsZSBiZWNhdXNlIGZlLWF1dGguYyBuZWVkcyB0byBh Y2Nlc3MgaXQgKi8KICBwZ3RocmVhZGxvY2tfdCBwZ19nX3RocmVhZGxvY2sgPSBkZWZhdWx0X3Ro cmVhZGxvY2s7CiAgCiAgCiAgLyoKICAgKgkJQ29ubmVjdGluZyB0byBhIERhdGFiYXNlCi0tLSAy NDEsMjUyIC0tLS0KKioqKioqKioqKioqKioqCioqKiA5NzksOTkwICoqKioKLS0tIDk3OCw5OTAg LS0tLQogICAqCSBvCUlmIHlvdXIgYmFja2VuZCB3YW50cyB0byB1c2UgS2VyYmVyb3MgYXV0aGVu dGljYXRpb24gdGhlbiB5b3UgbXVzdAogICAqCQlzdXBwbHkgYm90aCBhIGhvc3QgbmFtZSBhbmQg YSBob3N0IGFkZHJlc3MsIG90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uCiAgICoJCW1heSBibG9jayBv biBnZXRob3N0bmFtZS4KICAgKgogICAqIC0tLS0tLS0tLS0tLS0tLS0KICAgKi8KKyAKICBQb3N0 Z3Jlc1BvbGxpbmdTdGF0dXNUeXBlCiAgUFFjb25uZWN0UG9sbChQR2Nvbm4gKmNvbm4pCiAgewog IAlQR3Jlc3VsdCAgICpyZXM7CiAgCWNoYXIJCXNlYnVmWzI1Nl07CiAgCioqKioqKioqKioqKioq KgoqKiogOTk4LDEwMDkgKioqKgotLS0gOTk4LDEwMTAgLS0tLQogIAkJCSAqIFdlIHJlYWxseSBz aG91bGRuJ3QgaGF2ZSBiZWVuIHBvbGxlZCBpbiB0aGVzZSB0d28gY2FzZXMsIGJ1dCB3ZQogIAkJ CSAqIGNhbiBoYW5kbGUgaXQuCiAgCQkJICovCiAgCQljYXNlIENPTk5FQ1RJT05fQkFEOgogIAkJ CXJldHVybiBQR1JFU19QT0xMSU5HX0ZBSUxFRDsKICAJCWNhc2UgQ09OTkVDVElPTl9PSzoKKyAJ CQlwcUluaXRPYmplY3RIb29rcyhjb25uKTsKICAJCQlyZXR1cm4gUEdSRVNfUE9MTElOR19PSzsK ICAKICAJCQkvKiBUaGVzZSBhcmUgcmVhZGluZyBzdGF0ZXMgKi8KICAJCWNhc2UgQ09OTkVDVElP Tl9BV0FJVElOR19SRVNQT05TRToKICAJCWNhc2UgQ09OTkVDVElPTl9BVVRIX09LOgogIAkJCXsK KioqKioqKioqKioqKioqCioqKiAxODE2LDE4MjcgKioqKgotLS0gMTgxNywxODI5IC0tLS0KICAJ CQkJCWNvbm4tPm5leHRfZW8gPSBFbnZpcm9ubWVudE9wdGlvbnM7CiAgCQkJCQlyZXR1cm4gUEdS RVNfUE9MTElOR19XUklUSU5HOwogIAkJCQl9CiAgCiAgCQkJCS8qIE90aGVyd2lzZSwgd2UgYXJl IG9wZW4gZm9yIGJ1c2luZXNzISAqLwogIAkJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9OX09L OworIAkJCQlwcUluaXRPYmplY3RIb29rcyhjb25uKTsKICAJCQkJcmV0dXJuIFBHUkVTX1BPTExJ TkdfT0s7CiAgCQkJfQogIAogIAkJY2FzZSBDT05ORUNUSU9OX1NFVEVOVjoKICAKICAJCQkvKgoq KioqKioqKioqKioqKioKKioqIDE4NDgsMTg1OSAqKioqCi0tLSAxODUwLDE4NjIgLS0tLQogIAkJ CQlkZWZhdWx0OgogIAkJCQkJZ290byBlcnJvcl9yZXR1cm47CiAgCQkJfQogIAogIAkJCS8qIFdl IGFyZSBvcGVuIGZvciBidXNpbmVzcyEgKi8KICAJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9O X09LOworIAkJCXBxSW5pdE9iamVjdEhvb2tzKGNvbm4pOwogIAkJCXJldHVybiBQR1JFU19QT0xM SU5HX09LOwogIAogIAkJZGVmYXVsdDoKICAJCQlwcmludGZQUUV4cEJ1ZmZlcigmY29ubi0+ZXJy b3JNZXNzYWdlLAogIAkJCQkJCQkgIGxpYnBxX2dldHRleHQoCiAgCQkJCQkJCQkJCQkiaW52YWxp ZCBjb25uZWN0aW9uIHN0YXRlICVjLCAiCioqKioqKioqKioqKioqKgoqKiogMTg3NSwxODg3ICoq KioKICAJICogdGhlIGNvbm5lY3Rpb24gc3RydWN0dXJlIG11c3QgYmUgZnJlZWQpLgogIAkgKi8K ICAJY29ubi0+c3RhdHVzID0gQ09OTkVDVElPTl9CQUQ7CiAgCXJldHVybiBQR1JFU19QT0xMSU5H X0ZBSUxFRDsKICB9CiAgCi0gCiAgLyoKICAgKiBtYWtlRW1wdHlQR2Nvbm4KICAgKgkgLSBjcmVh dGUgYSBQR2Nvbm4gZGF0YSBzdHJ1Y3R1cmUgd2l0aCAoYXMgeWV0KSBubyBpbnRlcmVzdGluZyBk YXRhCiAgICovCiAgc3RhdGljIFBHY29ubiAqCiAgbWFrZUVtcHR5UEdjb25uKHZvaWQpCi0tLSAx ODc4LDE4ODkgLS0tLQoqKioqKioqKioqKioqKioKKioqIDE5NzAsMTk4MSAqKioqCi0tLSAxOTcy LDIwMDEgLS0tLQogICAqIHJlbGVhc2UgZGF0YSB0aGF0IGlzIHRvIGJlIGhlbGQgZm9yIHRoZSBs aWZlIG9mIHRoZSBQR2Nvbm4gc3RydWN0dXJlLgogICAqIElmIGEgdmFsdWUgb3VnaHQgdG8gYmUg Y2xlYXJlZC9mcmVlZCBkdXJpbmcgUFFyZXNldCgpLCBkbyBpdCB0aGVyZSBub3QgaGVyZS4KICAg Ki8KICBzdGF0aWMgdm9pZAogIGZyZWVQR2Nvbm4oUEdjb25uICpjb25uKQogIHsKKyAJaW50IGk7 CisgCisgCWZvcihpPTA7IGkgPCBjb25uLT5vYmpIb29rc0NvdW50OyBpKyspCisgCXsKKyAJCWlm KGNvbm4tPm9iakhvb2tzW2ldLmNvbm5EZXN0cm95KQorIAkJeworIAkJCWNvbm4tPm9iakhvb2tz W2ldLmNvbm5EZXN0cm95KChjb25zdCBQR2Nvbm4gKiljb25uKTsKKyAJCQlmcmVlKGNvbm4tPm9i akhvb2tzW2ldLm5hbWUpOworIAkJfQorIAl9CisgCisgCWlmKGNvbm4tPm9iakhvb2tzKQorIAl7 CisgCQlmcmVlKGNvbm4tPm9iakhvb2tzKTsKKyAJCWNvbm4tPm9iakhvb2tzID0gTlVMTDsKKyAJ CWNvbm4tPm9iakhvb2tzQ291bnQgPSBjb25uLT5vYmpIb29rc1NpemUgPSAwOworIAl9CisgCiAg CWlmIChjb25uLT5wZ2hvc3QpCiAgCQlmcmVlKGNvbm4tPnBnaG9zdCk7CiAgCWlmIChjb25uLT5w Z2hvc3RhZGRyKQogIAkJZnJlZShjb25uLT5wZ2hvc3RhZGRyKTsKICAJaWYgKGNvbm4tPnBncG9y dCkKICAJCWZyZWUoY29ubi0+cGdwb3J0KTsKKioqKioqKioqKioqKioqCioqKiAyMTUxLDIxNjQg KioqKgogIFBRcmVzZXQoUEdjb25uICpjb25uKQogIHsKICAJaWYgKGNvbm4pCiAgCXsKICAJCWNs b3NlUEdjb25uKGNvbm4pOwogIAohIAkJaWYgKGNvbm5lY3REQlN0YXJ0KGNvbm4pKQohIAkJCSh2 b2lkKSBjb25uZWN0REJDb21wbGV0ZShjb25uKTsKICAJfQogIH0KICAKICAKICAvKgogICAqIFBR cmVzZXRTdGFydDoKLS0tIDIxNzEsMjE4OSAtLS0tCiAgUFFyZXNldChQR2Nvbm4gKmNvbm4pCiAg ewogIAlpZiAoY29ubikKICAJewogIAkJY2xvc2VQR2Nvbm4oY29ubik7CiAgCiEgCQlpZiAoY29u bmVjdERCU3RhcnQoY29ubikgJiYgY29ubmVjdERCQ29tcGxldGUoY29ubikpCiEgCQl7CiEgCQkJ aW50IGk7CiEgCQkJZm9yKGk9MDsgaSA8IGNvbm4tPm9iakhvb2tzQ291bnQ7IGkrKykKISAJCQkJ aWYoY29ubi0+b2JqSG9va3NbaV0uY29ublJlc2V0KQohIAkJCQkJY29ubi0+b2JqSG9va3NbaV0u Y29ublJlc2V0KChjb25zdCBQR2Nvbm4gKiljb25uKTsKISAJCX0KICAJfQogIH0KICAKICAKICAv KgogICAqIFBRcmVzZXRTdGFydDoKKioqKioqKioqKioqKioqCioqKiAyMTc2LDIxOTggKioqKgog IAkJcmV0dXJuIGNvbm5lY3REQlN0YXJ0KGNvbm4pOwogIAl9CiAgCiAgCXJldHVybiAwOwogIH0K ICAKLSAKICAvKgogICAqIFBRcmVzZXRQb2xsOgogICAqIHJlc2V0cyB0aGUgY29ubmVjdGlvbiB0 byB0aGUgYmFja2VuZAogICAqIGNsb3NlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBhbmQgbWFr ZXMgYSBuZXcgb25lCiAgICovCiAgUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZQogIFBRcmVzZXRQ b2xsKFBHY29ubiAqY29ubikKICB7CiAgCWlmIChjb25uKQohIAkJcmV0dXJuIFBRY29ubmVjdFBv bGwoY29ubik7CiAgCiAgCXJldHVybiBQR1JFU19QT0xMSU5HX0ZBSUxFRDsKICB9CiAgCiAgLyoK ICAgKiBQUWNhbmNlbEdldDogZ2V0IGEgUEdjYW5jZWwgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcg dG8gYSBjb25uZWN0aW9uLgotLS0gMjIwMSwyMjM0IC0tLS0KICAJCXJldHVybiBjb25uZWN0REJT dGFydChjb25uKTsKICAJfQogIAogIAlyZXR1cm4gMDsKICB9CiAgCiAgLyoKICAgKiBQUXJlc2V0 UG9sbDoKICAgKiByZXNldHMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGJhY2tlbmQKICAgKiBjbG9z ZXMgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gYW5kIG1ha2VzIGEgbmV3IG9uZQogICAqLwogIFBv c3RncmVzUG9sbGluZ1N0YXR1c1R5cGUKICBQUXJlc2V0UG9sbChQR2Nvbm4gKmNvbm4pCiAgewog IAlpZiAoY29ubikKISAJewohIAkJUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZSBzdGF0dXMgPSBQ UWNvbm5lY3RQb2xsKGNvbm4pOwohIAohIAkJaWYoc3RhdHVzID09IFBHUkVTX1BPTExJTkdfT0sp CiEgCQl7CiEgCQkJaW50IGk7CiEgCQkJZm9yKGk9MDsgaSA8IGNvbm4tPm9iakhvb2tzQ291bnQ7 IGkrKykKISAJCQkJaWYoY29ubi0+b2JqSG9va3NbaV0uY29ublJlc2V0KQohIAkJCQkJY29ubi0+ b2JqSG9va3NbaV0uY29ublJlc2V0KChjb25zdCBQR2Nvbm4gKiljb25uKTsKISAJCX0KISAKISAJ CXJldHVybiBzdGF0dXM7CiEgCX0KICAKICAJcmV0dXJuIFBHUkVTX1BPTExJTkdfRkFJTEVEOwog IH0KICAKICAvKgogICAqIFBRY2FuY2VsR2V0OiBnZXQgYSBQR2NhbmNlbCBzdHJ1Y3R1cmUgY29y cmVzcG9uZGluZyB0byBhIGNvbm5lY3Rpb24uCioqKioqKioqKioqKioqKgoqKiogMzg1NSwzODYw ICoqKioKLS0tIDM4OTEsMzg5NyAtLS0tCiAgCQlwZ19nX3RocmVhZGxvY2sgPSBuZXdoYW5kbGVy OwogIAllbHNlCiAgCQlwZ19nX3RocmVhZGxvY2sgPSBkZWZhdWx0X3RocmVhZGxvY2s7CiAgCiAg CXJldHVybiBwcmV2OwogIH0KKyAKSW5kZXg6IGZlLWV4ZWMuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxl OiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1leGVjLmMs dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTk0CmRpZmYgLUM2IC1yMS4xOTQgZmUtZXhlYy5jCioq KiBmZS1leGVjLmMJMSBKYW4gMjAwOCAxOTo0NjowMCAtMDAwMAkxLjE5NAotLS0gZmUtZXhlYy5j CTMwIEFwciAyMDA4IDIwOjA1OjI2IC0wMDAwCioqKioqKioqKioqKioqKgoqKiogNjAsNzIgKioq KgogIAkJCQlpbnQgcmVzdWx0Rm9ybWF0KTsKICBzdGF0aWMgdm9pZCBwYXJzZUlucHV0KFBHY29u biAqY29ubik7CiAgc3RhdGljIGJvb2wgUFFleGVjU3RhcnQoUEdjb25uICpjb25uKTsKICBzdGF0 aWMgUEdyZXN1bHQgKlBRZXhlY0ZpbmlzaChQR2Nvbm4gKmNvbm4pOwogIHN0YXRpYyBpbnQgUFFz ZW5kRGVzY3JpYmUoUEdjb25uICpjb25uLCBjaGFyIGRlc2NfdHlwZSwKICAJCQkgICBjb25zdCBj aGFyICpkZXNjX3RhcmdldCk7CiEgCiAgCiAgLyogLS0tLS0tLS0tLS0tLS0tLQogICAqIFNwYWNl IG1hbmFnZW1lbnQgZm9yIFBHcmVzdWx0LgogICAqCiAgICogRm9ybWVybHksIGxpYnBxIGRpZCBh IHNlcGFyYXRlIG1hbGxvYygpIGZvciBlYWNoIGZpZWxkIG9mIGVhY2ggdHVwbGUKICAgKiByZXR1 cm5lZCBieSBhIHF1ZXJ5LiAgVGhpcyB3YXMgcmVtYXJrYWJseSBleHBlbnNpdmUgLS0tIG1hbGxv Yy9mcmVlCi0tLSA2MCw3MiAtLS0tCiAgCQkJCWludCByZXN1bHRGb3JtYXQpOwogIHN0YXRpYyB2 b2lkIHBhcnNlSW5wdXQoUEdjb25uICpjb25uKTsKICBzdGF0aWMgYm9vbCBQUWV4ZWNTdGFydChQ R2Nvbm4gKmNvbm4pOwogIHN0YXRpYyBQR3Jlc3VsdCAqUFFleGVjRmluaXNoKFBHY29ubiAqY29u bik7CiAgc3RhdGljIGludCBQUXNlbmREZXNjcmliZShQR2Nvbm4gKmNvbm4sIGNoYXIgZGVzY190 eXBlLAogIAkJCSAgIGNvbnN0IGNoYXIgKmRlc2NfdGFyZ2V0KTsKISBzdGF0aWMgaW50IGNoZWNr X2ZpZWxkX251bWJlcihjb25zdCBQR3Jlc3VsdCAqcmVzLCBpbnQgZmllbGRfbnVtKTsKICAKICAv KiAtLS0tLS0tLS0tLS0tLS0tCiAgICogU3BhY2UgbWFuYWdlbWVudCBmb3IgUEdyZXN1bHQuCiAg ICoKICAgKiBGb3JtZXJseSwgbGlicHEgZGlkIGEgc2VwYXJhdGUgbWFsbG9jKCkgZm9yIGVhY2gg ZmllbGQgb2YgZWFjaCB0dXBsZQogICAqIHJldHVybmVkIGJ5IGEgcXVlcnkuICBUaGlzIHdhcyBy ZW1hcmthYmx5IGV4cGVuc2l2ZSAtLS0gbWFsbG9jL2ZyZWUKKioqKioqKioqKioqKioqCioqKiAx MjEsMTQxICoqKioKLS0tIDEyMSwxNzAgLS0tLQogICNkZWZpbmUgUEdSRVNVTFRfREFUQV9CTE9D S1NJWkUJCTIwNDgKICAjZGVmaW5lIFBHUkVTVUxUX0FMSUdOX0JPVU5EQVJZCQlNQVhJTVVNX0FM SUdOT0YJCS8qIGZyb20gY29uZmlndXJlICovCiAgI2RlZmluZSBQR1JFU1VMVF9CTE9DS19PVkVS SEVBRAkJTWF4KHNpemVvZihQR3Jlc3VsdF9kYXRhKSwgUEdSRVNVTFRfQUxJR05fQk9VTkRBUlkp CiAgI2RlZmluZSBQR1JFU1VMVF9TRVBfQUxMT0NfVEhSRVNIT0xECShQR1JFU1VMVF9EQVRBX0JM T0NLU0laRSAvIDIpCiAgCiAgCisgLyogRG9lcyBub3QgZHVwbGljYXRlIHRoZSBob29rIGRhdGEs IHNldHMgdGhpcyB0byBOVUxMICovCisgc3RhdGljIFBHb2JqZWN0SG9va3MgKgorIGR1cE9iamVj dEhvb2tzKFBHb2JqZWN0SG9va3MgKmhvb2tzLCBpbnQgY291bnQpCisgeworIAlpbnQgaTsKKyAJ UEdvYmplY3RIb29rcyAqbmV3SG9va3M7CisgCisgCWlmKCFob29rcyB8fCBjb3VudCA8PSAwKQor IAkJcmV0dXJuIE5VTEw7CisgCisgCW5ld0hvb2tzID0gKFBHb2JqZWN0SG9va3MgKiltYWxsb2Mo Y291bnQgKiBzaXplb2YoUEdvYmplY3RIb29rcykpOworIAlpZighbmV3SG9va3MpCisgCQlyZXR1 cm4gTlVMTDsKKyAKKyAJbWVtY3B5KG5ld0hvb2tzLCBob29rcywgY291bnQgKiBzaXplb2YoUEdv YmplY3RIb29rcykpOworIAorIAkvKiBOVUxMIG91dCB0aGUgaG9vayBkYXRhIHBvaW50ZXIgKi8K KyAJZm9yKGk9MDsgaSA8IGNvdW50OyBpKyspCisgCXsKKyAJCW5ld0hvb2tzW2ldLmRhdGEgPSBO VUxMOworIAkJbmV3SG9va3NbaV0ubmFtZSA9IHN0cmR1cChob29rc1tpXS5uYW1lKTsKKyAJfQor IAorIAlyZXR1cm4gbmV3SG9va3M7CisgfQorIAogIC8qCiAgICogUFFtYWtlRW1wdHlQR3Jlc3Vs dAogICAqCSByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkLCBpbml0aWFsaXplZCBQR3Jlc3VsdCB3 aXRoIGdpdmVuIHN0YXR1cy4KICAgKgkgSWYgY29ubiBpcyBub3QgTlVMTCBhbmQgc3RhdHVzIGlu ZGljYXRlcyBhbiBlcnJvciwgdGhlIGNvbm4ncwogICAqCSBlcnJvck1lc3NhZ2UgaXMgY29waWVk LgogICAqCiAgICogTm90ZSB0aGlzIGlzIGV4cG9ydGVkIC0tLSB5b3Ugd291bGRuJ3QgdGhpbmsg YW4gYXBwbGljYXRpb24gd291bGQgbmVlZAogICAqIHRvIGJ1aWxkIGl0cyBvd24gUEdyZXN1bHRz LCBidXQgdGhpcyBoYXMgcHJvdmVuIHVzZWZ1bCBpbiBib3RoIGxpYnBndGNsCiAgICogYW5kIHRo ZSBQZXJsNSBpbnRlcmZhY2UsIHNvIG1heWJlIGl0J3Mgbm90IHNvIHVucmVhc29uYWJsZS4KKyAg KgorICAqIFVwZGF0ZWQgQXByaWwgMjAwOCAtIElmIGNvbm4gaXMgbm90IE5VTEwsIE9iamVjdEhv b2tzIHdpbGwgYmUgY29waWVkCisgICogZnJvbSB0aGUgUEdjb25uIHRvIHRoZSBjcmVhdGVkIFBH cmVzdWx0LgogICAqLwogIAogIFBHcmVzdWx0ICoKICBQUW1ha2VFbXB0eVBHcmVzdWx0KFBHY29u biAqY29ubiwgRXhlY1N0YXR1c1R5cGUgc3RhdHVzKQogIHsKICAJUEdyZXN1bHQgICAqcmVzdWx0 OwoqKioqKioqKioqKioqKioKKioqIDE1NywxNzUgKioqKgotLS0gMTg2LDIxOSAtLS0tCiAgCXJl c3VsdC0+ZXJyTXNnID0gTlVMTDsKICAJcmVzdWx0LT5lcnJGaWVsZHMgPSBOVUxMOwogIAlyZXN1 bHQtPm51bGxfZmllbGRbMF0gPSAnXDAnOwogIAlyZXN1bHQtPmN1ckJsb2NrID0gTlVMTDsKICAJ cmVzdWx0LT5jdXJPZmZzZXQgPSAwOwogIAlyZXN1bHQtPnNwYWNlTGVmdCA9IDA7CisgCXJlc3Vs dC0+b2JqSG9va3NDb3VudCA9IDA7CisgCXJlc3VsdC0+b2JqSG9va3MgPSBOVUxMOwogIAogIAlp ZiAoY29ubikKICAJewogIAkJLyogY29weSBjb25uZWN0aW9uIGRhdGEgd2UgbWlnaHQgbmVlZCBm b3Igb3BlcmF0aW9ucyBvbiBQR3Jlc3VsdCAqLwogIAkJcmVzdWx0LT5ub3RpY2VIb29rcyA9IGNv bm4tPm5vdGljZUhvb2tzOwogIAkJcmVzdWx0LT5jbGllbnRfZW5jb2RpbmcgPSBjb25uLT5jbGll bnRfZW5jb2Rpbmc7CiAgCisgCQkvKiBjb3B5IG9iamVjdCBob29rcyBmcm9tIGNvbm5lY3Rpb24g Ki8KKyAJCWlmKGNvbm4tPm9iakhvb2tzQ291bnQgPiAwKQorIAkJeworIAkJCXJlc3VsdC0+b2Jq SG9va3MgPSBkdXBPYmplY3RIb29rcyhjb25uLT5vYmpIb29rcywgY29ubi0+b2JqSG9va3NDb3Vu dCk7CisgCQkJaWYoIXJlc3VsdC0+b2JqSG9va3MpCisgCQkJeworIAkJCQlQUWNsZWFyKHJlc3Vs dCk7CisgCQkJCXJldHVybiBOVUxMOworIAkJCX0KKyAKKyAJCQlyZXN1bHQtPm9iakhvb2tzQ291 bnQgPSBjb25uLT5vYmpIb29rc0NvdW50OworIAkJfQorIAogIAkJLyogY29uc2lkZXIgY29weWlu ZyBjb25uJ3MgZXJyb3JNZXNzYWdlICovCiAgCQlzd2l0Y2ggKHN0YXR1cykKICAJCXsKICAJCQlj YXNlIFBHUkVTX0VNUFRZX1FVRVJZOgogIAkJCWNhc2UgUEdSRVNfQ09NTUFORF9PSzoKICAJCQlj YXNlIFBHUkVTX1RVUExFU19PSzoKKioqKioqKioqKioqKioqCioqKiAxOTMsMjA0ICoqKioKLS0t IDIzNyw0NzYgLS0tLQogIAl9CiAgCiAgCXJldHVybiByZXN1bHQ7CiAgfQogIAogIC8qCisgICog UFFjb3B5UmVzdWx0CisgICogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgcHJvdmlkZWQgJ3Ny YycgUEdyZXN1bHQsIHdoaWNoIGNhbm5vdCBiZSBOVUxMLgorICAqIFRoZSAnb3B0aW9ucycgYXJn dW1lbnQgY29udHJvbHMgd2hpY2ggcG9ydGlvbnMgb2YgdGhlIHJlc3VsdCB3aWxsIG9yIHdpbGwK KyAgKiBOT1QgYmUgY29waWVkLiAgSWYgdGhpcyB2YWx1ZSBpcyAwLCB0aGUgZW50aXJlIHJlc3Vs dCBpcyBkZWVwIGNvcGllZC4KKyAgKiBUaGUgY3JlYXRlZCByZXN1bHQgaXMgYWx3YXlzIHB1dCBp bnRvIHRoZSBQR1JFU19UVVBMRVNfT0sgc3RhdHVzLiAgVGhlCisgICogc291cmNlIHJlc3VsdCBl cnJvciBtZXNzYWdlIGlzIG5vdCBjb3BpZWQsIGFsdGhvdWdoIGNtZFN0YXR1cyBpcy4KKyAgKgor ICAqIE9wdGlvbnM6CisgICogICBQR19DT1BZUkVTX05PX1RVUExFUyAtIERvIG5vdCBjb3B5IHRo ZSB0dXBsZXMuICBUaGlzIG9wdGlvbiBpcworICAqICAgYXV0b21hdGljYWxseSBlbmFibGVkIHdo ZW4gUEdfQ09QWVJFU19VU0VfQVRUUlMgaXMgc2V0LgorICAqCisgICogICBQR19DT1BZUkVTX1VT RV9BVFRSUyAtIEluZGljYXRlcyB0aGF0IHRoZSAnbnVtQXR0cmlidXRlcycgYW5kICdhdHREZXNj cycKKyAgKiAgIGFyZ3VtZW50cyBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZmllbGRzIGZvciB0aGUg Y3JlYXRlZCByZXN1bHQsIHJhdGhlcgorICAqICAgdGhhbiBjb3B5aW5nIHRoZW0gZnJvbSB0aGUg c291cmNlIHJlc3VsdC4gIFdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LAorICAqICAgdGhlIHR1cGxl cyB3aWxsIE5PVCBiZSBjb3BpZWQ7IGJlaGF2aW5nIGlkZW50aWNhbGx5IHRvIHNldHRpbmcgdGhl CisgICogICBQR19DT1BZUkVTX05PX1RVUExFUyBvcHRpb24uICBPbmUgbXVzdCB1c2UgUFFzZXR2 YWx1ZSB0byBtYW51YWxseQorICAqICAgYWRkIHR1cGxlcyB0byB0aGUgcmV0dXJuZWQgcmVzdWx0 LiAgTk9URTogbnVtQXR0cmlidXRlcyBhbmQgYXR0RGVzY3MKKyAgKiAgIGFyZ3VtZW50cyBhcmUg aWdub3JlZCB1bmxlc3MgdGhpcyBvcHRpb24gaXMgc2V0IQorICAqCisgICogICBQR19DT1BZUkVT X05PX09CSkVDVEhPT0tTIC0gSW5kaWNhdGVzIHRoYXQgdGhlIHNvdXJjZSByZXN1bHQncworICAq ICAgT2JqZWN0SG9va3Mgc2hvdWxkIE5PVCBiZSBjb3BpZWQgdG8gdGhlIGNyZWF0ZWQgcmVzdWx0 LgorICAqCisgICogICBQR19DT1BZUkVTX05PX05PVElDRUhPT0tTIC0gSW5kaWNhdGVzIHRoYXQg dGhlIHNvdXJjZSByZXN1bHQncworICAqICAgTm90aWNlSG9va3Mgc2hvdWxkIE5PVCBiZSBjb3Bp ZWQgdG8gdGhlIGNyZWF0ZWQgcmVzdWx0LgorICAqLworIAorIFBHcmVzdWx0ICoKKyBQUWNvcHlS ZXN1bHQoY29uc3QgUEdyZXN1bHQgKnNyYywgaW50IG51bUF0dHJpYnV0ZXMsCisgCVBHcmVzQXR0 RGVzYyAqYXR0RGVzY3MsIGludCBvcHRpb25zKQorIHsKKyAJaW50IGk7CisgCVBHcmVzdWx0ICpk ZXN0OworIAorIAlpZighc3JjKQorIAkJcmV0dXJuIE5VTEw7CisgCisgCS8qIEF1dG9tYXRpY2Fs bHkgdHVybiBvbiBub190dXBsZXMgc2luY2UgdXNlX2F0dHJzIGlzIHNldC4gIEl0IG1ha2VzCisg CSAqIG5vIHNlbnNlIHRvIGNvcHkgdHVwbGVzIGludG8gYW4gdW5rbm93biBzZXQgb2YgY29sdW1u cy4KKyAJICovCisgCWlmKG9wdGlvbnMgJiBQR19DT1BZUkVTX1VTRV9BVFRSUykKKyAJCW9wdGlv bnMgfD0gUEdfQ09QWVJFU19OT19UVVBMRVM7CisgCisgCS8qIElmIHVzZV9hdHRycyBpcyBzZXQs IHZlcmlmeSBhdHRyIGFyZ3VtZW50cy4gKi8KKyAJaWYoKG9wdGlvbnMgJiBQR19DT1BZUkVTX1VT RV9BVFRSUykgJiYgKG51bUF0dHJpYnV0ZXMgPD0gMCB8fCAhYXR0RGVzY3MpKQorIAkJcmV0dXJu IE5VTEw7CisgCisgCWRlc3QgPSBQUW1ha2VFbXB0eVBHcmVzdWx0KChQR2Nvbm4gKilOVUxMLCBQ R1JFU19UVVBMRVNfT0spOworIAlpZighZGVzdCkKKyAJCXJldHVybiBOVUxMOworIAorIAkvKiBh bHdheXMgY29weSB0aGVzZSBvdmVyLiAgSXMgY21kU3RhdHVzIHVzZWZ1bCBoZXJlPyAqLworIAlk ZXN0LT5jbGllbnRfZW5jb2RpbmcgPSBzcmMtPmNsaWVudF9lbmNvZGluZzsKKyAJc3RyY3B5KGRl c3QtPmNtZFN0YXR1cywgc3JjLT5jbWRTdGF0dXMpOworIAorIAkvKiBXYW50cyB0byBjb3B5IG5v dGljZSBob29rcyAqLworIAlpZighKG9wdGlvbnMgJiBQR19DT1BZUkVTX05PX05PVElDRUhPT0tT KSkKKyAJCWRlc3QtPm5vdGljZUhvb2tzID0gc3JjLT5ub3RpY2VIb29rczsKKyAKKyAJLyogQ29w eSBmcm9tIHNyYyByZXN1bHQgd2hlbiBub3Qgc3VwcGx5aW5nIGF0dHJzICovCisgCWlmKCEob3B0 aW9ucyAmIFBHX0NPUFlSRVNfVVNFX0FUVFJTKSAmJiBzcmMtPm51bUF0dHJpYnV0ZXMgPiAwKQor IAl7CisgCQludW1BdHRyaWJ1dGVzID0gc3JjLT5udW1BdHRyaWJ1dGVzOworIAkJYXR0RGVzY3Mg PSBzcmMtPmF0dERlc2NzOworIAl9CisgCisgCS8qIGNvcHkgYXR0cnMgKi8KKyAJaWYobnVtQXR0 cmlidXRlcyA+IDApCisgCXsKKyAJCWRlc3QtPmF0dERlc2NzID0gKFBHcmVzQXR0RGVzYyAqKVBR cmVzdWx0QWxsb2MoZGVzdCwKKyAJCQludW1BdHRyaWJ1dGVzICogc2l6ZW9mKFBHcmVzQXR0RGVz YykpOworIAorIAkJaWYoIWRlc3QtPmF0dERlc2NzKQorIAkJeworIAkJCVBRY2xlYXIoZGVzdCk7 CisgCQkJcmV0dXJuIE5VTEw7CisgCQl9CisgCisgCQlkZXN0LT5udW1BdHRyaWJ1dGVzID0gbnVt QXR0cmlidXRlczsKKyAJCW1lbWNweShkZXN0LT5hdHREZXNjcywgYXR0RGVzY3MsIG51bUF0dHJp YnV0ZXMgKiBzaXplb2YoUEdyZXNBdHREZXNjKSk7CisgCisgCQkvKiByZXN1bHRhbGxvYyB0aGUg YXR0cmlidXRlIG5hbWVzLiAgVGhlIGFib3ZlIG1lbWNweSBoYXMgdGhlIGF0dHIKKyAJCSAqIG5h bWVzIHBvaW50aW5nIGF0IHRoZSBzb3VyY2UgcmVzdWx0J3MgcHJpdmF0ZSBtZW1vcnkgKG9yIGF0 IHRoZQorIAkJICogY2FsbGVycyBwcm92aWRlZCBhdHREZXNjcyBtZW1vcnkpLgorIAkJICovCisg CQlkZXN0LT5iaW5hcnkgPSAxOworIAkJZm9yKGk9MDsgaSA8IG51bUF0dHJpYnV0ZXM7IGkrKykK KyAJCXsKKyAJCQlpZihhdHREZXNjc1tpXS5uYW1lKQorIAkJCQlkZXN0LT5hdHREZXNjc1tpXS5u YW1lID0gcHFSZXN1bHRTdHJkdXAoZGVzdCwgYXR0RGVzY3NbaV0ubmFtZSk7CisgCQkJZWxzZQor IAkJCQlkZXN0LT5hdHREZXNjc1tpXS5uYW1lID0gZGVzdC0+bnVsbF9maWVsZDsKKyAKKyAJCQlp ZighZGVzdC0+YXR0RGVzY3NbaV0ubmFtZSkKKyAJCQl7CisgCQkJCVBRY2xlYXIoZGVzdCk7Cisg CQkJCXJldHVybiBOVUxMOworIAkJCX0KKyAKKyAJCQkvKiBBbHRob3VnaCBkZXByZWNhdGVkLCBi ZWNhdXNlIHJlc3VsdHMgY2FuIGhhdmUgdGV4dCtiaW5hcnkgY29sdW1ucywKKyAJCQkgKiBpdHMg ZWFzeSBlbm91Z2ggdG8gZGVkdWNlIHNvIHNldCBpdCBmb3IgY29tcGxldGVuZXNzLgorIAkJCSAq LworIAkJCWlmKGRlc3QtPmF0dERlc2NzW2ldLmZvcm1hdCA9PSAwKQorIAkJCQlkZXN0LT5iaW5h cnkgPSAwOworIAkJfQorIAl9CisgCisgCS8qIFdhbnRzIHRvIGNvcHkgcmVzdWx0IHR1cGxlczog dXNlIFBRc2V0dmFsdWUoKS4gKi8KKyAJaWYoIShvcHRpb25zICYgUEdfQ09QWVJFU19OT19UVVBM RVMpICYmIHNyYy0+bnR1cHMgPiAwKQorIAl7CisgCQlpbnQgdHVwLCBmaWVsZDsKKyAJCWZvcih0 dXA9MDsgdHVwIDwgc3JjLT5udHVwczsgdHVwKyspCisgCQkJZm9yKGZpZWxkPTA7IGZpZWxkIDwg c3JjLT5udW1BdHRyaWJ1dGVzOyBmaWVsZCsrKQorIAkJCQlQUXNldHZhbHVlKGRlc3QsIHR1cCwg ZmllbGQsIHNyYy0+dHVwbGVzW3R1cF1bZmllbGRdLnZhbHVlLAorIAkJCQkJc3JjLT50dXBsZXNb dHVwXVtmaWVsZF0ubGVuKTsKKyAJfQorIAorIAkvKiBXYW50cyB0byBjb3B5IG9iakhvb2tzLiAq LworIAlpZighKG9wdGlvbnMgJiBQR19DT1BZUkVTX05PX09CSkVDVEhPT0tTKSAmJiBzcmMtPm9i akhvb2tzQ291bnQgPiAwKQorIAl7CisgCQlkZXN0LT5vYmpIb29rcyA9IGR1cE9iamVjdEhvb2tz KHNyYy0+b2JqSG9va3MsIHNyYy0+b2JqSG9va3NDb3VudCk7CisgCQlpZighZGVzdC0+b2JqSG9v a3MpCisgCQl7CisgCQkJUFFjbGVhcihkZXN0KTsKKyAJCQlyZXR1cm4gTlVMTDsKKyAJCX0KKyAK KyAJCWRlc3QtPm9iakhvb2tzQ291bnQgPSBzcmMtPm9iakhvb2tzQ291bnQ7CisgCX0KKyAKKyAJ LyogSW52b2tlIHJlc3VsdENvcHkgZm9yIGVhY2ggT2JqZWN0IEhvb2sgKi8KKyAJZm9yKGk9MDsg aSA8IGRlc3QtPm9iakhvb2tzQ291bnQ7IGkrKykKKyAJCWlmKGRlc3QtPm9iakhvb2tzW2ldLnJl c3VsdENvcHkpCisgCQkJZGVzdC0+b2JqSG9va3NbaV0uZGF0YSA9IGRlc3QtPm9iakhvb2tzW2ld LnJlc3VsdENvcHkoZGVzdCwgc3JjKTsKKyAKKyAJcmV0dXJuIGRlc3Q7CisgfQorIAorIGludAor IFBRc2V0dmFsdWUoUEdyZXN1bHQgKnJlcywgaW50IHR1cF9udW0sIGludCBmaWVsZF9udW0sCisg CWNoYXIgKnZhbHVlLCBpbnQgbGVuKQorIHsKKyAJUEdyZXNBdHRWYWx1ZSAqYXR0dmFsOworIAor IAlpZighY2hlY2tfZmllbGRfbnVtYmVyKHJlcywgZmllbGRfbnVtKSkKKyAJCXJldHVybiBGQUxT RTsKKyAKKyAJLyogSW52YWxpZCB0dXBfbnVtLCBtdXN0IGJlIDw9IG50dXBzICovCisgCWlmKHR1 cF9udW0gPiByZXMtPm50dXBzKQorIAkJcmV0dXJuIEZBTFNFOworIAorIAkvKiBuZWVkIHRvIGdy b3cgdGhlIHR1cGxlIHRhYmxlICovCisgCWlmKHJlcy0+bnR1cHMgPj0gcmVzLT50dXBBcnJTaXpl KQorIAl7CisgCQlpbnQgbiA9IHJlcy0+dHVwQXJyU2l6ZSA/IChyZXMtPnR1cEFyclNpemUqMykv MiA6IDY0OworIAkJUEdyZXNBdHRWYWx1ZSAqKnR1cHMgPSAoUEdyZXNBdHRWYWx1ZSAqKikKKyAJ CQkocmVzLT50dXBsZXMgPyByZWFsbG9jKHJlcy0+dHVwbGVzLCBuKnNpemVvZihQR3Jlc0F0dFZh bHVlICopKSA6CisgCQkJIG1hbGxvYyhuKnNpemVvZihQR3Jlc0F0dFZhbHVlICopKSk7CisgCisg CQlpZighdHVwcykKKyAJCQlyZXR1cm4gRkFMU0U7CisgCisgCQltZW1zZXQodHVwcyArIHJlcy0+ dHVwQXJyU2l6ZSwgMCwKKyAJCQkobiAtIHJlcy0+dHVwQXJyU2l6ZSkgKiBzaXplb2YoUEdyZXNB dHRWYWx1ZSAqKSk7CisgCQlyZXMtPnR1cGxlcyA9IHR1cHM7CisgCQlyZXMtPnR1cEFyclNpemUg PSBuOworIAl9CisgCisgCS8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgdHVwbGUgKi8KKyAJaWYo dHVwX251bSA9PSByZXMtPm50dXBzICYmICFyZXMtPnR1cGxlc1t0dXBfbnVtXSkKKyAJeworIAkJ aW50IGk7CisgCQlQR3Jlc0F0dFZhbHVlICp0dXAgPSAoUEdyZXNBdHRWYWx1ZSAqKVBRcmVzdWx0 QWxsb2MoCisgCQkJcmVzLCByZXMtPm51bUF0dHJpYnV0ZXMgKiBzaXplb2YoUEdyZXNBdHRWYWx1 ZSkpOworIAorIAkJaWYoIXR1cCkKKyAJCQlyZXR1cm4gRkFMU0U7CisgCisgCQkvKiBpbml0aWFs aXplIGVhY2ggY29sdW1uIHRvIE5VTEwgKi8KKyAJCWZvcihpPTA7IGkgPCByZXMtPm51bUF0dHJp YnV0ZXM7IGkrKykKKyAJCXsKKyAJCQl0dXBbaV0ubGVuID0gTlVMTF9MRU47CisgCQkJdHVwW2ld LnZhbHVlID0gcmVzLT5udWxsX2ZpZWxkOworIAkJfQorIAorIAkJcmVzLT50dXBsZXNbdHVwX251 bV0gPSB0dXA7CisgCQlyZXMtPm50dXBzKys7CisgCX0KKyAKKyAJYXR0dmFsID0gJnJlcy0+dHVw bGVzW3R1cF9udW1dW2ZpZWxkX251bV07CisgCisgCS8qIE9uIHRvcCBvZiBOVUxMX0xFTiwgdHJl YXQgYSBOVUxMIHZhbHVlIGFzIGEgTlVMTCBmaWVsZCAqLworIAlpZihsZW4gPT0gTlVMTF9MRU4g fHwgdmFsdWUgPT0gTlVMTCkKKyAJeworIAkJYXR0dmFsLT5sZW4gPSBOVUxMX0xFTjsKKyAJCWF0 dHZhbC0+dmFsdWUgPSByZXMtPm51bGxfZmllbGQ7CisgCX0KKyAJZWxzZQorIAl7CisgCQlpZihs ZW4gPCAwKQorIAkJCWxlbiA9IDA7CisgCisgCQlpZihsZW4gPT0gMCkKKyAJCXsKKyAJCQlhdHR2 YWwtPmxlbiA9IDA7CisgCQkJYXR0dmFsLT52YWx1ZSA9IHJlcy0+bnVsbF9maWVsZDsKKyAJCX0K KyAJCWVsc2UKKyAJCXsKKyAJCQlhdHR2YWwtPnZhbHVlID0gKGNoYXIgKilQUXJlc3VsdEFsbG9j KHJlcywgbGVuICsgMSk7CisgCQkJaWYoIWF0dHZhbC0+dmFsdWUpCisgCQkJCXJldHVybiBGQUxT RTsKKyAKKyAJCQlhdHR2YWwtPmxlbiA9IGxlbjsKKyAJCQltZW1jcHkoYXR0dmFsLT52YWx1ZSwg dmFsdWUsIGxlbik7CisgCQkJYXR0dmFsLT52YWx1ZVtsZW5dID0gJ1wwJzsKKyAJCX0KKyAJfQor IAorIAlyZXR1cm4gVFJVRTsKKyB9CisgCisgdm9pZCAqCisgUFFyZXN1bHRBbGxvYyhQR3Jlc3Vs dCAqcmVzLCBzaXplX3QgbkJ5dGVzKQorIHsKKyAJcmV0dXJuIHBxUmVzdWx0QWxsb2MocmVzLCBu Qnl0ZXMsIFRSVUUpOworIH0KKyAKKyAvKgogICAqIHBxUmVzdWx0QWxsb2MgLQogICAqCQlBbGxv Y2F0ZSBzdWJzaWRpYXJ5IHN0b3JhZ2UgZm9yIGEgUEdyZXN1bHQuCiAgICoKICAgKiBuQnl0ZXMg aXMgdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoZSBvYmplY3QuCiAgICogSWYgaXNC aW5hcnkgaXMgdHJ1ZSwgd2UgYXNzdW1lIHRoYXQgd2UgbmVlZCB0byBhbGlnbiB0aGUgb2JqZWN0 IG9uCiAgICogYSBtYWNoaW5lIGFsbG9jYXRpb24gYm91bmRhcnkuCioqKioqKioqKioqKioqKgoq KiogMzQ5LDM2NSAqKioqCi0tLSA2MjEsNjU0IC0tLS0KICAgKiBQUWNsZWFyIC0KICAgKgkgIGZy ZWUncyB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIFBHcmVzdWx0CiAgICovCiAgdm9pZAog IFBRY2xlYXIoUEdyZXN1bHQgKnJlcykKICB7CisgCWludCBpOwogIAlQR3Jlc3VsdF9kYXRhICpi bG9jazsKICAKICAJaWYgKCFyZXMpCiAgCQlyZXR1cm47CiAgCisgCWZvcihpPTA7IGkgPCByZXMt Pm9iakhvb2tzQ291bnQ7IGkrKykKKyAJeworIAkJaWYocmVzLT5vYmpIb29rc1tpXS5yZXN1bHRE ZXN0cm95KQorIAkJeworIAkJCXJlcy0+b2JqSG9va3NbaV0ucmVzdWx0RGVzdHJveSgoY29uc3Qg UEdyZXN1bHQgKilyZXMpOworIAkJCWZyZWUocmVzLT5vYmpIb29rc1tpXS5uYW1lKTsKKyAJCX0K KyAJfQorIAorIAlpZihyZXMtPm9iakhvb2tzKQorIAl7CisgCQlmcmVlKHJlcy0+b2JqSG9va3Mp OworIAkJcmVzLT5vYmpIb29rcyA9IE5VTEw7CisgCQlyZXMtPm9iakhvb2tzQ291bnQgPSAwOwor IAl9CisgCiAgCS8qIEZyZWUgYWxsIHRoZSBzdWJzaWRpYXJ5IGJsb2NrcyAqLwogIAl3aGlsZSAo KGJsb2NrID0gcmVzLT5jdXJCbG9jaykgIT0gTlVMTCkKICAJewogIAkJcmVzLT5jdXJCbG9jayA9 IGJsb2NrLT5uZXh0OwogIAkJZnJlZShibG9jayk7CiAgCX0KKioqKioqKioqKioqKioqCioqKiAx MTc5LDEyMDIgKioqKgogIAlwYXJzZUlucHV0KGNvbm4pOwogIAogIAkvKiBQUWdldFJlc3VsdCB3 aWxsIHJldHVybiBpbW1lZGlhdGVseSBpbiBhbGwgc3RhdGVzIGV4Y2VwdCBCVVNZLiAqLwogIAly ZXR1cm4gY29ubi0+YXN5bmNTdGF0dXMgPT0gUEdBU1lOQ19CVVNZOwogIH0KICAKLSAKICAvKgog ICAqIFBRZ2V0UmVzdWx0CiAgICoJICBHZXQgdGhlIG5leHQgUEdyZXN1bHQgcHJvZHVjZWQgYnkg YSBxdWVyeS4gIFJldHVybnMgTlVMTCBpZiBubwogICAqCSAgcXVlcnkgd29yayByZW1haW5zIG9y IGFuIGVycm9yIGhhcyBvY2N1cnJlZCAoZS5nLiBvdXQgb2YKICAgKgkgIG1lbW9yeSkuCiAgICov CiAgCiAgUEdyZXN1bHQgKgogIFBRZ2V0UmVzdWx0KFBHY29ubiAqY29ubikKICB7CiEgCVBHcmVz dWx0ICAgKnJlczsKICAKICAJaWYgKCFjb25uKQogIAkJcmV0dXJuIE5VTEw7CiAgCiAgCS8qIFBh cnNlIGFueSBhdmFpbGFibGUgZGF0YSwgaWYgb3VyIHN0YXRlIHBlcm1pdHMuICovCiAgCXBhcnNl SW5wdXQoY29ubik7Ci0tLSAxNDY4LDE0OTAgLS0tLQogIAlwYXJzZUlucHV0KGNvbm4pOwogIAog IAkvKiBQUWdldFJlc3VsdCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpbiBhbGwgc3RhdGVzIGV4 Y2VwdCBCVVNZLiAqLwogIAlyZXR1cm4gY29ubi0+YXN5bmNTdGF0dXMgPT0gUEdBU1lOQ19CVVNZ OwogIH0KICAKICAvKgogICAqIFBRZ2V0UmVzdWx0CiAgICoJICBHZXQgdGhlIG5leHQgUEdyZXN1 bHQgcHJvZHVjZWQgYnkgYSBxdWVyeS4gIFJldHVybnMgTlVMTCBpZiBubwogICAqCSAgcXVlcnkg d29yayByZW1haW5zIG9yIGFuIGVycm9yIGhhcyBvY2N1cnJlZCAoZS5nLiBvdXQgb2YKICAgKgkg IG1lbW9yeSkuCiAgICovCiAgCiAgUEdyZXN1bHQgKgogIFBRZ2V0UmVzdWx0KFBHY29ubiAqY29u bikKICB7CiEgCVBHcmVzdWx0ICAgKnJlcz1OVUxMOwogIAogIAlpZiAoIWNvbm4pCiAgCQlyZXR1 cm4gTlVMTDsKICAKICAJLyogUGFyc2UgYW55IGF2YWlsYWJsZSBkYXRhLCBpZiBvdXIgc3RhdGUg cGVybWl0cy4gKi8KICAJcGFyc2VJbnB1dChjb25uKTsKKioqKioqKioqKioqKioqCioqKiAxMjY1 LDEyNzYgKioqKgotLS0gMTU1MywxNTc0IC0tLS0KICAJCQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJ1 bmV4cGVjdGVkIGFzeW5jU3RhdHVzOiAlZFxuIiksCiAgCQkJCQkJCSAgKGludCkgY29ubi0+YXN5 bmNTdGF0dXMpOwogIAkJCXJlcyA9IFBRbWFrZUVtcHR5UEdyZXN1bHQoY29ubiwgUEdSRVNfRkFU QUxfRVJST1IpOwogIAkJCWJyZWFrOwogIAl9CiAgCisgCWlmKHJlcyAmJiAocmVzLT5yZXN1bHRT dGF0dXMgPT0gUEdSRVNfQ09NTUFORF9PSyB8fAorIAkJIHJlcy0+cmVzdWx0U3RhdHVzID09IFBH UkVTX1RVUExFU19PSykpCisgCXsKKyAJCWludCBpOworIAkJZm9yKGk9MDsgaSA8IHJlcy0+b2Jq SG9va3NDb3VudDsgaSsrKQorIAkJCWlmKHJlcy0+b2JqSG9va3NbaV0ucmVzdWx0Q3JlYXRlKQor IAkJCQlyZXMtPm9iakhvb2tzW2ldLmRhdGEgPSByZXMtPm9iakhvb2tzW2ldLnJlc3VsdENyZWF0 ZSgKKyAJCQkJCShjb25zdCBQR2Nvbm4gKiljb25uLCAoY29uc3QgUEdyZXN1bHQgKilyZXMpOwor IAl9CisgCiAgCXJldHVybiByZXM7CiAgfQogIAogIAogIC8qCiAgICogUFFleGVjCioqKioqKioq KioqKioqKgoqKiogMTI5MSwxMzAzICoqKioKICAJaWYgKCFQUXNlbmRRdWVyeShjb25uLCBxdWVy eSkpCiAgCQlyZXR1cm4gTlVMTDsKICAJcmV0dXJuIFBRZXhlY0ZpbmlzaChjb25uKTsKICB9CiAg CiAgLyoKISAgKiBQUWV4ZWNQYXJhbXMKICAgKgkJTGlrZSBQUWV4ZWMsIGJ1dCB1c2UgcHJvdG9j b2wgMy4wIHNvIHdlIGNhbiBwYXNzIHBhcmFtZXRlcnMKICAgKi8KICBQR3Jlc3VsdCAqCiAgUFFl eGVjUGFyYW1zKFBHY29ubiAqY29ubiwKICAJCQkgY29uc3QgY2hhciAqY29tbWFuZCwKICAJCQkg aW50IG5QYXJhbXMsCi0tLSAxNTg5LDE2MDEgLS0tLQogIAlpZiAoIVBRc2VuZFF1ZXJ5KGNvbm4s IHF1ZXJ5KSkKICAJCXJldHVybiBOVUxMOwogIAlyZXR1cm4gUFFleGVjRmluaXNoKGNvbm4pOwog IH0KICAKICAvKgohICAqCiAgICoJCUxpa2UgUFFleGVjLCBidXQgdXNlIHByb3RvY29sIDMuMCBz byB3ZSBjYW4gcGFzcyBwYXJhbWV0ZXJzCiAgICovCiAgUEdyZXN1bHQgKgogIFBRZXhlY1BhcmFt cyhQR2Nvbm4gKmNvbm4sCiAgCQkJIGNvbnN0IGNoYXIgKmNvbW1hbmQsCiAgCQkJIGludCBuUGFy YW1zLApJbmRleDogZmUtbWlzYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNy b290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLW1pc2MuYyx2CnJldHJpZXZpbmcgcmV2 aXNpb24gMS4xMzMKZGlmZiAtQzYgLXIxLjEzMyBmZS1taXNjLmMKKioqIGZlLW1pc2MuYwkxIEph biAyMDA4IDE5OjQ2OjAwIC0wMDAwCTEuMTMzCi0tLSBmZS1taXNjLmMJMzAgQXByIDIwMDggMjA6 MDU6MjYgLTAwMDAKKioqKioqKioqKioqKioqCioqKiAxMTUyLDExNTcgKioqKgotLS0gMTE1Miwx MzAyIC0tLS0KICAJfQogIAogIAlyZXR1cm4gZGdldHRleHQoImxpYnBxIiwgbXNnaWQpOwogIH0K ICAKICAjZW5kaWYgICAvKiBFTkFCTEVfTkxTICovCisgCisgCisgLyogLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgICogT2JqZWN0SG9va3MKKyAgKi8KKyAKKyAvKiBnbG9iYWwgb2JqZWN0IGhvb2tz LCBzZWUgUFFhZGRHbG9iYWxPYmplY3RIb29rcyAqLworIHN0YXRpYyBpbnQgZ19vYmpIb29rc0Nv dW50ID0gMDsKKyBzdGF0aWMgaW50IGdfb2JqSG9va3NTaXplID0gMDsKKyBzdGF0aWMgUEdvYmpl Y3RIb29rcyAqZ19vYmpIb29rcyA9IE5VTEw7CisgCisgc3RhdGljIGludAorIGhvb2tFeGlzdHMo UEdvYmplY3RIb29rcyAqb2JqSG9va3MsIGludCBvYmpIb29rc0NvdW50LCBjb25zdCBjaGFyICpu YW1lKQorIHsKKyAJaW50IGk7CisgCWZvcihpPTA7IGkgPCBvYmpIb29rc0NvdW50OyBpKyspCisg CQlpZihwZ19zdHJjYXNlY21wKG9iakhvb2tzW2ldLm5hbWUsIG5hbWUpPT0wKQorIAkJCXJldHVy biBUUlVFOworIAlyZXR1cm4gRkFMU0U7CisgfQorIAorIHN0YXRpYyBpbnQKKyBncm93SG9va3Mo UEdvYmplY3RIb29rcyAqKm9iakhvb2tzLCBpbnQgKm9iakhvb2tzU2l6ZSwKKyAJaW50IG9iakhv b2tzQ291bnQpCisgeworIAkvKiBncm93IGxpc3QgKi8KKyAJaWYob2JqSG9va3NDb3VudCA9PSAq b2JqSG9va3NTaXplKQorIAl7CisgCQlQR29iamVjdEhvb2tzICpvaDsKKyAJCWludCBuID0gKm9i akhvb2tzU2l6ZSA/ICgqb2JqSG9va3NTaXplKjMpLzIgOiA0OworIAorIAkJaWYoKm9iakhvb2tz KQorIAkJCW9oID0gKFBHb2JqZWN0SG9va3MgKilyZWFsbG9jKAorIAkJCQkqb2JqSG9va3MsIG4q c2l6ZW9mKFBHb2JqZWN0SG9va3MpKTsKKyAJCWVsc2UKKyAJCQlvaCA9IChQR29iamVjdEhvb2tz ICopbWFsbG9jKG4qc2l6ZW9mKFBHb2JqZWN0SG9va3MpKTsKKyAKKyAJCWlmKCFvaCkKKyAJCQly ZXR1cm4gRkFMU0U7CisgCisgCQkqb2JqSG9va3MgPSBvaDsKKyAJCSpvYmpIb29rc1NpemUgPSBu OworIAl9CisgCisgCXJldHVybiBUUlVFOworIH0KKyAKKyBzdGF0aWMgaW50CisgaG9va0NvcHko UEdvYmplY3RIb29rcyAqZHN0LCBQR29iamVjdEhvb2tzICpzcmMpCisgeworIAltZW1jcHkoZHN0 LCBzcmMsIHNpemVvZihQR29iamVjdEhvb2tzKSk7CisgCWRzdC0+ZGF0YSA9IE5VTEw7CisgCWRz dC0+bmFtZSA9IHN0cmR1cChzcmMtPm5hbWUpOworIAlyZXR1cm4gZHN0LT5uYW1lID8gVFJVRSA6 IEZBTFNFOworIH0KKyAKKyBpbnQKKyBQUWFkZEdsb2JhbE9iamVjdEhvb2tzKFBHb2JqZWN0SG9v a3MgKmhvb2tzKQorIHsKKyAJaWYoIWhvb2tzIHx8ICFob29rcy0+bmFtZSB8fCAhKmhvb2tzLT5u YW1lKQorIAkJcmV0dXJuIEZBTFNFOworIAorIAlpZihob29rRXhpc3RzKGdfb2JqSG9va3MsIGdf b2JqSG9va3NDb3VudCwgaG9va3MtPm5hbWUpIHx8CisgCQkgIWdyb3dIb29rcygmZ19vYmpIb29r cywgJmdfb2JqSG9va3NTaXplLCBnX29iakhvb2tzQ291bnQpIHx8CisgCQkgIWhvb2tDb3B5KGdf b2JqSG9va3MgKyBnX29iakhvb2tzQ291bnQsIGhvb2tzKSkKKyAJCXJldHVybiBGQUxTRTsKKyAK KyAJZ19vYmpIb29rc0NvdW50Kys7CisgCXJldHVybiBUUlVFOworIH0KKyAKKyAvKiBpbml0cyB0 aGUgZ2xvYmFsIGhvb2tzIGZvciBhIGNvbm4gb2JqZWN0LiAgSWYgdGhlIGhvb2tzIHdlcmUgYWxy ZWFkeQorICAqIGluc3RhbGxlZCwgdGhlIHJlcXVlc3QgaXMgaWdub3JlZCBhbmQgYSBzdWNjZXNz IHZhbHVlIGlzIHJldHVybmVkLgorICAqIFRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIGEgUFFyZXNl dCBhbmQgUFFyZXNldFBvbGwuCisgICogUmV0dXJucyBub24temVybyBmb3Igc3VjY2VzcyBhbmQg emVybyBvbiBlcnJvci4KKyAgKi8KKyBpbnQKKyBwcUluaXRPYmplY3RIb29rcyhQR2Nvbm4gKmNv bm4pCisgeworIAlpbnQgaTsKKyAKKyAJLyogQWxyZWFkeSBpbnN0YWxsZWQsIG9jY3VycyBvbiBQ UXJlc2V0IGFuZCBQUXJlc2V0UG9sbCAqLworIAlpZihjb25uLT5vYmpIb29rc0NvdW50ID4gMCkK KyAJCXJldHVybiBUUlVFOworIAorIAlmb3IoaT0wOyBpIDwgZ19vYmpIb29rc0NvdW50OyBpKysp CisgCQlpZighUFFhZGRPYmplY3RIb29rcyhjb25uLCAmZ19vYmpIb29rc1tpXSkpCisgCQkJcmV0 dXJuIEZBTFNFOworIAorIAlyZXR1cm4gVFJVRTsKKyB9CisgCisgaW50CisgUFFhZGRPYmplY3RI b29rcyhQR2Nvbm4gKmNvbm4sIFBHb2JqZWN0SG9va3MgKmhvb2tzKQorIHsKKyAJUEdvYmplY3RI b29rcyAqb2g7CisgCisgCWlmKCFjb25uIHx8ICFob29rcyB8fCAhaG9va3MtPm5hbWUgfHwgISpo b29rcy0+bmFtZSkKKyAJCXJldHVybiBGQUxTRTsKKyAKKyAJLyogbmFtZXMgbXVzdCBiZSB1bmlx dWUgKi8KKyAJaWYoaG9va0V4aXN0cyhjb25uLT5vYmpIb29rcywgY29ubi0+b2JqSG9va3NDb3Vu dCwgaG9va3MtPm5hbWUpIHx8CisgCQkgIWdyb3dIb29rcygmY29ubi0+b2JqSG9va3MsICZjb25u LT5vYmpIb29rc1NpemUsIGNvbm4tPm9iakhvb2tzQ291bnQpIHx8CisgCQkgIWhvb2tDb3B5KGNv bm4tPm9iakhvb2tzICsgY29ubi0+b2JqSG9va3NDb3VudCwgaG9va3MpKQorIAkJcmV0dXJuIEZB TFNFOworIAorIAlvaCA9ICZjb25uLT5vYmpIb29rc1tjb25uLT5vYmpIb29rc0NvdW50KytdOwor IAlpZihvaC0+aW5pdEhvb2tEYXRhKQorIAkJb2gtPmRhdGEgPSBvaC0+aW5pdEhvb2tEYXRhKChj b25zdCBQR2Nvbm4gKiljb25uKTsKKyAKKyAJcmV0dXJuIFRSVUU7CisgfQorIAorIHZvaWQgKgor IFBRaG9va0RhdGEoY29uc3QgUEdjb25uICpjb25uLCBjb25zdCBjaGFyICpob29rTmFtZSkKKyB7 CisgCWlmKGNvbm4gJiYgaG9va05hbWUgJiYgKmhvb2tOYW1lKQorIAl7CisgCQlpbnQgaTsKKyAJ CVBHb2JqZWN0SG9va3MgKmhvb2tzID0gY29ubi0+b2JqSG9va3M7CisgCisgCQlmb3IoaT0wOyBp IDwgY29ubi0+b2JqSG9va3NDb3VudDsgaSsrKQorIAkJCWlmKHBnX3N0cmNhc2VjbXAoaG9va3Nb aV0ubmFtZSwgaG9va05hbWUpPT0wKQorIAkJCQlyZXR1cm4gaG9va3NbaV0uZGF0YTsKKyAJfQor IAorIAlyZXR1cm4gTlVMTDsKKyB9CisgCisgdm9pZCAqCisgUFFyZXN1bHRIb29rRGF0YShjb25z dCBQR3Jlc3VsdCAqcmVzLCBjb25zdCBjaGFyICpob29rTmFtZSkKKyB7CisgCWlmKHJlcyAmJiBo b29rTmFtZSAmJiAqaG9va05hbWUpCisgCXsKKyAJCWludCBpOworIAkJUEdvYmplY3RIb29rcyAq aG9va3MgPSByZXMtPm9iakhvb2tzOworIAorIAkJZm9yKGk9MDsgaSA8IHJlcy0+b2JqSG9va3ND b3VudDsgaSsrKQorIAkJCWlmKHBnX3N0cmNhc2VjbXAoaG9va3NbaV0ubmFtZSwgaG9va05hbWUp PT0wKQorIAkJCQlyZXR1cm4gaG9va3NbaV0uZGF0YTsKKyAJfQorIAorIAlyZXR1cm4gTlVMTDsK KyB9CisgCkluZGV4OiBsaWJwcS1mZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9j dnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgsdgpyZXRyaWV2aW5n IHJldmlzaW9uIDEuMTQyCmRpZmYgLUM2IC1yMS4xNDIgbGlicHEtZmUuaAoqKiogbGlicHEtZmUu aAkxOSBNYXIgMjAwOCAwMDozOTozMyAtMDAwMAkxLjE0MgotLS0gbGlicHEtZmUuaAkzMCBBcHIg MjAwOCAyMDowNToyNiAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDI1LDM2ICoqKioKLS0tIDI1 LDQ1IC0tLS0KICAvKgogICAqIHBvc3RncmVzX2V4dC5oIGRlZmluZXMgdGhlIGJhY2tlbmQncyBl eHRlcm5hbGx5IHZpc2libGUgdHlwZXMsCiAgICogc3VjaCBhcyBPaWQuCiAgICovCiAgI2luY2x1 ZGUgInBvc3RncmVzX2V4dC5oIgogIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICog T3B0aW9ucyBmb3IgUFFjb3B5UmVzdWx0CisgICovCisgCisgI2RlZmluZSBQR19DT1BZUkVTX05P X1RVUExFUyAgICAgIDB4MDEKKyAjZGVmaW5lIFBHX0NPUFlSRVNfVVNFX0FUVFJTICAgICAgMHgw MgorICNkZWZpbmUgUEdfQ09QWVJFU19OT19PQkpFQ1RIT09LUyAweDA0CisgI2RlZmluZSBQR19D T1BZUkVTX05PX05PVElDRUhPT0tTIDB4MDgKKyAKICAvKiBBcHBsaWNhdGlvbi12aXNpYmxlIGVu dW0gdHlwZXMgKi8KICAKICB0eXBlZGVmIGVudW0KICB7CiAgCS8qCiAgCSAqIEFsdGhvdWdoIGl0 IGlzIG9rYXkgdG8gYWRkIHRvIHRoaXMgbGlzdCwgdmFsdWVzIHdoaWNoIGJlY29tZSB1bnVzZWQK KioqKioqKioqKioqKioqCioqKiAxOTAsMjAxICoqKioKLS0tIDE5OSwyNjAgLS0tLQogIAkJaW50 CQkgICAqcHRyOwkJLyogY2FuJ3QgdXNlIHZvaWQgKGRlYyBjb21waWxlciBiYXJmcykJICovCiAg CQlpbnQJCQlpbnRlZ2VyOwogIAl9CQkJdTsKICB9IFBRQXJnQmxvY2s7CiAgCiAgLyogLS0tLS0t LS0tLS0tLS0tLQorICAqIFBHcmVzQXR0RGVzYyAtLSBEYXRhIGFib3V0IGEgc2luZ2xlIGF0dHJp YnV0ZSAoY29sdW1uKSBvZiBhIHF1ZXJ5IHJlc3VsdAorICAqIC0tLS0tLS0tLS0tLS0tLS0KKyAg Ki8KKyB0eXBlZGVmIHN0cnVjdCBwZ3Jlc0F0dERlc2MKKyB7CisgCWNoYXIJICAgKm5hbWU7CQkJ LyogY29sdW1uIG5hbWUgKi8KKyAJT2lkCQkJdGFibGVpZDsJCS8qIHNvdXJjZSB0YWJsZSwgaWYg a25vd24gKi8KKyAJaW50CQkJY29sdW1uaWQ7CQkvKiBzb3VyY2UgY29sdW1uLCBpZiBrbm93biAq LworIAlpbnQJCQlmb3JtYXQ7CQkJLyogZm9ybWF0IGNvZGUgZm9yIHZhbHVlICh0ZXh0L2JpbmFy eSkgKi8KKyAJT2lkCQkJdHlwaWQ7CQkJLyogdHlwZSBpZCAqLworIAlpbnQJCQl0eXBsZW47CQkJ LyogdHlwZSBzaXplICovCisgCWludAkJCWF0dHR5cG1vZDsgIC8qIHR5cGUtc3BlY2lmaWMgbW9k aWZpZXIgaW5mbyAqLworIH0gUEdyZXNBdHREZXNjOworIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0K KyAgKiBQR29iamVjdEhvb2tzIC0tIHN0cnVjdHVyZSBmb3IgYWRkaW5nIGxpYnBxIG9iamVjdCBo b29rcworICAqIE1vbml0b3JzIHRoZSBjcmVhdGlvbiBhbmQgZGVsZXRpb24gb2Ygb2JqZWN0cy4K KyAgKiAtLS0tLS0tLS0tLS0tLS0tCisgICovCisgCisgdHlwZWRlZiBzdHJ1Y3QKKyB7CisgCWNo YXIgKm5hbWU7CisgCisgCXZvaWQgKmRhdGE7CisgCisgCS8qIEludm9rZWQgd2hlbiBQUXNldE9i amVjdEhvb2sgaXMgY2FsbGVkLiAgVGhlIHBvaW50ZXIgcmV0dXJuZWQKKyAJICogYnkgdGhlIGhv b2sgaW1wbGVtZW50YXRpb24gaXMgc3RvcmVkIGluIHRoZSBwcml2YXRlIHN0b3JhZ2Ugb2YKKyAJ ICogdGhlIFBHY29ubiwgYWNjZXNzaWJsZSB2aWEgUFFob29rRGF0YShQR2Nvbm4qKS4gIElmIG5v CisgCSAqIHN0b3JhZ2UgaXMgbmVlZGVkLCByZXR1cm4gTlVMTCBvciBzZXQgdGhpcyBob29rIHRv IE5VTEwuCisgCSAqLworIAl2b2lkICooKmluaXRIb29rRGF0YSkoY29uc3QgUEdjb25uICpjb25u KTsKKyAKKyAJLyogSW52b2tlZCBvbiBQUXJlc2V0IGFuZCBQUXJlc2V0UG9sbCAqLworIAl2b2lk ICgqY29ublJlc2V0KShjb25zdCBQR2Nvbm4gKmNvbm4pOworIAorIAkvKiBJbnZva2VkIG9uIFBR ZmluaXNoLiAqLworIAl2b2lkICgqY29ubkRlc3Ryb3kpKGNvbnN0IFBHY29ubiAqY29ubik7Cisg CisgCS8qIEludm9rZWQgb24gUFFnZXRSZXN1bHQsIGludGVybmFsbHkgY2FsbGVkIGJ5IGFsbCBl eGVjIGZ1bmNzICovCisgCXZvaWQgKigqcmVzdWx0Q3JlYXRlKShjb25zdCBQR2Nvbm4gKmNvbm4s IGNvbnN0IFBHcmVzdWx0ICpyZXN1bHQpOworIAorIAkvKiBJbnZva2VkIG9uIFBRY29weVJlc3Vs dCAqLworIAl2b2lkICooKnJlc3VsdENvcHkpKFBHcmVzdWx0ICpkZXN0LCBjb25zdCBQR3Jlc3Vs dCAqc3JjKTsKKyAKKyAJLyogSW52b2tlZCB3aGVuIFBRY2xlYXIgaXMgY2FsbGVkICovCisgCXZv aWQgKCpyZXN1bHREZXN0cm95KShjb25zdCBQR3Jlc3VsdCAqcmVzdWx0KTsKKyB9IFBHb2JqZWN0 SG9va3M7CisgCisgLyogLS0tLS0tLS0tLS0tLS0tLQogICAqIEV4cG9ydGVkIGZ1bmN0aW9ucyBv ZiBsaWJwcQogICAqIC0tLS0tLS0tLS0tLS0tLS0KICAgKi8KICAKICAvKiA9PT0JaW4gZmUtY29u bmVjdC5jID09PSAqLwogIAoqKioqKioqKioqKioqKioKKioqIDQzNCw0NDUgKioqKgotLS0gNDkz LDUyMyAtLS0tCiAgICogTWFrZSBhbiBlbXB0eSBQR3Jlc3VsdCB3aXRoIGdpdmVuIHN0YXR1cyAo c29tZSBhcHBzIGZpbmQgdGhpcwogICAqIHVzZWZ1bCkuIElmIGNvbm4gaXMgbm90IE5VTEwgYW5k IHN0YXR1cyBpbmRpY2F0ZXMgYW4gZXJyb3IsIHRoZQogICAqIGNvbm4ncyBlcnJvck1lc3NhZ2Ug aXMgY29waWVkLgogICAqLwogIGV4dGVybiBQR3Jlc3VsdCAqUFFtYWtlRW1wdHlQR3Jlc3VsdChQ R2Nvbm4gKmNvbm4sIEV4ZWNTdGF0dXNUeXBlIHN0YXR1cyk7CiAgCisgZXh0ZXJuIFBHcmVzdWx0 ICoKKyBQUWNvcHlSZXN1bHQoY29uc3QgUEdyZXN1bHQgKnNyYywgaW50IG51bUF0dHJpYnV0ZXMs CisgCVBHcmVzQXR0RGVzYyAqYXR0RGVzY3MsIGludCBvcHRpb25zKTsKKyAKKyBleHRlcm4gdm9p ZCAqCisgUFFyZXN1bHRBbGxvYyhQR3Jlc3VsdCAqcmVzLCBzaXplX3QgbkJ5dGVzKTsKKyAKKyAv KgorICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHR1cGxlIGZpZWxkLiAgVGhlIHR1cF9udW0gbXVz dCBiZSBsZXNzIHRoYW4gb3IKKyAgKiBlcXVhbCB0byBQUW50dXBsZXMocmVzKS4gIFRoaXMgZnVu Y3Rpb24gd2lsbCBnZW5lcmF0ZSB0dXBsZXMgYXMgbmVlZGVkLgorICAqIEEgbmV3IHR1cGxlIGlz IGdlbmVyYXRlZCB3aGVuIHR1cF9udW0gZXF1YWxzIFBRbnR1cGxlcyhyZXMpIGFuZCB0aGVyZQor ICAqIGFyZSBubyBmaWVsZHMgZGVmaW5lZCBmb3IgdGhhdCB0dXBsZS4KKyAgKgorICAqIFJldHVy bnMgYSBub24temVybyB2YWx1ZSBmb3Igc3VjY2VzcyBhbmQgemVybyBmb3IgZmFpbHVyZS4KKyAg Ki8KKyBleHRlcm4gaW50CisgUFFzZXR2YWx1ZShQR3Jlc3VsdCAqcmVzLCBpbnQgdHVwX251bSwg aW50IGZpZWxkX251bSwKKyAJY2hhciAqdmFsdWUsIGludCBsZW4pOworIAogIAogIC8qIFF1b3Rp bmcgc3RyaW5ncyBiZWZvcmUgaW5jbHVzaW9uIGluIHF1ZXJpZXMuICovCiAgZXh0ZXJuIHNpemVf dCBQUWVzY2FwZVN0cmluZ0Nvbm4oUEdjb25uICpjb25uLAogIAkJCQkgICBjaGFyICp0bywgY29u c3QgY2hhciAqZnJvbSwgc2l6ZV90IGxlbmd0aCwKICAJCQkJICAgaW50ICplcnJvcik7CiAgZXh0 ZXJuIHVuc2lnbmVkIGNoYXIgKlBRZXNjYXBlQnl0ZWFDb25uKFBHY29ubiAqY29ubiwKKioqKioq KioqKioqKioqCioqKiA1MDYsNTE3ICoqKioKLS0tIDU4NCw2MTcgLS0tLQogIC8qIERldGVybWlu ZSBkaXNwbGF5IGxlbmd0aCBvZiBtdWx0aWJ5dGUgZW5jb2RlZCBjaGFyIGF0ICpzICovCiAgZXh0 ZXJuIGludAlQUWRzcGxlbihjb25zdCBjaGFyICpzLCBpbnQgZW5jb2RpbmcpOwogIAogIC8qIEdl dCBlbmNvZGluZyBpZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlIFBHQ0xJRU5URU5DT0RJTkcg Ki8KICBleHRlcm4gaW50CVBRZW52MmVuY29kaW5nKHZvaWQpOwogIAorIC8qIEFkZHMgYSBzZXQg b2YgZ2xvYmFsIG9iamVjdCBob29rcywgd2hpY2ggd2lsbCBiZSBpbmhlcml0ZWQgYnkgZXZlcnkK KyAgKiBQR2Nvbm4uICBPYmplY3QgaG9va3MgYWRkZWQgaW4gdGhpcyBmYXNoaW9uIGRvIG5vdCBy ZXF1aXJlIGJlaW5nCisgICogYWRkZWQgb24gYSBwZXItY29ubmVjdGlvbiBiYXNpcy4gIEFueSBu dW1iZXIgb2Ygb2JqZWN0IGhvb2tzIGNhbiBiZQorICAqIGJlIGFkZGVkLgorICAqCisgICogV0FS TklORzogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFp biB0aHJlYWQKKyAgKiBiZWZvcmUgdXNpbmcgYW55IG90aGVyIGxpYnBxIGZ1bmN0aW9ucy4gIFRo aXMgaXMgbm90IHRocmVhZC1zYWZlIGFuZAorICAqIHNob3VsZCBiZSB1c2VkIHByaW9yIHRvIGNy ZWF0aW5nIGFueSBhcHBsaWNhdGlvbiB0aHJlYWRzLgorICAqLworIGV4dGVybiBpbnQKKyBQUWFk ZEdsb2JhbE9iamVjdEhvb2tzKFBHb2JqZWN0SG9va3MgKmhvb2tzKTsKKyAKKyAvKiBBZGRzIGEg c2V0IG9mIG9iamVjdCBob29rcyB0byB0aGUgZ2l2ZW4gY29ubmVjdGlvbi4gKi8KKyBleHRlcm4g aW50CisgUFFhZGRPYmplY3RIb29rcyhQR2Nvbm4gKmNvbm4sIFBHb2JqZWN0SG9va3MgKmhvb2tz KTsKKyAKKyBleHRlcm4gdm9pZCAqCisgUFFob29rRGF0YShjb25zdCBQR2Nvbm4gKmNvbm4sIGNv bnN0IGNoYXIgKmhvb2tOYW1lKTsKKyAKKyBleHRlcm4gdm9pZCAqCisgUFFyZXN1bHRIb29rRGF0 YShjb25zdCBQR3Jlc3VsdCAqcmVzLCBjb25zdCBjaGFyICpob29rTmFtZSk7CisgCiAgLyogPT09 IGluIGZlLWF1dGguYyA9PT0gKi8KICAKICBleHRlcm4gY2hhciAqUFFlbmNyeXB0UGFzc3dvcmQo Y29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCBjaGFyICp1c2VyKTsKICAKICAvKiA9PT0gaW4gZW5j bmFtZXMuYyA9PT0gKi8KICAKSW5kZXg6IGxpYnBxLWludC5oCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6 IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5o LHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjEyOQpkaWZmIC1DNiAtcjEuMTI5IGxpYnBxLWludC5o CioqKiBsaWJwcS1pbnQuaAkxIEphbiAyMDA4IDE5OjQ2OjAwIC0wMDAwCTEuMTI5Ci0tLSBsaWJw cS1pbnQuaAkzMCBBcHIgMjAwOCAyMDowNToyNiAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDk3 LDEyMSAqKioqCiAgdW5pb24gcGdyZXN1bHRfZGF0YQogIHsKICAJUEdyZXN1bHRfZGF0YSAqbmV4 dDsJCS8qIGxpbmsgdG8gbmV4dCBibG9jaywgb3IgTlVMTCAqLwogIAljaGFyCQlzcGFjZVsxXTsJ CS8qIGR1bW15IGZvciBhY2Nlc3NpbmcgYmxvY2sgYXMgYnl0ZXMgKi8KICB9OwogIAotIC8qIERh dGEgYWJvdXQgYSBzaW5nbGUgYXR0cmlidXRlIChjb2x1bW4pIG9mIGEgcXVlcnkgcmVzdWx0ICov Ci0gCi0gdHlwZWRlZiBzdHJ1Y3QgcGdyZXNBdHREZXNjCi0gewotIAljaGFyCSAgICpuYW1lOwkJ CS8qIGNvbHVtbiBuYW1lICovCi0gCU9pZAkJCXRhYmxlaWQ7CQkvKiBzb3VyY2UgdGFibGUsIGlm IGtub3duICovCi0gCWludAkJCWNvbHVtbmlkOwkJLyogc291cmNlIGNvbHVtbiwgaWYga25vd24g Ki8KLSAJaW50CQkJZm9ybWF0OwkJCS8qIGZvcm1hdCBjb2RlIGZvciB2YWx1ZSAodGV4dC9iaW5h cnkpICovCi0gCU9pZAkJCXR5cGlkOwkJCS8qIHR5cGUgaWQgKi8KLSAJaW50CQkJdHlwbGVuOwkJ CS8qIHR5cGUgc2l6ZSAqLwotIAlpbnQJCQlhdHR0eXBtb2Q7CQkvKiB0eXBlLXNwZWNpZmljIG1v ZGlmaWVyIGluZm8gKi8KLSB9IFBHcmVzQXR0RGVzYzsKLSAKICAvKiBEYXRhIGFib3V0IGEgc2lu Z2xlIHBhcmFtZXRlciBvZiBhIHByZXBhcmVkIHN0YXRlbWVudCAqLwogIHR5cGVkZWYgc3RydWN0 IHBncmVzUGFyYW1EZXNjCiAgewogIAlPaWQJCQl0eXBpZDsJCQkvKiB0eXBlIGlkICovCiAgfSBQ R3Jlc1BhcmFtRGVzYzsKICAKLS0tIDk3LDEwOCAtLS0tCioqKioqKioqKioqKioqKgoqKiogMTgx LDE5MiAqKioqCi0tLSAxNjgsMTgzIC0tLS0KICAJICogVGhlc2UgZmllbGRzIGFyZSBjb3BpZWQg ZnJvbSB0aGUgb3JpZ2luYXRpbmcgUEdjb25uLCBzbyB0aGF0IG9wZXJhdGlvbnMKICAJICogb24g dGhlIFBHcmVzdWx0IGRvbid0IGhhdmUgdG8gcmVmZXJlbmNlIHRoZSBQR2Nvbm4uCiAgCSAqLwog IAlQR05vdGljZUhvb2tzIG5vdGljZUhvb2tzOwogIAlpbnQJCQljbGllbnRfZW5jb2Rpbmc7CS8q IGVuY29kaW5nIGlkICovCiAgCisgCS8qIE9iamVjdCBIb29rcyAqLworIAlpbnQgb2JqSG9va3ND b3VudDsKKyAJUEdvYmplY3RIb29rcyAqb2JqSG9va3M7CisgCiAgCS8qCiAgCSAqIEVycm9yIGlu Zm9ybWF0aW9uIChhbGwgTlVMTCBpZiBub3QgYW4gZXJyb3IgcmVzdWx0KS4gIGVyck1zZyBpcyB0 aGUKICAJICogIm92ZXJhbGwiIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgYnkgUFFyZXN1bHRFcnJv ck1lc3NhZ2UuICBJZiB3ZSBoYXZlCiAgCSAqIHBlci1maWVsZCBpbmZvIHRoZW4gaXQgaXMgc3Rv cmVkIGluIGEgbGlua2VkIGxpc3QuCiAgCSAqLwogIAljaGFyCSAgICplcnJNc2c7CQkJLyogZXJy b3IgbWVzc2FnZSwgb3IgTlVMTCBpZiBubyBlcnJvciAqLwoqKioqKioqKioqKioqKioKKioqIDIw MiwyMTMgKioqKgotLS0gMTkzLDIwNSAtLS0tCiAgCSAqLwogIAlQR3Jlc3VsdF9kYXRhICpjdXJC bG9jazsJLyogbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2sgKi8KICAJaW50CQkJY3VyT2Zm c2V0OwkJLyogc3RhcnQgb2Zmc2V0IG9mIGZyZWUgc3BhY2UgaW4gYmxvY2sgKi8KICAJaW50CQkJ c3BhY2VMZWZ0OwkJLyogbnVtYmVyIG9mIGZyZWUgYnl0ZXMgcmVtYWluaW5nIGluIGJsb2NrICov CiAgfTsKICAKKyAKICAvKiBQR0FzeW5jU3RhdHVzVHlwZSBkZWZpbmVzIHRoZSBzdGF0ZSBvZiB0 aGUgcXVlcnktZXhlY3V0aW9uIHN0YXRlIG1hY2hpbmUgKi8KICB0eXBlZGVmIGVudW0KICB7CiAg CVBHQVNZTkNfSURMRSwJCQkJLyogbm90aGluZydzIGhhcHBlbmluZywgZHVkZSAqLwogIAlQR0FT WU5DX0JVU1ksCQkJCS8qIHF1ZXJ5IGluIHByb2dyZXNzICovCiAgCVBHQVNZTkNfUkVBRFksCQkJ CS8qIHJlc3VsdCByZWFkeSBmb3IgUFFnZXRSZXN1bHQgKi8KKioqKioqKioqKioqKioqCioqKiAz MDAsMzExICoqKioKLS0tIDI5MiwzMDggLS0tLQogIAkvKiBPcHRpb25hbCBmaWxlIHRvIHdyaXRl IHRyYWNlIGluZm8gdG8gKi8KICAJRklMRQkgICAqUGZkZWJ1ZzsKICAKICAJLyogQ2FsbGJhY2sg cHJvY2VkdXJlcyBmb3Igbm90aWNlIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLwogIAlQR05vdGljZUhv b2tzIG5vdGljZUhvb2tzOwogIAorIAkvKiBPYmplY3QgSG9va3MgKi8KKyAJaW50IG9iakhvb2tz Q291bnQ7CisgCWludCBvYmpIb29rc1NpemU7CisgCVBHb2JqZWN0SG9va3MgKm9iakhvb2tzOwor IAogIAkvKiBTdGF0dXMgaW5kaWNhdG9ycyAqLwogIAlDb25uU3RhdHVzVHlwZSBzdGF0dXM7CiAg CVBHQXN5bmNTdGF0dXNUeXBlIGFzeW5jU3RhdHVzOwogIAlQR1RyYW5zYWN0aW9uU3RhdHVzVHlw ZSB4YWN0U3RhdHVzOyAvKiBuZXZlciBjaGFuZ2VzIHRvIEFDVElWRSAqLwogIAlQR1F1ZXJ5Q2xh c3MgcXVlcnljbGFzczsKICAJY2hhcgkgICAqbGFzdF9xdWVyeTsJCS8qIGxhc3QgU1FMIGNvbW1h bmQsIG9yIE5VTEwgaWYgdW5rbm93biAqLwoqKioqKioqKioqKioqKioKKioqIDUxNiw1MzEgKioq KgogIGV4dGVybiBpbnQJcHFQdXRJbnQoaW50IHZhbHVlLCBzaXplX3QgYnl0ZXMsIFBHY29ubiAq Y29ubik7CiAgZXh0ZXJuIGludAlwcVB1dE1zZ1N0YXJ0KGNoYXIgbXNnX3R5cGUsIGJvb2wgZm9y Y2VfbGVuLCBQR2Nvbm4gKmNvbm4pOwogIGV4dGVybiBpbnQJcHFQdXRNc2dFbmQoUEdjb25uICpj b25uKTsKICBleHRlcm4gaW50CXBxUmVhZERhdGEoUEdjb25uICpjb25uKTsKICBleHRlcm4gaW50 CXBxRmx1c2goUEdjb25uICpjb25uKTsKICBleHRlcm4gaW50CXBxV2FpdChpbnQgZm9yUmVhZCwg aW50IGZvcldyaXRlLCBQR2Nvbm4gKmNvbm4pOwohIGV4dGVybiBpbnQgcHFXYWl0VGltZWQoaW50 IGZvclJlYWQsIGludCBmb3JXcml0ZSwgUEdjb25uICpjb25uLAogIAkJCXRpbWVfdCBmaW5pc2hf dGltZSk7CiAgZXh0ZXJuIGludAlwcVJlYWRSZWFkeShQR2Nvbm4gKmNvbm4pOwogIGV4dGVybiBp bnQJcHFXcml0ZVJlYWR5KFBHY29ubiAqY29ubik7CiAgCiAgLyogPT09IGluIGZlLXNlY3VyZS5j ID09PSAqLwogIAogIGV4dGVybiBpbnQJcHFzZWN1cmVfaW5pdGlhbGl6ZShQR2Nvbm4gKik7CiAg ZXh0ZXJuIHZvaWQgcHFzZWN1cmVfZGVzdHJveSh2b2lkKTsKICBleHRlcm4gUG9zdGdyZXNQb2xs aW5nU3RhdHVzVHlwZSBwcXNlY3VyZV9vcGVuX2NsaWVudChQR2Nvbm4gKik7Ci0tLSA1MTMsNTI5 IC0tLS0KICBleHRlcm4gaW50CXBxUHV0SW50KGludCB2YWx1ZSwgc2l6ZV90IGJ5dGVzLCBQR2Nv bm4gKmNvbm4pOwogIGV4dGVybiBpbnQJcHFQdXRNc2dTdGFydChjaGFyIG1zZ190eXBlLCBib29s IGZvcmNlX2xlbiwgUEdjb25uICpjb25uKTsKICBleHRlcm4gaW50CXBxUHV0TXNnRW5kKFBHY29u biAqY29ubik7CiAgZXh0ZXJuIGludAlwcVJlYWREYXRhKFBHY29ubiAqY29ubik7CiAgZXh0ZXJu IGludAlwcUZsdXNoKFBHY29ubiAqY29ubik7CiAgZXh0ZXJuIGludAlwcVdhaXQoaW50IGZvclJl YWQsIGludCBmb3JXcml0ZSwgUEdjb25uICpjb25uKTsKISBleHRlcm4gaW50CXBxV2FpdFRpbWVk KGludCBmb3JSZWFkLCBpbnQgZm9yV3JpdGUsIFBHY29ubiAqY29ubiwKICAJCQl0aW1lX3QgZmlu aXNoX3RpbWUpOwogIGV4dGVybiBpbnQJcHFSZWFkUmVhZHkoUEdjb25uICpjb25uKTsKICBleHRl cm4gaW50CXBxV3JpdGVSZWFkeShQR2Nvbm4gKmNvbm4pOworIGV4dGVybiBpbnQgcHFJbml0T2Jq ZWN0SG9va3MoUEdjb25uICpjb25uKTsKICAKICAvKiA9PT0gaW4gZmUtc2VjdXJlLmMgPT09ICov CiAgCiAgZXh0ZXJuIGludAlwcXNlY3VyZV9pbml0aWFsaXplKFBHY29ubiAqKTsKICBleHRlcm4g dm9pZCBwcXNlY3VyZV9kZXN0cm95KHZvaWQpOwogIGV4dGVybiBQb3N0Z3Jlc1BvbGxpbmdTdGF0 dXNUeXBlIHBxc2VjdXJlX29wZW5fY2xpZW50KFBHY29ubiAqKTsK ------=_Part_2728_12329237.1209587025873--