Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nAXhq-0002xn-TV for pgsql-hackers@arkaria.postgresql.org; Thu, 20 Jan 2022 13:42:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nAXhp-0004Un-GB for pgsql-hackers@arkaria.postgresql.org; Thu, 20 Jan 2022 13:42:25 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nAXhp-0004Ua-1M for pgsql-hackers@lists.postgresql.org; Thu, 20 Jan 2022 13:42:25 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nAXhl-0004Yu-OR for pgsql-hackers@postgresql.org; Thu, 20 Jan 2022 13:42:24 +0000 Received: from mail.postgrespro.ru (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 367AE21C8B3F; Thu, 20 Jan 2022 16:42:19 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1642686139; bh=XDodXBaPTgxPoQUUKR+XCLLlMO4ltQTv8Wt2QsT/Mck=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=qgxCbLTJm9T/ng2Pla5Ymi10+iJl4D1sObJ5YJhef0ZT/46gMKxbvwsV9q7jvpIyz B+LNaW6tbl3b5QlMAAov9/Zg6RSCHuKhzewlFqJYE4aFjg+ZJ8bquDogUyhVH9ffJu Dtook4YNJqPTyK4PZEl3DPsGkEhX5YxnujoDaavM= MIME-Version: 1.0 Date: Thu, 20 Jan 2022 16:42:18 +0300 From: Alexander Pyhalov To: Tom Lane Cc: Ranier Vilela , Zhihong Yu , Pgsql Hackers Subject: Re: Push down time-related SQLValue functions to foreign server In-Reply-To: <373638.1642536065@sss.pgh.pa.us> References: <39f983a265780b378b835af602276d0a@postgrespro.ru> <158104.1642460882@sss.pgh.pa.us> <321460.1642524780@sss.pgh.pa.us> <8dcf811c3c3363c8472b82af5d5261c8@postgrespro.ru> <368616.1642533090@sss.pgh.pa.us> <373638.1642536065@sss.pgh.pa.us> User-Agent: Roundcube Webmail/1.4.11 Message-ID: <73605b4bb95180e6cff620b6e7ee130d@postgrespro.ru> X-Sender: a.pyhalov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_e44aa127caac0759071e68ad1575f92c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_e44aa127caac0759071e68ad1575f92c Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Tom Lane писал 2022-01-18 23:01: > I wrote: >> Alexander Pyhalov writes: >>> This means we'll translate something like >>> explain select * from t where d > now() - '1 day'::interval; >>> to >>> select * from t where d > $1; > >> Right. > > After thinking about that a bit more, I see that this will result > in a major redefinition of what is "shippable". Right now, we do not > consider the above WHERE clause to be shippable, not only because of > now() but because the timestamptz-minus-interval operator is dependent > on the timezone setting, which might be different at the remote. > But if we evaluate that operator locally and send its result as a > parameter, the objection vanishes. In fact, I don't think we even > need to require the subexpression to contain only built-in functions. > Its result still has to be of a built-in type, but that's a much > weaker restriction. > Hi. So far I have the following prototype. It seems to be working, but I think it can be enhanced. At least, some sort of caching seems to be necessary for is_stable_expr(). 1) Now expression can be either 'stable shippable' or 'shippable according to old rules'. We check if it's 'stable shippable' in foreign_expr_walker(), is_foreign_param() and deparseExpr(). All such exprs are replaced by params while deparsing. 2) contain_mutable_functions() now is calculated only for current node, if node is not considered 'stable shippable'. Is it step in the right direction or do I miss something? -- Best regards, Alexander Pyhalov, Postgres Professional --=_e44aa127caac0759071e68ad1575f92c Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v04-0001-Push-down-stable-expressions.patch Content-Disposition: attachment; filename=v04-0001-Push-down-stable-expressions.patch; size=51328 RnJvbSA2MGU2ZTBiZjk4MzI2Y2I1NTdjNzBhMzY1Nzk3MDI2ZTk5MjViN2EzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgUHloYWxvdiA8YS5weWhhbG92QHBvc3RncmVz cHJvLnJ1PgpEYXRlOiBUaHUsIDI5IEp1bCAyMDIxIDExOjQ1OjI4ICswMzAwClN1YmplY3Q6IFtQ QVRDSF0gUHVzaCBkb3duIHN0YWJsZSBleHByZXNzaW9ucwoKU3RhYmxlIGV4cHJlc3Npb25zIGNh biBiZSBjb21wdXRlZCBsb2NhbGx5IGFuZCBzZW50IHRvIHJlbW90ZSBzaWRlIGFzIHBhcmFtZXRl cnMgdmFsdWVzLgotLS0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYyAgICAgICAgICAg ICAgICB8IDExNjIgKysrKysrKysrLS0tLS0tLS0KIC4uLi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQv cG9zdGdyZXNfZmR3Lm91dCAgICB8ICAgODcgKysKIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3Rn cmVzX2Zkdy5jICAgICAgICAgICB8ICAgIDkgKy0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3Rn cmVzX2Zkdy5oICAgICAgICAgICB8ICAgIDEgKwogY29udHJpYi9wb3N0Z3Jlc19mZHcvc2hpcHBh YmxlLmMgICAgICAgICAgICAgIHwgICA3NCArKwogY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bv c3RncmVzX2Zkdy5zcWwgICAgIHwgICAyMiArCiA2IGZpbGVzIGNoYW5nZWQsIDgxMSBpbnNlcnRp b25zKCspLCA1NDQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvZGVwYXJzZS5jIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCmluZGV4IGJmMTJl YWMwMjg4Li4zM2E3OTAyNjU3NCAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVw YXJzZS5jCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYwpAQCAtMTU4LDYgKzE1 OCw3IEBAIHN0YXRpYyB2b2lkIGRlcGFyc2VEaXN0aW5jdEV4cHIoRGlzdGluY3RFeHByICpub2Rl LCBkZXBhcnNlX2V4cHJfY3h0ICpjb250ZXh0KTsKIHN0YXRpYyB2b2lkIGRlcGFyc2VTY2FsYXJB cnJheU9wRXhwcihTY2FsYXJBcnJheU9wRXhwciAqbm9kZSwKIAkJCQkJCQkJCSBkZXBhcnNlX2V4 cHJfY3h0ICpjb250ZXh0KTsKIHN0YXRpYyB2b2lkIGRlcGFyc2VSZWxhYmVsVHlwZShSZWxhYmVs VHlwZSAqbm9kZSwgZGVwYXJzZV9leHByX2N4dCAqY29udGV4dCk7CitzdGF0aWMgdm9pZCBkZXBh cnNlU3RhYmxlRXhwcihFeHByICpub2RlLCBkZXBhcnNlX2V4cHJfY3h0ICpjb250ZXh0KTsKIHN0 YXRpYyB2b2lkIGRlcGFyc2VCb29sRXhwcihCb29sRXhwciAqbm9kZSwgZGVwYXJzZV9leHByX2N4 dCAqY29udGV4dCk7CiBzdGF0aWMgdm9pZCBkZXBhcnNlTnVsbFRlc3QoTnVsbFRlc3QgKm5vZGUs IGRlcGFyc2VfZXhwcl9jeHQgKmNvbnRleHQpOwogc3RhdGljIHZvaWQgZGVwYXJzZUNhc2VFeHBy KENhc2VFeHByICpub2RlLCBkZXBhcnNlX2V4cHJfY3h0ICpjb250ZXh0KTsKQEAgLTI2NywyMCAr MjY4LDE3IEBAIGlzX2ZvcmVpZ25fZXhwcihQbGFubmVySW5mbyAqcm9vdCwKIAlpZiAobG9jX2N4 dC5zdGF0ZSA9PSBGRFdfQ09MTEFURV9VTlNBRkUpCiAJCXJldHVybiBmYWxzZTsKIAotCS8qCi0J ICogQW4gZXhwcmVzc2lvbiB3aGljaCBpbmNsdWRlcyBhbnkgbXV0YWJsZSBmdW5jdGlvbnMgY2Fu J3QgYmUgc2VudCBvdmVyCi0JICogYmVjYXVzZSBpdHMgcmVzdWx0IGlzIG5vdCBzdGFibGUuICBG b3IgZXhhbXBsZSwgc2VuZGluZyBub3coKSByZW1vdGUKLQkgKiBzaWRlIGNvdWxkIGNhdXNlIGNv bmZ1c2lvbiBmcm9tIGNsb2NrIG9mZnNldHMuICBGdXR1cmUgdmVyc2lvbnMgbWlnaHQKLQkgKiBi ZSBhYmxlIHRvIG1ha2UgdGhpcyBjaG9pY2Ugd2l0aCBtb3JlIGdyYW51bGFyaXR5LiAgKFdlIGNo ZWNrIHRoaXMgbGFzdAotCSAqIGJlY2F1c2UgaXQgcmVxdWlyZXMgYSBsb3Qgb2YgZXhwZW5zaXZl IGNhdGFsb2cgbG9va3Vwcy4pCi0JICovCi0JaWYgKGNvbnRhaW5fbXV0YWJsZV9mdW5jdGlvbnMo KE5vZGUgKikgZXhwcikpCi0JCXJldHVybiBmYWxzZTsKIAogCS8qIE9LIHRvIGV2YWx1YXRlIG9u IHRoZSByZW1vdGUgc2VydmVyICovCiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sCitj b250YWluX211dGFibGVfZnVuY3Rpb25zX2NoZWNrZXIoT2lkIGZ1bmNfaWQsIHZvaWQgKmNvbnRl eHQpCit7CisJcmV0dXJuIChmdW5jX3ZvbGF0aWxlKGZ1bmNfaWQpICE9IFBST1ZPTEFUSUxFX0lN TVVUQUJMRSk7Cit9CisKIC8qCiAgKiBDaGVjayBpZiBleHByZXNzaW9uIGlzIHNhZmUgdG8gZXhl Y3V0ZSByZW1vdGVseSwgYW5kIHJldHVybiB0cnVlIGlmIHNvLgogICoKQEAgLTMyMSw2MTYgKzMx OSw2NTAgQEAgZm9yZWlnbl9leHByX3dhbGtlcihOb2RlICpub2RlLAogCWlubmVyX2N4dC5jb2xs YXRpb24gPSBJbnZhbGlkT2lkOwogCWlubmVyX2N4dC5zdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7 CiAKLQlzd2l0Y2ggKG5vZGVUYWcobm9kZSkpCisJaWYgKGlzX3N0YWJsZV9leHByKG5vZGUpKQor CXsKKwkJY29sbGF0aW9uID0gZXhwckNvbGxhdGlvbihub2RlKTsKKwkJaWYgKGNvbGxhdGlvbiA9 PSBJbnZhbGlkT2lkIHx8IGNvbGxhdGlvbiA9PSBERUZBVUxUX0NPTExBVElPTl9PSUQpCisJCQlz dGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7CisJCWVsc2UKKwkJCXN0YXRlID0gRkRXX0NPTExBVEVf VU5TQUZFOworCX0KKwllbHNlCiAJewotCQljYXNlIFRfVmFyOgotCQkJewotCQkJCVZhcgkJICAg KnZhciA9IChWYXIgKikgbm9kZTsKIAotCQkJCS8qCi0JCQkJICogSWYgdGhlIFZhciBpcyBmcm9t IHRoZSBmb3JlaWduIHRhYmxlLCB3ZSBjb25zaWRlciBpdHMKLQkJCQkgKiBjb2xsYXRpb24gKGlm IGFueSkgc2FmZSB0byB1c2UuICBJZiBpdCBpcyBmcm9tIGFub3RoZXIKLQkJCQkgKiB0YWJsZSwg d2UgdHJlYXQgaXRzIGNvbGxhdGlvbiB0aGUgc2FtZSB3YXkgYXMgd2Ugd291bGQgYQotCQkJCSAq IFBhcmFtJ3MgY29sbGF0aW9uLCBpZSBpdCdzIG5vdCBzYWZlIGZvciBpdCB0byBoYXZlIGEKLQkJ CQkgKiBub24tZGVmYXVsdCBjb2xsYXRpb24uCi0JCQkJICovCi0JCQkJaWYgKGJtc19pc19tZW1i ZXIodmFyLT52YXJubywgZ2xvYl9jeHQtPnJlbGlkcykgJiYKLQkJCQkJdmFyLT52YXJsZXZlbHN1 cCA9PSAwKQorCQkvKgorCQkgKiBBbiBleHByZXNzaW9uIHdoaWNoIGluY2x1ZGVzIGFueSBtdXRh YmxlIGZ1bmN0aW9ucyBjYW4ndCBiZSBzZW50CisJCSAqIG92ZXIgYmVjYXVzZSBpdHMgcmVzdWx0 IGlzIG5vdCBzdGFibGUuCisJCSAqLworCQlpZiAoY2hlY2tfZnVuY3Rpb25zX2luX25vZGUobm9k ZSwgY29udGFpbl9tdXRhYmxlX2Z1bmN0aW9uc19jaGVja2VyLCBOVUxMKSkKKwkJCXJldHVybiBm YWxzZTsKKworCQlzd2l0Y2ggKG5vZGVUYWcobm9kZSkpCisJCXsKKwkJCWNhc2UgVF9WYXI6CiAJ CQkJewotCQkJCQkvKiBWYXIgYmVsb25ncyB0byBmb3JlaWduIHRhYmxlICovCisJCQkJCVZhcgkJ ICAgKnZhciA9IChWYXIgKikgbm9kZTsKIAogCQkJCQkvKgotCQkJCQkgKiBTeXN0ZW0gY29sdW1u cyBvdGhlciB0aGFuIGN0aWQgc2hvdWxkIG5vdCBiZSBzZW50IHRvCi0JCQkJCSAqIHRoZSByZW1v dGUsIHNpbmNlIHdlIGRvbid0IG1ha2UgYW55IGVmZm9ydCB0byBlbnN1cmUKLQkJCQkJICogdGhh dCBsb2NhbCBhbmQgcmVtb3RlIHZhbHVlcyBtYXRjaCAodGFibGVvaWQsIGluCi0JCQkJCSAqIHBh cnRpY3VsYXIsIGFsbW9zdCBjZXJ0YWlubHkgZG9lc24ndCBtYXRjaCkuCisJCQkJCSAqIElmIHRo ZSBWYXIgaXMgZnJvbSB0aGUgZm9yZWlnbiB0YWJsZSwgd2UgY29uc2lkZXIgaXRzCisJCQkJCSAq IGNvbGxhdGlvbiAoaWYgYW55KSBzYWZlIHRvIHVzZS4gIElmIGl0IGlzIGZyb20gYW5vdGhlcgor CQkJCQkgKiB0YWJsZSwgd2UgdHJlYXQgaXRzIGNvbGxhdGlvbiB0aGUgc2FtZSB3YXkgYXMgd2Ug d291bGQKKwkJCQkJICogYSBQYXJhbSdzIGNvbGxhdGlvbiwgaWUgaXQncyBub3Qgc2FmZSBmb3Ig aXQgdG8gaGF2ZSBhCisJCQkJCSAqIG5vbi1kZWZhdWx0IGNvbGxhdGlvbi4KIAkJCQkJICovCi0J CQkJCWlmICh2YXItPnZhcmF0dG5vIDwgMCAmJgotCQkJCQkJdmFyLT52YXJhdHRubyAhPSBTZWxm SXRlbVBvaW50ZXJBdHRyaWJ1dGVOdW1iZXIpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkJ LyogRWxzZSBjaGVjayB0aGUgY29sbGF0aW9uICovCi0JCQkJCWNvbGxhdGlvbiA9IHZhci0+dmFy Y29sbGlkOwotCQkJCQlzdGF0ZSA9IE9pZElzVmFsaWQoY29sbGF0aW9uKSA/IEZEV19DT0xMQVRF X1NBRkUgOiBGRFdfQ09MTEFURV9OT05FOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkv KiBWYXIgYmVsb25ncyB0byBzb21lIG90aGVyIHRhYmxlICovCi0JCQkJCWNvbGxhdGlvbiA9IHZh ci0+dmFyY29sbGlkOwotCQkJCQlpZiAoY29sbGF0aW9uID09IEludmFsaWRPaWQgfHwKLQkJCQkJ CWNvbGxhdGlvbiA9PSBERUZBVUxUX0NPTExBVElPTl9PSUQpCisJCQkJCWlmIChibXNfaXNfbWVt YmVyKHZhci0+dmFybm8sIGdsb2JfY3h0LT5yZWxpZHMpICYmCisJCQkJCQl2YXItPnZhcmxldmVs c3VwID09IDApCiAJCQkJCXsKKwkJCQkJCS8qIFZhciBiZWxvbmdzIHRvIGZvcmVpZ24gdGFibGUg Ki8KKwogCQkJCQkJLyoKLQkJCQkJCSAqIEl0J3Mgbm9uY29sbGF0YWJsZSwgb3IgaXQncyBzYWZl IHRvIGNvbWJpbmUgd2l0aCBhCi0JCQkJCQkgKiBjb2xsYXRhYmxlIGZvcmVpZ24gVmFyLCBzbyBz ZXQgc3RhdGUgdG8gTk9ORS4KKwkJCQkJCSAqIFN5c3RlbSBjb2x1bW5zIG90aGVyIHRoYW4gY3Rp ZCBzaG91bGQgbm90IGJlIHNlbnQKKwkJCQkJCSAqIHRvIHRoZSByZW1vdGUsIHNpbmNlIHdlIGRv bid0IG1ha2UgYW55IGVmZm9ydCB0bworCQkJCQkJICogZW5zdXJlIHRoYXQgbG9jYWwgYW5kIHJl bW90ZSB2YWx1ZXMgbWF0Y2gKKwkJCQkJCSAqICh0YWJsZW9pZCwgaW4gcGFydGljdWxhciwgYWxt b3N0IGNlcnRhaW5seSBkb2Vzbid0CisJCQkJCQkgKiBtYXRjaCkuCiAJCQkJCQkgKi8KLQkJCQkJ CXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKKwkJCQkJCWlmICh2YXItPnZhcmF0dG5vIDwgMCAm JgorCQkJCQkJCXZhci0+dmFyYXR0bm8gIT0gU2VsZkl0ZW1Qb2ludGVyQXR0cmlidXRlTnVtYmVy KQorCQkJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCQkJLyogRWxzZSBjaGVjayB0aGUgY29sbGF0 aW9uICovCisJCQkJCQljb2xsYXRpb24gPSB2YXItPnZhcmNvbGxpZDsKKwkJCQkJCXN0YXRlID0g T2lkSXNWYWxpZChjb2xsYXRpb24pID8gRkRXX0NPTExBVEVfU0FGRSA6IEZEV19DT0xMQVRFX05P TkU7CiAJCQkJCX0KIAkJCQkJZWxzZQogCQkJCQl7Ci0JCQkJCQkvKgotCQkJCQkJICogRG8gbm90 IGZhaWwgcmlnaHQgYXdheSwgc2luY2UgdGhlIFZhciBtaWdodCBhcHBlYXIKLQkJCQkJCSAqIGlu IGEgY29sbGF0aW9uLWluc2Vuc2l0aXZlIGNvbnRleHQuCi0JCQkJCQkgKi8KLQkJCQkJCXN0YXRl ID0gRkRXX0NPTExBVEVfVU5TQUZFOworCQkJCQkJLyogVmFyIGJlbG9uZ3MgdG8gc29tZSBvdGhl ciB0YWJsZSAqLworCQkJCQkJY29sbGF0aW9uID0gdmFyLT52YXJjb2xsaWQ7CisJCQkJCQlpZiAo Y29sbGF0aW9uID09IEludmFsaWRPaWQgfHwKKwkJCQkJCQljb2xsYXRpb24gPT0gREVGQVVMVF9D T0xMQVRJT05fT0lEKQorCQkJCQkJeworCQkJCQkJCS8qCisJCQkJCQkJICogSXQncyBub25jb2xs YXRhYmxlLCBvciBpdCdzIHNhZmUgdG8gY29tYmluZQorCQkJCQkJCSAqIHdpdGggYSBjb2xsYXRh YmxlIGZvcmVpZ24gVmFyLCBzbyBzZXQgc3RhdGUgdG8KKwkJCQkJCQkgKiBOT05FLgorCQkJCQkJ CSAqLworCQkJCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKKwkJCQkJCX0KKwkJCQkJCWVs c2UKKwkJCQkJCXsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIERvIG5vdCBmYWlsIHJpZ2h0IGF3YXks IHNpbmNlIHRoZSBWYXIgbWlnaHQKKwkJCQkJCQkgKiBhcHBlYXIgaW4gYSBjb2xsYXRpb24taW5z ZW5zaXRpdmUgY29udGV4dC4KKwkJCQkJCQkgKi8KKwkJCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRF X1VOU0FGRTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNl IFRfQ29uc3Q6Ci0JCQl7Ci0JCQkJQ29uc3QJICAgKmMgPSAoQ29uc3QgKikgbm9kZTsKKwkJCQli cmVhazsKKwkJCWNhc2UgVF9Db25zdDoKKwkJCQl7CisJCQkJCUNvbnN0CSAgICpjID0gKENvbnN0 ICopIG5vZGU7CiAKLQkJCQkvKgotCQkJCSAqIElmIHRoZSBjb25zdGFudCBoYXMgbm9uZGVmYXVs dCBjb2xsYXRpb24sIGVpdGhlciBpdCdzIG9mIGEKLQkJCQkgKiBub24tYnVpbHRpbiB0eXBlLCBv ciBpdCByZWZsZWN0cyBmb2xkaW5nIG9mIGEgQ29sbGF0ZUV4cHIuCi0JCQkJICogSXQncyB1bnNh ZmUgdG8gc2VuZCB0byB0aGUgcmVtb3RlIHVubGVzcyBpdCdzIHVzZWQgaW4gYQotCQkJCSAqIG5v bi1jb2xsYXRpb24tc2Vuc2l0aXZlIGNvbnRleHQuCi0JCQkJICovCi0JCQkJY29sbGF0aW9uID0g Yy0+Y29uc3Rjb2xsaWQ7Ci0JCQkJaWYgKGNvbGxhdGlvbiA9PSBJbnZhbGlkT2lkIHx8Ci0JCQkJ CWNvbGxhdGlvbiA9PSBERUZBVUxUX0NPTExBVElPTl9PSUQpCi0JCQkJCXN0YXRlID0gRkRXX0NP TExBVEVfTk9ORTsKLQkJCQllbHNlCi0JCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfVU5TQUZFOwot CQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVF9QYXJhbToKLQkJCXsKLQkJCQlQYXJhbQkgICAqcCA9 IChQYXJhbSAqKSBub2RlOworCQkJCQkvKgorCQkJCQkgKiBJZiB0aGUgY29uc3RhbnQgaGFzIG5v bmRlZmF1bHQgY29sbGF0aW9uLCBlaXRoZXIgaXQncworCQkJCQkgKiBvZiBhIG5vbi1idWlsdGlu IHR5cGUsIG9yIGl0IHJlZmxlY3RzIGZvbGRpbmcgb2YgYQorCQkJCQkgKiBDb2xsYXRlRXhwci4g SXQncyB1bnNhZmUgdG8gc2VuZCB0byB0aGUgcmVtb3RlIHVubGVzcworCQkJCQkgKiBpdCdzIHVz ZWQgaW4gYSBub24tY29sbGF0aW9uLXNlbnNpdGl2ZSBjb250ZXh0LgorCQkJCQkgKi8KKwkJCQkJ Y29sbGF0aW9uID0gYy0+Y29uc3Rjb2xsaWQ7CisJCQkJCWlmIChjb2xsYXRpb24gPT0gSW52YWxp ZE9pZCB8fAorCQkJCQkJY29sbGF0aW9uID09IERFRkFVTFRfQ09MTEFUSU9OX09JRCkKKwkJCQkJ CXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKKwkJCQkJZWxzZQorCQkJCQkJc3RhdGUgPSBGRFdf Q09MTEFURV9VTlNBRkU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUX1BhcmFtOgorCQkJ CXsKKwkJCQkJUGFyYW0JICAgKnAgPSAoUGFyYW0gKikgbm9kZTsKIAotCQkJCS8qCi0JCQkJICog SWYgaXQncyBhIE1VTFRJRVhQUiBQYXJhbSwgcHVudC4gIFdlIGNhbid0IHRlbGwgZnJvbSBoZXJl Ci0JCQkJICogd2hldGhlciB0aGUgcmVmZXJlbmNlZCBzdWJsaW5rL3N1YnBsYW4gY29udGFpbnMg YW55IHJlbW90ZQotCQkJCSAqIFZhcnM7IGlmIGl0IGRvZXMsIGhhbmRsaW5nIHRoYXQgaXMgdG9v IGNvbXBsaWNhdGVkIHRvCi0JCQkJICogY29uc2lkZXIgc3VwcG9ydGluZyBhdCBwcmVzZW50LiAg Rm9ydHVuYXRlbHksIE1VTFRJRVhQUgotCQkJCSAqIFBhcmFtcyBhcmUgbm90IHJlZHVjZWQgdG8g cGxhaW4gUEFSQU1fRVhFQyB1bnRpbCB0aGUgZW5kIG9mCi0JCQkJICogcGxhbm5pbmcsIHNvIHdl IGNhbiBlYXNpbHkgZGV0ZWN0IHRoaXMgY2FzZS4gIChOb3JtYWwKLQkJCQkgKiBQQVJBTV9FWEVD IFBhcmFtcyBhcmUgc2FmZSB0byBzaGlwIGJlY2F1c2UgdGhlaXIgdmFsdWVzCi0JCQkJICogY29t ZSBmcm9tIHNvbWV3aGVyZSBlbHNlIGluIHRoZSBwbGFuIHRyZWU7IGJ1dCBhIE1VTFRJRVhQUgot CQkJCSAqIHJlZmVyZW5jZXMgYSBzdWItc2VsZWN0IGVsc2V3aGVyZSBpbiB0aGUgc2FtZSB0YXJn ZXRsaXN0LAotCQkJCSAqIHNvIHdlJ2QgYmUgb24gdGhlIGhvb2sgdG8gZXZhbHVhdGUgaXQgc29t ZWhvdyBpZiB3ZSB3YW50ZWQKLQkJCQkgKiB0byBoYW5kbGUgc3VjaCBjYXNlcyBhcyBkaXJlY3Qg Zm9yZWlnbiB1cGRhdGVzLikKLQkJCQkgKi8KLQkJCQlpZiAocC0+cGFyYW1raW5kID09IFBBUkFN X01VTFRJRVhQUikKLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkvKgorCQkJCQkgKiBJZiBpdCdz IGEgTVVMVElFWFBSIFBhcmFtLCBwdW50LiAgV2UgY2FuJ3QgdGVsbCBmcm9tCisJCQkJCSAqIGhl cmUgd2hldGhlciB0aGUgcmVmZXJlbmNlZCBzdWJsaW5rL3N1YnBsYW4gY29udGFpbnMKKwkJCQkJ ICogYW55IHJlbW90ZSBWYXJzOyBpZiBpdCBkb2VzLCBoYW5kbGluZyB0aGF0IGlzIHRvbworCQkJ CQkgKiBjb21wbGljYXRlZCB0byBjb25zaWRlciBzdXBwb3J0aW5nIGF0IHByZXNlbnQuCisJCQkJ CSAqIEZvcnR1bmF0ZWx5LCBNVUxUSUVYUFIgUGFyYW1zIGFyZSBub3QgcmVkdWNlZCB0byBwbGFp bgorCQkJCQkgKiBQQVJBTV9FWEVDIHVudGlsIHRoZSBlbmQgb2YgcGxhbm5pbmcsIHNvIHdlIGNh biBlYXNpbHkKKwkJCQkJICogZGV0ZWN0IHRoaXMgY2FzZS4gIChOb3JtYWwgUEFSQU1fRVhFQyBQ YXJhbXMgYXJlIHNhZmUKKwkJCQkJICogdG8gc2hpcCBiZWNhdXNlIHRoZWlyIHZhbHVlcyBjb21l IGZyb20gc29tZXdoZXJlIGVsc2UKKwkJCQkJICogaW4gdGhlIHBsYW4gdHJlZTsgYnV0IGEgTVVM VElFWFBSIHJlZmVyZW5jZXMgYQorCQkJCQkgKiBzdWItc2VsZWN0IGVsc2V3aGVyZSBpbiB0aGUg c2FtZSB0YXJnZXRsaXN0LCBzbyB3ZSdkIGJlCisJCQkJCSAqIG9uIHRoZSBob29rIHRvIGV2YWx1 YXRlIGl0IHNvbWVob3cgaWYgd2Ugd2FudGVkIHRvCisJCQkJCSAqIGhhbmRsZSBzdWNoIGNhc2Vz IGFzIGRpcmVjdCBmb3JlaWduIHVwZGF0ZXMuKQorCQkJCQkgKi8KKwkJCQkJaWYgKHAtPnBhcmFt a2luZCA9PSBQQVJBTV9NVUxUSUVYUFIpCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKgot CQkJCSAqIENvbGxhdGlvbiBydWxlIGlzIHNhbWUgYXMgZm9yIENvbnN0cyBhbmQgbm9uLWZvcmVp Z24gVmFycy4KLQkJCQkgKi8KLQkJCQljb2xsYXRpb24gPSBwLT5wYXJhbWNvbGxpZDsKLQkJCQlp ZiAoY29sbGF0aW9uID09IEludmFsaWRPaWQgfHwKLQkJCQkJY29sbGF0aW9uID09IERFRkFVTFRf Q09MTEFUSU9OX09JRCkKLQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOwotCQkJCWVsc2UK LQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9VTlNBRkU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2Fz ZSBUX1N1YnNjcmlwdGluZ1JlZjoKLQkJCXsKLQkJCQlTdWJzY3JpcHRpbmdSZWYgKnNyID0gKFN1 YnNjcmlwdGluZ1JlZiAqKSBub2RlOworCQkJCQkvKgorCQkJCQkgKiBDb2xsYXRpb24gcnVsZSBp cyBzYW1lIGFzIGZvciBDb25zdHMgYW5kIG5vbi1mb3JlaWduCisJCQkJCSAqIFZhcnMuCisJCQkJ CSAqLworCQkJCQljb2xsYXRpb24gPSBwLT5wYXJhbWNvbGxpZDsKKwkJCQkJaWYgKGNvbGxhdGlv biA9PSBJbnZhbGlkT2lkIHx8CisJCQkJCQljb2xsYXRpb24gPT0gREVGQVVMVF9DT0xMQVRJT05f T0lEKQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOworCQkJCQllbHNlCisJCQkJCQlz dGF0ZSA9IEZEV19DT0xMQVRFX1VOU0FGRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRf U3Vic2NyaXB0aW5nUmVmOgorCQkJCXsKKwkJCQkJU3Vic2NyaXB0aW5nUmVmICpzciA9IChTdWJz Y3JpcHRpbmdSZWYgKikgbm9kZTsKIAotCQkJCS8qIEFzc2lnbm1lbnQgc2hvdWxkIG5vdCBiZSBp biByZXN0cmljdGlvbnMuICovCi0JCQkJaWYgKHNyLT5yZWZhc3NnbmV4cHIgIT0gTlVMTCkKLQkJ CQkJcmV0dXJuIGZhbHNlOworCQkJCQkvKiBBc3NpZ25tZW50IHNob3VsZCBub3QgYmUgaW4gcmVz dHJpY3Rpb25zLiAqLworCQkJCQlpZiAoc3ItPnJlZmFzc2duZXhwciAhPSBOVUxMKQorCQkJCQkJ cmV0dXJuIGZhbHNlOwogCi0JCQkJLyoKLQkJCQkgKiBSZWN1cnNlIGludG8gdGhlIHJlbWFpbmlu ZyBzdWJleHByZXNzaW9ucy4gIFRoZSBjb250YWluZXIKLQkJCQkgKiBzdWJzY3JpcHRzIHdpbGwg bm90IGFmZmVjdCBjb2xsYXRpb24gb2YgdGhlIFN1YnNjcmlwdGluZ1JlZgotCQkJCSAqIHJlc3Vs dCwgc28gZG8gdGhvc2UgZmlyc3QgYW5kIHJlc2V0IGlubmVyX2N4dCBhZnRlcndhcmRzLgotCQkJ CSAqLwotCQkJCWlmICghZm9yZWlnbl9leHByX3dhbGtlcigoTm9kZSAqKSBzci0+cmVmdXBwZXJp bmRleHByLAotCQkJCQkJCQkJCSBnbG9iX2N4dCwgJmlubmVyX2N4dCwgY2FzZV9hcmdfY3h0KSkK LQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlubmVyX2N4dC5jb2xsYXRpb24gPSBJbnZhbGlkT2lk OwotCQkJCWlubmVyX2N4dC5zdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7Ci0JCQkJaWYgKCFmb3Jl aWduX2V4cHJfd2Fsa2VyKChOb2RlICopIHNyLT5yZWZsb3dlcmluZGV4cHIsCi0JCQkJCQkJCQkJ IGdsb2JfY3h0LCAmaW5uZXJfY3h0LCBjYXNlX2FyZ19jeHQpKQotCQkJCQlyZXR1cm4gZmFsc2U7 Ci0JCQkJaW5uZXJfY3h0LmNvbGxhdGlvbiA9IEludmFsaWRPaWQ7Ci0JCQkJaW5uZXJfY3h0LnN0 YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKLQkJCQlpZiAoIWZvcmVpZ25fZXhwcl93YWxrZXIoKE5v ZGUgKikgc3ItPnJlZmV4cHIsCi0JCQkJCQkJCQkJIGdsb2JfY3h0LCAmaW5uZXJfY3h0LCBjYXNl X2FyZ19jeHQpKQotCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCS8qCisJCQkJCSAqIFJlY3Vyc2Ug aW50byB0aGUgcmVtYWluaW5nIHN1YmV4cHJlc3Npb25zLiAgVGhlCisJCQkJCSAqIGNvbnRhaW5l ciBzdWJzY3JpcHRzIHdpbGwgbm90IGFmZmVjdCBjb2xsYXRpb24gb2YgdGhlCisJCQkJCSAqIFN1 YnNjcmlwdGluZ1JlZiByZXN1bHQsIHNvIGRvIHRob3NlIGZpcnN0IGFuZCByZXNldAorCQkJCQkg KiBpbm5lcl9jeHQgYWZ0ZXJ3YXJkcy4KKwkJCQkJICovCisJCQkJCWlmICghZm9yZWlnbl9leHBy X3dhbGtlcigoTm9kZSAqKSBzci0+cmVmdXBwZXJpbmRleHByLAorCQkJCQkJCQkJCQkgZ2xvYl9j eHQsICZpbm5lcl9jeHQsIGNhc2VfYXJnX2N4dCkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJ CWlubmVyX2N4dC5jb2xsYXRpb24gPSBJbnZhbGlkT2lkOworCQkJCQlpbm5lcl9jeHQuc3RhdGUg PSBGRFdfQ09MTEFURV9OT05FOworCQkJCQlpZiAoIWZvcmVpZ25fZXhwcl93YWxrZXIoKE5vZGUg Kikgc3ItPnJlZmxvd2VyaW5kZXhwciwKKwkJCQkJCQkJCQkJIGdsb2JfY3h0LCAmaW5uZXJfY3h0 LCBjYXNlX2FyZ19jeHQpKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQlpbm5lcl9jeHQuY29s bGF0aW9uID0gSW52YWxpZE9pZDsKKwkJCQkJaW5uZXJfY3h0LnN0YXRlID0gRkRXX0NPTExBVEVf Tk9ORTsKKwkJCQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIHNyLT5yZWZleHBy LAorCQkJCQkJCQkJCQkgZ2xvYl9jeHQsICZpbm5lcl9jeHQsIGNhc2VfYXJnX2N4dCkpCisJCQkJ CQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKgotCQkJCSAqIENvbnRhaW5lciBzdWJzY3JpcHRpbmcg dHlwaWNhbGx5IHlpZWxkcyBzYW1lIGNvbGxhdGlvbiBhcwotCQkJCSAqIHJlZmV4cHIncywgYnV0 IGluIGNhc2UgaXQgZG9lc24ndCwgdXNlIHNhbWUgbG9naWMgYXMgZm9yCi0JCQkJICogZnVuY3Rp b24gbm9kZXMuCi0JCQkJICovCi0JCQkJY29sbGF0aW9uID0gc3ItPnJlZmNvbGxpZDsKLQkJCQlp ZiAoY29sbGF0aW9uID09IEludmFsaWRPaWQpCi0JCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfTk9O RTsKLQkJCQllbHNlIGlmIChpbm5lcl9jeHQuc3RhdGUgPT0gRkRXX0NPTExBVEVfU0FGRSAmJgot CQkJCQkJIGNvbGxhdGlvbiA9PSBpbm5lcl9jeHQuY29sbGF0aW9uKQotCQkJCQlzdGF0ZSA9IEZE V19DT0xMQVRFX1NBRkU7Ci0JCQkJZWxzZSBpZiAoY29sbGF0aW9uID09IERFRkFVTFRfQ09MTEFU SU9OX09JRCkKLQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOwotCQkJCWVsc2UKLQkJCQkJ c3RhdGUgPSBGRFdfQ09MTEFURV9VTlNBRkU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBUX0Z1 bmNFeHByOgotCQkJewotCQkJCUZ1bmNFeHByICAgKmZlID0gKEZ1bmNFeHByICopIG5vZGU7CisJ CQkJCS8qCisJCQkJCSAqIENvbnRhaW5lciBzdWJzY3JpcHRpbmcgdHlwaWNhbGx5IHlpZWxkcyBz YW1lIGNvbGxhdGlvbgorCQkJCQkgKiBhcyByZWZleHByJ3MsIGJ1dCBpbiBjYXNlIGl0IGRvZXNu J3QsIHVzZSBzYW1lIGxvZ2ljIGFzCisJCQkJCSAqIGZvciBmdW5jdGlvbiBub2Rlcy4KKwkJCQkJ ICovCisJCQkJCWNvbGxhdGlvbiA9IHNyLT5yZWZjb2xsaWQ7CisJCQkJCWlmIChjb2xsYXRpb24g PT0gSW52YWxpZE9pZCkKKwkJCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKKwkJCQkJZWxz ZSBpZiAoaW5uZXJfY3h0LnN0YXRlID09IEZEV19DT0xMQVRFX1NBRkUgJiYKKwkJCQkJCQkgY29s bGF0aW9uID09IGlubmVyX2N4dC5jb2xsYXRpb24pCisJCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRF X1NBRkU7CisJCQkJCWVsc2UgaWYgKGNvbGxhdGlvbiA9PSBERUZBVUxUX0NPTExBVElPTl9PSUQp CisJCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7CisJCQkJCWVsc2UKKwkJCQkJCXN0YXRl ID0gRkRXX0NPTExBVEVfVU5TQUZFOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVF9GdW5j RXhwcjoKKwkJCQl7CisJCQkJCUZ1bmNFeHByICAgKmZlID0gKEZ1bmNFeHByICopIG5vZGU7CiAK LQkJCQkvKgotCQkJCSAqIElmIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGV4cHJlc3Npb24gaXMgbm90 IHNoaXBwYWJsZSwgaXQKLQkJCQkgKiBjYW4ndCBiZSBzZW50IHRvIHJlbW90ZSBiZWNhdXNlIGl0 IG1pZ2h0IGhhdmUgaW5jb21wYXRpYmxlCi0JCQkJICogc2VtYW50aWNzIG9uIHJlbW90ZSBzaWRl LgotCQkJCSAqLwotCQkJCWlmICghaXNfc2hpcHBhYmxlKGZlLT5mdW5jaWQsIFByb2NlZHVyZVJl bGF0aW9uSWQsIGZwaW5mbykpCi0JCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJLyoKKwkJCQkJICog SWYgZnVuY3Rpb24gdXNlZCBieSB0aGUgZXhwcmVzc2lvbiBpcyBub3Qgc2hpcHBhYmxlLCBpdAor CQkJCQkgKiBjYW4ndCBiZSBzZW50IHRvIHJlbW90ZSBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUKKwkJ CQkJICogaW5jb21wYXRpYmxlIHNlbWFudGljcyBvbiByZW1vdGUgc2lkZS4KKwkJCQkJICovCisJ CQkJCWlmICghaXNfc2hpcHBhYmxlKGZlLT5mdW5jaWQsIFByb2NlZHVyZVJlbGF0aW9uSWQsIGZw aW5mbykpCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKgotCQkJCSAqIFJlY3Vyc2UgdG8g aW5wdXQgc3ViZXhwcmVzc2lvbnMuCi0JCQkJICovCi0JCQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fs a2VyKChOb2RlICopIGZlLT5hcmdzLAotCQkJCQkJCQkJCSBnbG9iX2N4dCwgJmlubmVyX2N4dCwg Y2FzZV9hcmdfY3h0KSkKLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkvKgorCQkJCQkgKiBSZWN1 cnNlIHRvIGlucHV0IHN1YmV4cHJlc3Npb25zLgorCQkJCQkgKi8KKwkJCQkJaWYgKCFmb3JlaWdu X2V4cHJfd2Fsa2VyKChOb2RlICopIGZlLT5hcmdzLAorCQkJCQkJCQkJCQkgZ2xvYl9jeHQsICZp bm5lcl9jeHQsIGNhc2VfYXJnX2N4dCkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKgot CQkJCSAqIElmIGZ1bmN0aW9uJ3MgaW5wdXQgY29sbGF0aW9uIGlzIG5vdCBkZXJpdmVkIGZyb20g YSBmb3JlaWduCi0JCQkJICogVmFyLCBpdCBjYW4ndCBiZSBzZW50IHRvIHJlbW90ZS4KLQkJCQkg Ki8KLQkJCQlpZiAoZmUtPmlucHV0Y29sbGlkID09IEludmFsaWRPaWQpCi0JCQkJCSAvKiBPSywg aW5wdXRzIGFyZSBhbGwgbm9uY29sbGF0YWJsZSAqLyA7Ci0JCQkJZWxzZSBpZiAoaW5uZXJfY3h0 LnN0YXRlICE9IEZEV19DT0xMQVRFX1NBRkUgfHwKLQkJCQkJCSBmZS0+aW5wdXRjb2xsaWQgIT0g aW5uZXJfY3h0LmNvbGxhdGlvbikKLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkvKgorCQkJCQkg KiBJZiBmdW5jdGlvbidzIGlucHV0IGNvbGxhdGlvbiBpcyBub3QgZGVyaXZlZCBmcm9tIGEKKwkJ CQkJICogZm9yZWlnbiBWYXIsIGl0IGNhbid0IGJlIHNlbnQgdG8gcmVtb3RlLgorCQkJCQkgKi8K KwkJCQkJaWYgKGZlLT5pbnB1dGNvbGxpZCA9PSBJbnZhbGlkT2lkKQorCQkJCQkJIC8qIE9LLCBp bnB1dHMgYXJlIGFsbCBub25jb2xsYXRhYmxlICovIDsKKwkJCQkJZWxzZSBpZiAoaW5uZXJfY3h0 LnN0YXRlICE9IEZEV19DT0xMQVRFX1NBRkUgfHwKKwkJCQkJCQkgZmUtPmlucHV0Y29sbGlkICE9 IGlubmVyX2N4dC5jb2xsYXRpb24pCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKgotCQkJ CSAqIERldGVjdCB3aGV0aGVyIG5vZGUgaXMgaW50cm9kdWNpbmcgYSBjb2xsYXRpb24gbm90IGRl cml2ZWQKLQkJCQkgKiBmcm9tIGEgZm9yZWlnbiBWYXIuICAoSWYgc28sIHdlIGp1c3QgbWFyayBp dCB1bnNhZmUgZm9yIG5vdwotCQkJCSAqIHJhdGhlciB0aGFuIGltbWVkaWF0ZWx5IHJldHVybmlu ZyBmYWxzZSwgc2luY2UgdGhlIHBhcmVudAotCQkJCSAqIG5vZGUgbWlnaHQgbm90IGNhcmUuKQot CQkJCSAqLwotCQkJCWNvbGxhdGlvbiA9IGZlLT5mdW5jY29sbGlkOwotCQkJCWlmIChjb2xsYXRp b24gPT0gSW52YWxpZE9pZCkKLQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOwotCQkJCWVs c2UgaWYgKGlubmVyX2N4dC5zdGF0ZSA9PSBGRFdfQ09MTEFURV9TQUZFICYmCi0JCQkJCQkgY29s bGF0aW9uID09IGlubmVyX2N4dC5jb2xsYXRpb24pCi0JCQkJCXN0YXRlID0gRkRXX0NPTExBVEVf U0FGRTsKLQkJCQllbHNlIGlmIChjb2xsYXRpb24gPT0gREVGQVVMVF9DT0xMQVRJT05fT0lEKQot CQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEZE V19DT0xMQVRFX1VOU0FGRTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFRfT3BFeHByOgotCQlj YXNlIFRfRGlzdGluY3RFeHByOgkvKiBzdHJ1Y3QtZXF1aXZhbGVudCB0byBPcEV4cHIgKi8KLQkJ CXsKLQkJCQlPcEV4cHIJICAgKm9lID0gKE9wRXhwciAqKSBub2RlOworCQkJCQkvKgorCQkJCQkg KiBEZXRlY3Qgd2hldGhlciBub2RlIGlzIGludHJvZHVjaW5nIGEgY29sbGF0aW9uIG5vdAorCQkJ CQkgKiBkZXJpdmVkIGZyb20gYSBmb3JlaWduIFZhci4gIChJZiBzbywgd2UganVzdCBtYXJrIGl0 CisJCQkJCSAqIHVuc2FmZSBmb3Igbm93IHJhdGhlciB0aGFuIGltbWVkaWF0ZWx5IHJldHVybmlu ZyBmYWxzZSwKKwkJCQkJICogc2luY2UgdGhlIHBhcmVudCBub2RlIG1pZ2h0IG5vdCBjYXJlLikK KwkJCQkJICovCisJCQkJCWNvbGxhdGlvbiA9IGZlLT5mdW5jY29sbGlkOworCQkJCQlpZiAoY29s bGF0aW9uID09IEludmFsaWRPaWQpCisJCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7CisJ CQkJCWVsc2UgaWYgKGlubmVyX2N4dC5zdGF0ZSA9PSBGRFdfQ09MTEFURV9TQUZFICYmCisJCQkJ CQkJIGNvbGxhdGlvbiA9PSBpbm5lcl9jeHQuY29sbGF0aW9uKQorCQkJCQkJc3RhdGUgPSBGRFdf Q09MTEFURV9TQUZFOworCQkJCQllbHNlIGlmIChjb2xsYXRpb24gPT0gREVGQVVMVF9DT0xMQVRJ T05fT0lEKQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOworCQkJCQllbHNlCisJCQkJ CQlzdGF0ZSA9IEZEV19DT0xMQVRFX1VOU0FGRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNl IFRfT3BFeHByOgorCQkJY2FzZSBUX0Rpc3RpbmN0RXhwcjoJLyogc3RydWN0LWVxdWl2YWxlbnQg dG8gT3BFeHByICovCisJCQkJeworCQkJCQlPcEV4cHIJICAgKm9lID0gKE9wRXhwciAqKSBub2Rl OwogCi0JCQkJLyoKLQkJCQkgKiBTaW1pbGFybHksIG9ubHkgc2hpcHBhYmxlIG9wZXJhdG9ycyBj YW4gYmUgc2VudCB0byByZW1vdGUuCi0JCQkJICogKElmIHRoZSBvcGVyYXRvciBpcyBzaGlwcGFi bGUsIHdlIGFzc3VtZSBpdHMgdW5kZXJseWluZwotCQkJCSAqIGZ1bmN0aW9uIGlzIHRvby4pCi0J CQkJICovCi0JCQkJaWYgKCFpc19zaGlwcGFibGUob2UtPm9wbm8sIE9wZXJhdG9yUmVsYXRpb25J ZCwgZnBpbmZvKSkKLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkvKgorCQkJCQkgKiBTaW1pbGFy bHksIG9ubHkgc2hpcHBhYmxlIG9wZXJhdG9ycyBjYW4gYmUgc2VudCB0bworCQkJCQkgKiByZW1v dGUuIChJZiB0aGUgb3BlcmF0b3IgaXMgc2hpcHBhYmxlLCB3ZSBhc3N1bWUgaXRzCisJCQkJCSAq IHVuZGVybHlpbmcgZnVuY3Rpb24gaXMgdG9vLikKKwkJCQkJICovCisJCQkJCWlmICghaXNfc2hp cHBhYmxlKG9lLT5vcG5vLCBPcGVyYXRvclJlbGF0aW9uSWQsIGZwaW5mbykpCisJCQkJCQlyZXR1 cm4gZmFsc2U7CiAKLQkJCQkvKgotCQkJCSAqIFJlY3Vyc2UgdG8gaW5wdXQgc3ViZXhwcmVzc2lv bnMuCi0JCQkJICovCi0JCQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIG9lLT5h cmdzLAotCQkJCQkJCQkJCSBnbG9iX2N4dCwgJmlubmVyX2N4dCwgY2FzZV9hcmdfY3h0KSkKLQkJ CQkJcmV0dXJuIGZhbHNlOworCQkJCQkvKgorCQkJCQkgKiBSZWN1cnNlIHRvIGlucHV0IHN1YmV4 cHJlc3Npb25zLgorCQkJCQkgKi8KKwkJCQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2Rl ICopIG9lLT5hcmdzLAorCQkJCQkJCQkJCQkgZ2xvYl9jeHQsICZpbm5lcl9jeHQsIGNhc2VfYXJn X2N4dCkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKgotCQkJCSAqIElmIG9wZXJhdG9y J3MgaW5wdXQgY29sbGF0aW9uIGlzIG5vdCBkZXJpdmVkIGZyb20gYSBmb3JlaWduCi0JCQkJICog VmFyLCBpdCBjYW4ndCBiZSBzZW50IHRvIHJlbW90ZS4KLQkJCQkgKi8KLQkJCQlpZiAob2UtPmlu cHV0Y29sbGlkID09IEludmFsaWRPaWQpCi0JCQkJCSAvKiBPSywgaW5wdXRzIGFyZSBhbGwgbm9u Y29sbGF0YWJsZSAqLyA7Ci0JCQkJZWxzZSBpZiAoaW5uZXJfY3h0LnN0YXRlICE9IEZEV19DT0xM QVRFX1NBRkUgfHwKLQkJCQkJCSBvZS0+aW5wdXRjb2xsaWQgIT0gaW5uZXJfY3h0LmNvbGxhdGlv bikKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJLyogUmVzdWx0LWNvbGxhdGlvbiBoYW5kbGlu ZyBpcyBzYW1lIGFzIGZvciBmdW5jdGlvbnMgKi8KLQkJCQljb2xsYXRpb24gPSBvZS0+b3Bjb2xs aWQ7Ci0JCQkJaWYgKGNvbGxhdGlvbiA9PSBJbnZhbGlkT2lkKQotCQkJCQlzdGF0ZSA9IEZEV19D T0xMQVRFX05PTkU7Ci0JCQkJZWxzZSBpZiAoaW5uZXJfY3h0LnN0YXRlID09IEZEV19DT0xMQVRF X1NBRkUgJiYKLQkJCQkJCSBjb2xsYXRpb24gPT0gaW5uZXJfY3h0LmNvbGxhdGlvbikKLQkJCQkJ c3RhdGUgPSBGRFdfQ09MTEFURV9TQUZFOwotCQkJCWVsc2UgaWYgKGNvbGxhdGlvbiA9PSBERUZB VUxUX0NPTExBVElPTl9PSUQpCi0JCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKLQkJCQll bHNlCi0JCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfVU5TQUZFOwotCQkJfQotCQkJYnJlYWs7Ci0J CWNhc2UgVF9TY2FsYXJBcnJheU9wRXhwcjoKLQkJCXsKLQkJCQlTY2FsYXJBcnJheU9wRXhwciAq b2UgPSAoU2NhbGFyQXJyYXlPcEV4cHIgKikgbm9kZTsKKwkJCQkJLyoKKwkJCQkJICogSWYgb3Bl cmF0b3IncyBpbnB1dCBjb2xsYXRpb24gaXMgbm90IGRlcml2ZWQgZnJvbSBhCisJCQkJCSAqIGZv cmVpZ24gVmFyLCBpdCBjYW4ndCBiZSBzZW50IHRvIHJlbW90ZS4KKwkJCQkJICovCisJCQkJCWlm IChvZS0+aW5wdXRjb2xsaWQgPT0gSW52YWxpZE9pZCkKKwkJCQkJCSAvKiBPSywgaW5wdXRzIGFy ZSBhbGwgbm9uY29sbGF0YWJsZSAqLyA7CisJCQkJCWVsc2UgaWYgKGlubmVyX2N4dC5zdGF0ZSAh PSBGRFdfQ09MTEFURV9TQUZFIHx8CisJCQkJCQkJIG9lLT5pbnB1dGNvbGxpZCAhPSBpbm5lcl9j eHQuY29sbGF0aW9uKQorCQkJCQkJcmV0dXJuIGZhbHNlOwogCi0JCQkJLyoKLQkJCQkgKiBBZ2Fp biwgb25seSBzaGlwcGFibGUgb3BlcmF0b3JzIGNhbiBiZSBzZW50IHRvIHJlbW90ZS4KLQkJCQkg Ki8KLQkJCQlpZiAoIWlzX3NoaXBwYWJsZShvZS0+b3BubywgT3BlcmF0b3JSZWxhdGlvbklkLCBm cGluZm8pKQotCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCS8qIFJlc3VsdC1jb2xsYXRpb24gaGFu ZGxpbmcgaXMgc2FtZSBhcyBmb3IgZnVuY3Rpb25zICovCisJCQkJCWNvbGxhdGlvbiA9IG9lLT5v cGNvbGxpZDsKKwkJCQkJaWYgKGNvbGxhdGlvbiA9PSBJbnZhbGlkT2lkKQorCQkJCQkJc3RhdGUg PSBGRFdfQ09MTEFURV9OT05FOworCQkJCQllbHNlIGlmIChpbm5lcl9jeHQuc3RhdGUgPT0gRkRX X0NPTExBVEVfU0FGRSAmJgorCQkJCQkJCSBjb2xsYXRpb24gPT0gaW5uZXJfY3h0LmNvbGxhdGlv bikKKwkJCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfU0FGRTsKKwkJCQkJZWxzZSBpZiAoY29sbGF0 aW9uID09IERFRkFVTFRfQ09MTEFUSU9OX09JRCkKKwkJCQkJCXN0YXRlID0gRkRXX0NPTExBVEVf Tk9ORTsKKwkJCQkJZWxzZQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9VTlNBRkU7CisJCQkJ fQorCQkJCWJyZWFrOworCQkJY2FzZSBUX1NjYWxhckFycmF5T3BFeHByOgorCQkJCXsKKwkJCQkJ U2NhbGFyQXJyYXlPcEV4cHIgKm9lID0gKFNjYWxhckFycmF5T3BFeHByICopIG5vZGU7CiAKLQkJ CQkvKgotCQkJCSAqIFJlY3Vyc2UgdG8gaW5wdXQgc3ViZXhwcmVzc2lvbnMuCi0JCQkJICovCi0J CQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIG9lLT5hcmdzLAotCQkJCQkJCQkJ CSBnbG9iX2N4dCwgJmlubmVyX2N4dCwgY2FzZV9hcmdfY3h0KSkKLQkJCQkJcmV0dXJuIGZhbHNl OworCQkJCQkvKgorCQkJCQkgKiBBZ2Fpbiwgb25seSBzaGlwcGFibGUgb3BlcmF0b3JzIGNhbiBi ZSBzZW50IHRvIHJlbW90ZS4KKwkJCQkJICovCisJCQkJCWlmICghaXNfc2hpcHBhYmxlKG9lLT5v cG5vLCBPcGVyYXRvclJlbGF0aW9uSWQsIGZwaW5mbykpCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAK LQkJCQkvKgotCQkJCSAqIElmIG9wZXJhdG9yJ3MgaW5wdXQgY29sbGF0aW9uIGlzIG5vdCBkZXJp dmVkIGZyb20gYSBmb3JlaWduCi0JCQkJICogVmFyLCBpdCBjYW4ndCBiZSBzZW50IHRvIHJlbW90 ZS4KLQkJCQkgKi8KLQkJCQlpZiAob2UtPmlucHV0Y29sbGlkID09IEludmFsaWRPaWQpCi0JCQkJ CSAvKiBPSywgaW5wdXRzIGFyZSBhbGwgbm9uY29sbGF0YWJsZSAqLyA7Ci0JCQkJZWxzZSBpZiAo aW5uZXJfY3h0LnN0YXRlICE9IEZEV19DT0xMQVRFX1NBRkUgfHwKLQkJCQkJCSBvZS0+aW5wdXRj b2xsaWQgIT0gaW5uZXJfY3h0LmNvbGxhdGlvbikKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJ LyogT3V0cHV0IGlzIGFsd2F5cyBib29sZWFuIGFuZCBzbyBub25jb2xsYXRhYmxlLiAqLwotCQkJ CWNvbGxhdGlvbiA9IEludmFsaWRPaWQ7Ci0JCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOwot CQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVF9SZWxhYmVsVHlwZToKLQkJCXsKLQkJCQlSZWxhYmVs VHlwZSAqciA9IChSZWxhYmVsVHlwZSAqKSBub2RlOworCQkJCQkvKgorCQkJCQkgKiBSZWN1cnNl IHRvIGlucHV0IHN1YmV4cHJlc3Npb25zLgorCQkJCQkgKi8KKwkJCQkJaWYgKCFmb3JlaWduX2V4 cHJfd2Fsa2VyKChOb2RlICopIG9lLT5hcmdzLAorCQkJCQkJCQkJCQkgZ2xvYl9jeHQsICZpbm5l cl9jeHQsIGNhc2VfYXJnX2N4dCkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKgotCQkJ CSAqIFJlY3Vyc2UgdG8gaW5wdXQgc3ViZXhwcmVzc2lvbi4KLQkJCQkgKi8KLQkJCQlpZiAoIWZv cmVpZ25fZXhwcl93YWxrZXIoKE5vZGUgKikgci0+YXJnLAotCQkJCQkJCQkJCSBnbG9iX2N4dCwg JmlubmVyX2N4dCwgY2FzZV9hcmdfY3h0KSkKLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkvKgor CQkJCQkgKiBJZiBvcGVyYXRvcidzIGlucHV0IGNvbGxhdGlvbiBpcyBub3QgZGVyaXZlZCBmcm9t IGEKKwkJCQkJICogZm9yZWlnbiBWYXIsIGl0IGNhbid0IGJlIHNlbnQgdG8gcmVtb3RlLgorCQkJ CQkgKi8KKwkJCQkJaWYgKG9lLT5pbnB1dGNvbGxpZCA9PSBJbnZhbGlkT2lkKQorCQkJCQkJIC8q IE9LLCBpbnB1dHMgYXJlIGFsbCBub25jb2xsYXRhYmxlICovIDsKKwkJCQkJZWxzZSBpZiAoaW5u ZXJfY3h0LnN0YXRlICE9IEZEV19DT0xMQVRFX1NBRkUgfHwKKwkJCQkJCQkgb2UtPmlucHV0Y29s bGlkICE9IGlubmVyX2N4dC5jb2xsYXRpb24pCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkv KgotCQkJCSAqIFJlbGFiZWxUeXBlIG11c3Qgbm90IGludHJvZHVjZSBhIGNvbGxhdGlvbiBub3Qg ZGVyaXZlZCBmcm9tCi0JCQkJICogYW4gaW5wdXQgZm9yZWlnbiBWYXIgKHNhbWUgbG9naWMgYXMg Zm9yIGEgcmVhbCBmdW5jdGlvbikuCi0JCQkJICovCi0JCQkJY29sbGF0aW9uID0gci0+cmVzdWx0 Y29sbGlkOwotCQkJCWlmIChjb2xsYXRpb24gPT0gSW52YWxpZE9pZCkKLQkJCQkJc3RhdGUgPSBG RFdfQ09MTEFURV9OT05FOwotCQkJCWVsc2UgaWYgKGlubmVyX2N4dC5zdGF0ZSA9PSBGRFdfQ09M TEFURV9TQUZFICYmCi0JCQkJCQkgY29sbGF0aW9uID09IGlubmVyX2N4dC5jb2xsYXRpb24pCi0J CQkJCXN0YXRlID0gRkRXX0NPTExBVEVfU0FGRTsKLQkJCQllbHNlIGlmIChjb2xsYXRpb24gPT0g REVGQVVMVF9DT0xMQVRJT05fT0lEKQorCQkJCQkvKiBPdXRwdXQgaXMgYWx3YXlzIGJvb2xlYW4g YW5kIHNvIG5vbmNvbGxhdGFibGUuICovCisJCQkJCWNvbGxhdGlvbiA9IEludmFsaWRPaWQ7CiAJ CQkJCXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKLQkJCQllbHNlCi0JCQkJCXN0YXRlID0gRkRX X0NPTExBVEVfVU5TQUZFOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVF9Cb29sRXhwcjoKLQkJ CXsKLQkJCQlCb29sRXhwciAgICpiID0gKEJvb2xFeHByICopIG5vZGU7Ci0KLQkJCQkvKgotCQkJ CSAqIFJlY3Vyc2UgdG8gaW5wdXQgc3ViZXhwcmVzc2lvbnMuCi0JCQkJICovCi0JCQkJaWYgKCFm b3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIGItPmFyZ3MsCi0JCQkJCQkJCQkJIGdsb2JfY3h0 LCAmaW5uZXJfY3h0LCBjYXNlX2FyZ19jeHQpKQotCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQor CQkJCWJyZWFrOworCQkJY2FzZSBUX1JlbGFiZWxUeXBlOgorCQkJCXsKKwkJCQkJUmVsYWJlbFR5 cGUgKnIgPSAoUmVsYWJlbFR5cGUgKikgbm9kZTsKIAotCQkJCS8qIE91dHB1dCBpcyBhbHdheXMg Ym9vbGVhbiBhbmQgc28gbm9uY29sbGF0YWJsZS4gKi8KLQkJCQljb2xsYXRpb24gPSBJbnZhbGlk T2lkOwotCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKLQkJCX0KLQkJCWJyZWFrOwotCQlj YXNlIFRfTnVsbFRlc3Q6Ci0JCQl7Ci0JCQkJTnVsbFRlc3QgICAqbnQgPSAoTnVsbFRlc3QgKikg bm9kZTsKKwkJCQkJLyoKKwkJCQkJICogUmVjdXJzZSB0byBpbnB1dCBzdWJleHByZXNzaW9uLgor CQkJCQkgKi8KKwkJCQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIHItPmFyZywK KwkJCQkJCQkJCQkJIGdsb2JfY3h0LCAmaW5uZXJfY3h0LCBjYXNlX2FyZ19jeHQpKQorCQkJCQkJ cmV0dXJuIGZhbHNlOwogCi0JCQkJLyoKLQkJCQkgKiBSZWN1cnNlIHRvIGlucHV0IHN1YmV4cHJl c3Npb25zLgotCQkJCSAqLwotCQkJCWlmICghZm9yZWlnbl9leHByX3dhbGtlcigoTm9kZSAqKSBu dC0+YXJnLAotCQkJCQkJCQkJCSBnbG9iX2N4dCwgJmlubmVyX2N4dCwgY2FzZV9hcmdfY3h0KSkK LQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkvKgorCQkJCQkgKiBSZWxhYmVsVHlwZSBtdXN0IG5v dCBpbnRyb2R1Y2UgYSBjb2xsYXRpb24gbm90IGRlcml2ZWQKKwkJCQkJICogZnJvbSBhbiBpbnB1 dCBmb3JlaWduIFZhciAoc2FtZSBsb2dpYyBhcyBmb3IgYSByZWFsCisJCQkJCSAqIGZ1bmN0aW9u KS4KKwkJCQkJICovCisJCQkJCWNvbGxhdGlvbiA9IHItPnJlc3VsdGNvbGxpZDsKKwkJCQkJaWYg KGNvbGxhdGlvbiA9PSBJbnZhbGlkT2lkKQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05F OworCQkJCQllbHNlIGlmIChpbm5lcl9jeHQuc3RhdGUgPT0gRkRXX0NPTExBVEVfU0FGRSAmJgor CQkJCQkJCSBjb2xsYXRpb24gPT0gaW5uZXJfY3h0LmNvbGxhdGlvbikKKwkJCQkJCXN0YXRlID0g RkRXX0NPTExBVEVfU0FGRTsKKwkJCQkJZWxzZSBpZiAoY29sbGF0aW9uID09IERFRkFVTFRfQ09M TEFUSU9OX09JRCkKKwkJCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKKwkJCQkJZWxzZQor CQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9VTlNBRkU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJ Y2FzZSBUX0Jvb2xFeHByOgorCQkJCXsKKwkJCQkJQm9vbEV4cHIgICAqYiA9IChCb29sRXhwciAq KSBub2RlOwogCi0JCQkJLyogT3V0cHV0IGlzIGFsd2F5cyBib29sZWFuIGFuZCBzbyBub25jb2xs YXRhYmxlLiAqLwotCQkJCWNvbGxhdGlvbiA9IEludmFsaWRPaWQ7Ci0JCQkJc3RhdGUgPSBGRFdf Q09MTEFURV9OT05FOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVF9DYXNlRXhwcjoKLQkJCXsK LQkJCQlDYXNlRXhwciAgICpjZSA9IChDYXNlRXhwciAqKSBub2RlOwotCQkJCWZvcmVpZ25fbG9j X2N4dCBhcmdfY3h0OwotCQkJCWZvcmVpZ25fbG9jX2N4dCB0bXBfY3h0OwotCQkJCUxpc3RDZWxs ICAgKmxjOworCQkJCQkvKgorCQkJCQkgKiBSZWN1cnNlIHRvIGlucHV0IHN1YmV4cHJlc3Npb25z LgorCQkJCQkgKi8KKwkJCQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIGItPmFy Z3MsCisJCQkJCQkJCQkJCSBnbG9iX2N4dCwgJmlubmVyX2N4dCwgY2FzZV9hcmdfY3h0KSkKKwkJ CQkJCXJldHVybiBmYWxzZTsKIAotCQkJCS8qCi0JCQkJICogUmVjdXJzZSB0byBDQVNFJ3MgYXJn IGV4cHJlc3Npb24sIGlmIGFueS4gIEl0cyBjb2xsYXRpb24KLQkJCQkgKiBoYXMgdG8gYmUgc2F2 ZWQgYXNpZGUgZm9yIHVzZSB3aGlsZSBleGFtaW5pbmcgQ2FzZVRlc3RFeHBycwotCQkJCSAqIHdp dGhpbiB0aGUgV0hFTiBleHByZXNzaW9ucy4KLQkJCQkgKi8KLQkJCQlhcmdfY3h0LmNvbGxhdGlv biA9IEludmFsaWRPaWQ7Ci0JCQkJYXJnX2N4dC5zdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7Ci0J CQkJaWYgKGNlLT5hcmcpCisJCQkJCS8qIE91dHB1dCBpcyBhbHdheXMgYm9vbGVhbiBhbmQgc28g bm9uY29sbGF0YWJsZS4gKi8KKwkJCQkJY29sbGF0aW9uID0gSW52YWxpZE9pZDsKKwkJCQkJc3Rh dGUgPSBGRFdfQ09MTEFURV9OT05FOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVF9OdWxs VGVzdDoKIAkJCQl7Ci0JCQkJCWlmICghZm9yZWlnbl9leHByX3dhbGtlcigoTm9kZSAqKSBjZS0+ YXJnLAotCQkJCQkJCQkJCQkgZ2xvYl9jeHQsICZhcmdfY3h0LCBjYXNlX2FyZ19jeHQpKQorCQkJ CQlOdWxsVGVzdCAgICpudCA9IChOdWxsVGVzdCAqKSBub2RlOworCisJCQkJCS8qCisJCQkJCSAq IFJlY3Vyc2UgdG8gaW5wdXQgc3ViZXhwcmVzc2lvbnMuCisJCQkJCSAqLworCQkJCQlpZiAoIWZv cmVpZ25fZXhwcl93YWxrZXIoKE5vZGUgKikgbnQtPmFyZywKKwkJCQkJCQkJCQkJIGdsb2JfY3h0 LCAmaW5uZXJfY3h0LCBjYXNlX2FyZ19jeHQpKQogCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0K IAotCQkJCS8qIEV4YW1pbmUgdGhlIENhc2VXaGVuIHN1YmV4cHJlc3Npb25zLiAqLwotCQkJCWZv cmVhY2gobGMsIGNlLT5hcmdzKQorCQkJCQkvKiBPdXRwdXQgaXMgYWx3YXlzIGJvb2xlYW4gYW5k IHNvIG5vbmNvbGxhdGFibGUuICovCisJCQkJCWNvbGxhdGlvbiA9IEludmFsaWRPaWQ7CisJCQkJ CXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRf Q2FzZUV4cHI6CiAJCQkJewotCQkJCQlDYXNlV2hlbiAgICpjdyA9IGxmaXJzdF9ub2RlKENhc2VX aGVuLCBsYyk7CisJCQkJCUNhc2VFeHByICAgKmNlID0gKENhc2VFeHByICopIG5vZGU7CisJCQkJ CWZvcmVpZ25fbG9jX2N4dCBhcmdfY3h0OworCQkJCQlmb3JlaWduX2xvY19jeHQgdG1wX2N4dDsK KwkJCQkJTGlzdENlbGwgICAqbGM7CiAKKwkJCQkJLyoKKwkJCQkJICogUmVjdXJzZSB0byBDQVNF J3MgYXJnIGV4cHJlc3Npb24sIGlmIGFueS4gIEl0cworCQkJCQkgKiBjb2xsYXRpb24gaGFzIHRv IGJlIHNhdmVkIGFzaWRlIGZvciB1c2Ugd2hpbGUgZXhhbWluaW5nCisJCQkJCSAqIENhc2VUZXN0 RXhwcnMgd2l0aGluIHRoZSBXSEVOIGV4cHJlc3Npb25zLgorCQkJCQkgKi8KKwkJCQkJYXJnX2N4 dC5jb2xsYXRpb24gPSBJbnZhbGlkT2lkOworCQkJCQlhcmdfY3h0LnN0YXRlID0gRkRXX0NPTExB VEVfTk9ORTsKIAkJCQkJaWYgKGNlLT5hcmcpCiAJCQkJCXsKKwkJCQkJCWlmICghZm9yZWlnbl9l eHByX3dhbGtlcigoTm9kZSAqKSBjZS0+YXJnLAorCQkJCQkJCQkJCQkJIGdsb2JfY3h0LCAmYXJn X2N4dCwgY2FzZV9hcmdfY3h0KSkKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKworCQkJ CQkvKiBFeGFtaW5lIHRoZSBDYXNlV2hlbiBzdWJleHByZXNzaW9ucy4gKi8KKwkJCQkJZm9yZWFj aChsYywgY2UtPmFyZ3MpCisJCQkJCXsKKwkJCQkJCUNhc2VXaGVuICAgKmN3ID0gbGZpcnN0X25v ZGUoQ2FzZVdoZW4sIGxjKTsKKworCQkJCQkJaWYgKGNlLT5hcmcpCisJCQkJCQl7CisJCQkJCQkJ LyoKKwkJCQkJCQkgKiBJbiBhIENBU0Utd2l0aC1hcmcsIHRoZSBwYXJzZXIgc2hvdWxkIGhhdmUK KwkJCQkJCQkgKiBwcm9kdWNlZCBXSEVOIGNsYXVzZXMgb2YgdGhlIGZvcm0gIkNhc2VUZXN0RXhw cgorCQkJCQkJCSAqID0gUkhTIiwgcG9zc2libHkgd2l0aCBhbiBpbXBsaWNpdCBjb2VyY2lvbgor CQkJCQkJCSAqIGluc2VydGVkIGFib3ZlIHRoZSBDYXNlVGVzdEV4cHIuICBIb3dldmVyIGluIGFu CisJCQkJCQkJICogZXhwcmVzc2lvbiB0aGF0J3MgYmVlbiB0aHJvdWdoIHRoZSBvcHRpbWl6ZXIs CisJCQkJCQkJICogdGhlIFdIRU4gY2xhdXNlIGNvdWxkIGJlIGFsbW9zdCBhbnl0aGluZyAoc2lu Y2UKKwkJCQkJCQkgKiB0aGUgZXF1YWxpdHkgb3BlcmF0b3IgY291bGQgaGF2ZSBiZWVuIGV4cGFu ZGVkCisJCQkJCQkJICogaW50byBhbiBpbmxpbmUgZnVuY3Rpb24pLiBJbiBzdWNoIGNhc2VzIGZv cmJpZAorCQkJCQkJCSAqIHB1c2hkb3duLCBiZWNhdXNlIGRlcGFyc2VDYXNlRXhwciBjYW4ndCBo YW5kbGUKKwkJCQkJCQkgKiBpdC4KKwkJCQkJCQkgKi8KKwkJCQkJCQlOb2RlCSAgICp3aGVuRXhw ciA9IChOb2RlICopIGN3LT5leHByOworCQkJCQkJCUxpc3QJICAgKm9wQXJnczsKKworCQkJCQkJ CWlmICghSXNBKHdoZW5FeHByLCBPcEV4cHIpKQorCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJ CQkJCQlvcEFyZ3MgPSAoKE9wRXhwciAqKSB3aGVuRXhwciktPmFyZ3M7CisJCQkJCQkJaWYgKGxp c3RfbGVuZ3RoKG9wQXJncykgIT0gMiB8fAorCQkJCQkJCQkhSXNBKHN0cmlwX2ltcGxpY2l0X2Nv ZXJjaW9ucyhsaW5pdGlhbChvcEFyZ3MpKSwKKwkJCQkJCQkJCSBDYXNlVGVzdEV4cHIpKQorCQkJ CQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisKIAkJCQkJCS8qCi0JCQkJCQkgKiBJbiBhIENB U0Utd2l0aC1hcmcsIHRoZSBwYXJzZXIgc2hvdWxkIGhhdmUgcHJvZHVjZWQKLQkJCQkJCSAqIFdI RU4gY2xhdXNlcyBvZiB0aGUgZm9ybSAiQ2FzZVRlc3RFeHByID0gUkhTIiwKLQkJCQkJCSAqIHBv c3NpYmx5IHdpdGggYW4gaW1wbGljaXQgY29lcmNpb24gaW5zZXJ0ZWQgYWJvdmUKLQkJCQkJCSAq IHRoZSBDYXNlVGVzdEV4cHIuICBIb3dldmVyIGluIGFuIGV4cHJlc3Npb24gdGhhdCdzCi0JCQkJ CQkgKiBiZWVuIHRocm91Z2ggdGhlIG9wdGltaXplciwgdGhlIFdIRU4gY2xhdXNlIGNvdWxkCi0J CQkJCQkgKiBiZSBhbG1vc3QgYW55dGhpbmcgKHNpbmNlIHRoZSBlcXVhbGl0eSBvcGVyYXRvcgot CQkJCQkJICogY291bGQgaGF2ZSBiZWVuIGV4cGFuZGVkIGludG8gYW4gaW5saW5lIGZ1bmN0aW9u KS4KLQkJCQkJCSAqIEluIHN1Y2ggY2FzZXMgZm9yYmlkIHB1c2hkb3duLCBiZWNhdXNlCi0JCQkJ CQkgKiBkZXBhcnNlQ2FzZUV4cHIgY2FuJ3QgaGFuZGxlIGl0LgorCQkJCQkJICogUmVjdXJzZSB0 byBXSEVOIGV4cHJlc3Npb24sIHBhc3NpbmcgZG93biB0aGUgYXJnCisJCQkJCQkgKiBpbmZvLiBJ dHMgY29sbGF0aW9uIGRvZXNuJ3QgYWZmZWN0IHRoZSByZXN1bHQKKwkJCQkJCSAqIChyZWFsbHks IGl0IHNob3VsZCBiZSBib29sZWFuIGFuZCB0aHVzIG5vdCBoYXZlIGEKKwkJCQkJCSAqIGNvbGxh dGlvbikuCiAJCQkJCQkgKi8KLQkJCQkJCU5vZGUJICAgKndoZW5FeHByID0gKE5vZGUgKikgY3ct PmV4cHI7Ci0JCQkJCQlMaXN0CSAgICpvcEFyZ3M7Ci0KLQkJCQkJCWlmICghSXNBKHdoZW5FeHBy LCBPcEV4cHIpKQorCQkJCQkJdG1wX2N4dC5jb2xsYXRpb24gPSBJbnZhbGlkT2lkOworCQkJCQkJ dG1wX2N4dC5zdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7CisJCQkJCQlpZiAoIWZvcmVpZ25fZXhw cl93YWxrZXIoKE5vZGUgKikgY3ctPmV4cHIsCisJCQkJCQkJCQkJCQkgZ2xvYl9jeHQsICZ0bXBf Y3h0LCAmYXJnX2N4dCkpCiAJCQkJCQkJcmV0dXJuIGZhbHNlOwogCi0JCQkJCQlvcEFyZ3MgPSAo KE9wRXhwciAqKSB3aGVuRXhwciktPmFyZ3M7Ci0JCQkJCQlpZiAobGlzdF9sZW5ndGgob3BBcmdz KSAhPSAyIHx8Ci0JCQkJCQkJIUlzQShzdHJpcF9pbXBsaWNpdF9jb2VyY2lvbnMobGluaXRpYWwo b3BBcmdzKSksCi0JCQkJCQkJCSBDYXNlVGVzdEV4cHIpKQorCQkJCQkJLyogUmVjdXJzZSB0byBU SEVOIGV4cHJlc3Npb24uICovCisJCQkJCQlpZiAoIWZvcmVpZ25fZXhwcl93YWxrZXIoKE5vZGUg KikgY3ctPnJlc3VsdCwKKwkJCQkJCQkJCQkJCSBnbG9iX2N4dCwgJmlubmVyX2N4dCwgY2FzZV9h cmdfY3h0KSkKIAkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCX0KIAotCQkJCQkvKgotCQkJCQkg KiBSZWN1cnNlIHRvIFdIRU4gZXhwcmVzc2lvbiwgcGFzc2luZyBkb3duIHRoZSBhcmcgaW5mby4K LQkJCQkJICogSXRzIGNvbGxhdGlvbiBkb2Vzbid0IGFmZmVjdCB0aGUgcmVzdWx0IChyZWFsbHks IGl0Ci0JCQkJCSAqIHNob3VsZCBiZSBib29sZWFuIGFuZCB0aHVzIG5vdCBoYXZlIGEgY29sbGF0 aW9uKS4KLQkJCQkJICovCi0JCQkJCXRtcF9jeHQuY29sbGF0aW9uID0gSW52YWxpZE9pZDsKLQkJ CQkJdG1wX2N4dC5zdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7Ci0JCQkJCWlmICghZm9yZWlnbl9l eHByX3dhbGtlcigoTm9kZSAqKSBjdy0+ZXhwciwKLQkJCQkJCQkJCQkJIGdsb2JfY3h0LCAmdG1w X2N4dCwgJmFyZ19jeHQpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJCS8qIFJlY3Vyc2Ug dG8gVEhFTiBleHByZXNzaW9uLiAqLwotCQkJCQlpZiAoIWZvcmVpZ25fZXhwcl93YWxrZXIoKE5v ZGUgKikgY3ctPnJlc3VsdCwKKwkJCQkJLyogUmVjdXJzZSB0byBFTFNFIGV4cHJlc3Npb24uICov CisJCQkJCWlmICghZm9yZWlnbl9leHByX3dhbGtlcigoTm9kZSAqKSBjZS0+ZGVmcmVzdWx0LAog CQkJCQkJCQkJCQkgZ2xvYl9jeHQsICZpbm5lcl9jeHQsIGNhc2VfYXJnX2N4dCkpCiAJCQkJCQly ZXR1cm4gZmFsc2U7CisKKwkJCQkJLyoKKwkJCQkJICogRGV0ZWN0IHdoZXRoZXIgbm9kZSBpcyBp bnRyb2R1Y2luZyBhIGNvbGxhdGlvbiBub3QKKwkJCQkJICogZGVyaXZlZCBmcm9tIGEgZm9yZWln biBWYXIuICAoSWYgc28sIHdlIGp1c3QgbWFyayBpdAorCQkJCQkgKiB1bnNhZmUgZm9yIG5vdyBy YXRoZXIgdGhhbiBpbW1lZGlhdGVseSByZXR1cm5pbmcgZmFsc2UsCisJCQkJCSAqIHNpbmNlIHRo ZSBwYXJlbnQgbm9kZSBtaWdodCBub3QgY2FyZS4pICBUaGlzIGlzIHRoZQorCQkJCQkgKiBzYW1l IGFzIGZvciBmdW5jdGlvbiBub2RlcywgZXhjZXB0IHRoYXQgdGhlIGlucHV0CisJCQkJCSAqIGNv bGxhdGlvbiBpcyBkZXJpdmVkIGZyb20gb25seSB0aGUgVEhFTiBhbmQgRUxTRQorCQkJCQkgKiBz dWJleHByZXNzaW9ucy4KKwkJCQkJICovCisJCQkJCWNvbGxhdGlvbiA9IGNlLT5jYXNlY29sbGlk OworCQkJCQlpZiAoY29sbGF0aW9uID09IEludmFsaWRPaWQpCisJCQkJCQlzdGF0ZSA9IEZEV19D T0xMQVRFX05PTkU7CisJCQkJCWVsc2UgaWYgKGlubmVyX2N4dC5zdGF0ZSA9PSBGRFdfQ09MTEFU RV9TQUZFICYmCisJCQkJCQkJIGNvbGxhdGlvbiA9PSBpbm5lcl9jeHQuY29sbGF0aW9uKQorCQkJ CQkJc3RhdGUgPSBGRFdfQ09MTEFURV9TQUZFOworCQkJCQllbHNlIGlmIChjb2xsYXRpb24gPT0g REVGQVVMVF9DT0xMQVRJT05fT0lEKQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOwor CQkJCQllbHNlCisJCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX1VOU0FGRTsKIAkJCQl9CisJCQkJ YnJlYWs7CisJCQljYXNlIFRfQ2FzZVRlc3RFeHByOgorCQkJCXsKKwkJCQkJQ2FzZVRlc3RFeHBy ICpjID0gKENhc2VUZXN0RXhwciAqKSBub2RlOwogCi0JCQkJLyogUmVjdXJzZSB0byBFTFNFIGV4 cHJlc3Npb24uICovCi0JCQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIGNlLT5k ZWZyZXN1bHQsCi0JCQkJCQkJCQkJIGdsb2JfY3h0LCAmaW5uZXJfY3h0LCBjYXNlX2FyZ19jeHQp KQotCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCS8qIFB1bnQgaWYgd2Ugc2VlbSBub3QgdG8gYmUg aW5zaWRlIGEgQ0FTRSBhcmcgV0hFTi4gKi8KKwkJCQkJaWYgKCFjYXNlX2FyZ19jeHQpCisJCQkJ CQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKgotCQkJCSAqIERldGVjdCB3aGV0aGVyIG5vZGUgaXMg aW50cm9kdWNpbmcgYSBjb2xsYXRpb24gbm90IGRlcml2ZWQKLQkJCQkgKiBmcm9tIGEgZm9yZWln biBWYXIuICAoSWYgc28sIHdlIGp1c3QgbWFyayBpdCB1bnNhZmUgZm9yIG5vdwotCQkJCSAqIHJh dGhlciB0aGFuIGltbWVkaWF0ZWx5IHJldHVybmluZyBmYWxzZSwgc2luY2UgdGhlIHBhcmVudAot CQkJCSAqIG5vZGUgbWlnaHQgbm90IGNhcmUuKSAgVGhpcyBpcyB0aGUgc2FtZSBhcyBmb3IgZnVu Y3Rpb24KLQkJCQkgKiBub2RlcywgZXhjZXB0IHRoYXQgdGhlIGlucHV0IGNvbGxhdGlvbiBpcyBk ZXJpdmVkIGZyb20gb25seQotCQkJCSAqIHRoZSBUSEVOIGFuZCBFTFNFIHN1YmV4cHJlc3Npb25z LgotCQkJCSAqLwotCQkJCWNvbGxhdGlvbiA9IGNlLT5jYXNlY29sbGlkOwotCQkJCWlmIChjb2xs YXRpb24gPT0gSW52YWxpZE9pZCkKLQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOwotCQkJ CWVsc2UgaWYgKGlubmVyX2N4dC5zdGF0ZSA9PSBGRFdfQ09MTEFURV9TQUZFICYmCi0JCQkJCQkg Y29sbGF0aW9uID09IGlubmVyX2N4dC5jb2xsYXRpb24pCi0JCQkJCXN0YXRlID0gRkRXX0NPTExB VEVfU0FGRTsKLQkJCQllbHNlIGlmIChjb2xsYXRpb24gPT0gREVGQVVMVF9DT0xMQVRJT05fT0lE KQotCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9 IEZEV19DT0xMQVRFX1VOU0FGRTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFRfQ2FzZVRlc3RF eHByOgotCQkJewotCQkJCUNhc2VUZXN0RXhwciAqYyA9IChDYXNlVGVzdEV4cHIgKikgbm9kZTsK KwkJCQkJLyoKKwkJCQkJICogT3RoZXJ3aXNlLCBhbnkgbm9uZGVmYXVsdCBjb2xsYXRpb24gYXR0 YWNoZWQgdG8gdGhlCisJCQkJCSAqIENhc2VUZXN0RXhwciBub2RlIG11c3QgYmUgZGVyaXZlZCBm cm9tIGZvcmVpZ24gVmFyKHMpCisJCQkJCSAqIGluIHRoZSBDQVNFIGFyZy4KKwkJCQkJICovCisJ CQkJCWNvbGxhdGlvbiA9IGMtPmNvbGxhdGlvbjsKKwkJCQkJaWYgKGNvbGxhdGlvbiA9PSBJbnZh bGlkT2lkKQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOworCQkJCQllbHNlIGlmIChj YXNlX2FyZ19jeHQtPnN0YXRlID09IEZEV19DT0xMQVRFX1NBRkUgJiYKKwkJCQkJCQkgY29sbGF0 aW9uID09IGNhc2VfYXJnX2N4dC0+Y29sbGF0aW9uKQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFU RV9TQUZFOworCQkJCQllbHNlIGlmIChjb2xsYXRpb24gPT0gREVGQVVMVF9DT0xMQVRJT05fT0lE KQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOworCQkJCQllbHNlCisJCQkJCQlzdGF0 ZSA9IEZEV19DT0xMQVRFX1VOU0FGRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRfQXJy YXlFeHByOgorCQkJCXsKKwkJCQkJQXJyYXlFeHByICAqYSA9IChBcnJheUV4cHIgKikgbm9kZTsK IAotCQkJCS8qIFB1bnQgaWYgd2Ugc2VlbSBub3QgdG8gYmUgaW5zaWRlIGEgQ0FTRSBhcmcgV0hF Ti4gKi8KLQkJCQlpZiAoIWNhc2VfYXJnX2N4dCkKLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkv KgorCQkJCQkgKiBSZWN1cnNlIHRvIGlucHV0IHN1YmV4cHJlc3Npb25zLgorCQkJCQkgKi8KKwkJ CQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIGEtPmVsZW1lbnRzLAorCQkJCQkJ CQkJCQkgZ2xvYl9jeHQsICZpbm5lcl9jeHQsIGNhc2VfYXJnX2N4dCkpCisJCQkJCQlyZXR1cm4g ZmFsc2U7CiAKLQkJCQkvKgotCQkJCSAqIE90aGVyd2lzZSwgYW55IG5vbmRlZmF1bHQgY29sbGF0 aW9uIGF0dGFjaGVkIHRvIHRoZQotCQkJCSAqIENhc2VUZXN0RXhwciBub2RlIG11c3QgYmUgZGVy aXZlZCBmcm9tIGZvcmVpZ24gVmFyKHMpIGluCi0JCQkJICogdGhlIENBU0UgYXJnLgotCQkJCSAq LwotCQkJCWNvbGxhdGlvbiA9IGMtPmNvbGxhdGlvbjsKLQkJCQlpZiAoY29sbGF0aW9uID09IElu dmFsaWRPaWQpCi0JCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfTk9ORTsKLQkJCQllbHNlIGlmIChj YXNlX2FyZ19jeHQtPnN0YXRlID09IEZEV19DT0xMQVRFX1NBRkUgJiYKLQkJCQkJCSBjb2xsYXRp b24gPT0gY2FzZV9hcmdfY3h0LT5jb2xsYXRpb24pCi0JCQkJCXN0YXRlID0gRkRXX0NPTExBVEVf U0FGRTsKLQkJCQllbHNlIGlmIChjb2xsYXRpb24gPT0gREVGQVVMVF9DT0xMQVRJT05fT0lEKQot CQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEZE V19DT0xMQVRFX1VOU0FGRTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFRfQXJyYXlFeHByOgot CQkJewotCQkJCUFycmF5RXhwciAgKmEgPSAoQXJyYXlFeHByICopIG5vZGU7CisJCQkJCS8qCisJ CQkJCSAqIEFycmF5RXhwciBtdXN0IG5vdCBpbnRyb2R1Y2UgYSBjb2xsYXRpb24gbm90IGRlcml2 ZWQKKwkJCQkJICogZnJvbSBhbiBpbnB1dCBmb3JlaWduIFZhciAoc2FtZSBsb2dpYyBhcyBmb3Ig YQorCQkJCQkgKiBmdW5jdGlvbikuCisJCQkJCSAqLworCQkJCQljb2xsYXRpb24gPSBhLT5hcnJh eV9jb2xsaWQ7CisJCQkJCWlmIChjb2xsYXRpb24gPT0gSW52YWxpZE9pZCkKKwkJCQkJCXN0YXRl ID0gRkRXX0NPTExBVEVfTk9ORTsKKwkJCQkJZWxzZSBpZiAoaW5uZXJfY3h0LnN0YXRlID09IEZE V19DT0xMQVRFX1NBRkUgJiYKKwkJCQkJCQkgY29sbGF0aW9uID09IGlubmVyX2N4dC5jb2xsYXRp b24pCisJCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX1NBRkU7CisJCQkJCWVsc2UgaWYgKGNvbGxh dGlvbiA9PSBERUZBVUxUX0NPTExBVElPTl9PSUQpCisJCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRF X05PTkU7CisJCQkJCWVsc2UKKwkJCQkJCXN0YXRlID0gRkRXX0NPTExBVEVfVU5TQUZFOworCQkJ CX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVF9MaXN0OgorCQkJCXsKKwkJCQkJTGlzdAkgICAqbCA9 IChMaXN0ICopIG5vZGU7CisJCQkJCUxpc3RDZWxsICAgKmxjOwogCi0JCQkJLyoKLQkJCQkgKiBS ZWN1cnNlIHRvIGlucHV0IHN1YmV4cHJlc3Npb25zLgotCQkJCSAqLwotCQkJCWlmICghZm9yZWln bl9leHByX3dhbGtlcigoTm9kZSAqKSBhLT5lbGVtZW50cywKLQkJCQkJCQkJCQkgZ2xvYl9jeHQs ICZpbm5lcl9jeHQsIGNhc2VfYXJnX2N4dCkpCi0JCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJLyoK KwkJCQkJICogUmVjdXJzZSB0byBjb21wb25lbnQgc3ViZXhwcmVzc2lvbnMuCisJCQkJCSAqLwor CQkJCQlmb3JlYWNoKGxjLCBsKQorCQkJCQl7CisJCQkJCQlpZiAoIWZvcmVpZ25fZXhwcl93YWxr ZXIoKE5vZGUgKikgbGZpcnN0KGxjKSwKKwkJCQkJCQkJCQkJCSBnbG9iX2N4dCwgJmlubmVyX2N4 dCwgY2FzZV9hcmdfY3h0KSkKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KIAotCQkJCS8q Ci0JCQkJICogQXJyYXlFeHByIG11c3Qgbm90IGludHJvZHVjZSBhIGNvbGxhdGlvbiBub3QgZGVy aXZlZCBmcm9tCi0JCQkJICogYW4gaW5wdXQgZm9yZWlnbiBWYXIgKHNhbWUgbG9naWMgYXMgZm9y IGEgZnVuY3Rpb24pLgotCQkJCSAqLwotCQkJCWNvbGxhdGlvbiA9IGEtPmFycmF5X2NvbGxpZDsK LQkJCQlpZiAoY29sbGF0aW9uID09IEludmFsaWRPaWQpCi0JCQkJCXN0YXRlID0gRkRXX0NPTExB VEVfTk9ORTsKLQkJCQllbHNlIGlmIChpbm5lcl9jeHQuc3RhdGUgPT0gRkRXX0NPTExBVEVfU0FG RSAmJgotCQkJCQkJIGNvbGxhdGlvbiA9PSBpbm5lcl9jeHQuY29sbGF0aW9uKQotCQkJCQlzdGF0 ZSA9IEZEV19DT0xMQVRFX1NBRkU7Ci0JCQkJZWxzZSBpZiAoY29sbGF0aW9uID09IERFRkFVTFRf Q09MTEFUSU9OX09JRCkKLQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOwotCQkJCWVsc2UK LQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9VTlNBRkU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2Fz ZSBUX0xpc3Q6Ci0JCQl7Ci0JCQkJTGlzdAkgICAqbCA9IChMaXN0ICopIG5vZGU7Ci0JCQkJTGlz dENlbGwgICAqbGM7CisJCQkJCS8qCisJCQkJCSAqIFdoZW4gcHJvY2Vzc2luZyBhIGxpc3QsIGNv bGxhdGlvbiBzdGF0ZSBqdXN0IGJ1YmJsZXMgdXAKKwkJCQkJICogZnJvbSB0aGUgbGlzdCBlbGVt ZW50cy4KKwkJCQkJICovCisJCQkJCWNvbGxhdGlvbiA9IGlubmVyX2N4dC5jb2xsYXRpb247CisJ CQkJCXN0YXRlID0gaW5uZXJfY3h0LnN0YXRlOwogCi0JCQkJLyoKLQkJCQkgKiBSZWN1cnNlIHRv IGNvbXBvbmVudCBzdWJleHByZXNzaW9ucy4KLQkJCQkgKi8KLQkJCQlmb3JlYWNoKGxjLCBsKQor CQkJCQkvKiBEb24ndCBhcHBseSBleHByVHlwZSgpIHRvIHRoZSBsaXN0LiAqLworCQkJCQljaGVj a190eXBlID0gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUX0FnZ3JlZjoKIAkJ CQl7Ci0JCQkJCWlmICghZm9yZWlnbl9leHByX3dhbGtlcigoTm9kZSAqKSBsZmlyc3QobGMpLAot CQkJCQkJCQkJCQkgZ2xvYl9jeHQsICZpbm5lcl9jeHQsIGNhc2VfYXJnX2N4dCkpCisJCQkJCUFn Z3JlZgkgICAqYWdnID0gKEFnZ3JlZiAqKSBub2RlOworCQkJCQlMaXN0Q2VsbCAgICpsYzsKKwor CQkJCQkvKiBOb3Qgc2FmZSB0byBwdXNoZG93biB3aGVuIG5vdCBpbiBncm91cGluZyBjb250ZXh0 ICovCisJCQkJCWlmICghSVNfVVBQRVJfUkVMKGdsb2JfY3h0LT5mb3JlaWducmVsKSkKIAkJCQkJ CXJldHVybiBmYWxzZTsKLQkJCQl9CiAKLQkJCQkvKgotCQkJCSAqIFdoZW4gcHJvY2Vzc2luZyBh IGxpc3QsIGNvbGxhdGlvbiBzdGF0ZSBqdXN0IGJ1YmJsZXMgdXAKLQkJCQkgKiBmcm9tIHRoZSBs aXN0IGVsZW1lbnRzLgotCQkJCSAqLwotCQkJCWNvbGxhdGlvbiA9IGlubmVyX2N4dC5jb2xsYXRp b247Ci0JCQkJc3RhdGUgPSBpbm5lcl9jeHQuc3RhdGU7CisJCQkJCS8qIE9ubHkgbm9uLXNwbGl0 IGFnZ3JlZ2F0ZXMgYXJlIHB1c2hhYmxlLiAqLworCQkJCQlpZiAoYWdnLT5hZ2dzcGxpdCAhPSBB R0dTUExJVF9TSU1QTEUpCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQkvKiBEb24ndCBhcHBs eSBleHByVHlwZSgpIHRvIHRoZSBsaXN0LiAqLwotCQkJCWNoZWNrX3R5cGUgPSBmYWxzZTsKLQkJ CX0KLQkJCWJyZWFrOwotCQljYXNlIFRfQWdncmVmOgotCQkJewotCQkJCUFnZ3JlZgkgICAqYWdn ID0gKEFnZ3JlZiAqKSBub2RlOwotCQkJCUxpc3RDZWxsICAgKmxjOworCQkJCQkvKiBBcyB1c3Vh bCwgaXQgbXVzdCBiZSBzaGlwcGFibGUuICovCisJCQkJCWlmICghaXNfc2hpcHBhYmxlKGFnZy0+ YWdnZm5vaWQsIFByb2NlZHVyZVJlbGF0aW9uSWQsIGZwaW5mbykpCisJCQkJCQlyZXR1cm4gZmFs c2U7CiAKLQkJCQkvKiBOb3Qgc2FmZSB0byBwdXNoZG93biB3aGVuIG5vdCBpbiBncm91cGluZyBj b250ZXh0ICovCi0JCQkJaWYgKCFJU19VUFBFUl9SRUwoZ2xvYl9jeHQtPmZvcmVpZ25yZWwpKQot CQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCS8qCisJCQkJCSAqIFJlY3Vyc2UgdG8gaW5wdXQgYXJn cy4gYWdnZGlyZWN0YXJncywgYWdnb3JkZXIgYW5kCisJCQkJCSAqIGFnZ2Rpc3RpbmN0IGFyZSBh bGwgcHJlc2VudCBpbiBhcmdzLCBzbyBubyBuZWVkIHRvCisJCQkJCSAqIGNoZWNrIHRoZWlyIHNo aXBwYWJpbGl0eSBleHBsaWNpdGx5LgorCQkJCQkgKi8KKwkJCQkJZm9yZWFjaChsYywgYWdnLT5h cmdzKQorCQkJCQl7CisJCQkJCQlOb2RlCSAgICpuID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKIAot CQkJCS8qIE9ubHkgbm9uLXNwbGl0IGFnZ3JlZ2F0ZXMgYXJlIHB1c2hhYmxlLiAqLwotCQkJCWlm IChhZ2ctPmFnZ3NwbGl0ICE9IEFHR1NQTElUX1NJTVBMRSkKLQkJCQkJcmV0dXJuIGZhbHNlOwor CQkJCQkJLyogSWYgVGFyZ2V0RW50cnksIGV4dHJhY3QgdGhlIGV4cHJlc3Npb24gZnJvbSBpdCAq LworCQkJCQkJaWYgKElzQShuLCBUYXJnZXRFbnRyeSkpCisJCQkJCQl7CisJCQkJCQkJVGFyZ2V0 RW50cnkgKnRsZSA9IChUYXJnZXRFbnRyeSAqKSBuOwogCi0JCQkJLyogQXMgdXN1YWwsIGl0IG11 c3QgYmUgc2hpcHBhYmxlLiAqLwotCQkJCWlmICghaXNfc2hpcHBhYmxlKGFnZy0+YWdnZm5vaWQs IFByb2NlZHVyZVJlbGF0aW9uSWQsIGZwaW5mbykpCi0JCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJ CQluID0gKE5vZGUgKikgdGxlLT5leHByOworCQkJCQkJfQogCi0JCQkJLyoKLQkJCQkgKiBSZWN1 cnNlIHRvIGlucHV0IGFyZ3MuIGFnZ2RpcmVjdGFyZ3MsIGFnZ29yZGVyIGFuZAotCQkJCSAqIGFn Z2Rpc3RpbmN0IGFyZSBhbGwgcHJlc2VudCBpbiBhcmdzLCBzbyBubyBuZWVkIHRvIGNoZWNrCi0J CQkJICogdGhlaXIgc2hpcHBhYmlsaXR5IGV4cGxpY2l0bHkuCi0JCQkJICovCi0JCQkJZm9yZWFj aChsYywgYWdnLT5hcmdzKQotCQkJCXsKLQkJCQkJTm9kZQkgICAqbiA9IChOb2RlICopIGxmaXJz dChsYyk7CisJCQkJCQlpZiAoIWZvcmVpZ25fZXhwcl93YWxrZXIobiwKKwkJCQkJCQkJCQkJCSBn bG9iX2N4dCwgJmlubmVyX2N4dCwgY2FzZV9hcmdfY3h0KSkKKwkJCQkJCQlyZXR1cm4gZmFsc2U7 CisJCQkJCX0KIAotCQkJCQkvKiBJZiBUYXJnZXRFbnRyeSwgZXh0cmFjdCB0aGUgZXhwcmVzc2lv biBmcm9tIGl0ICovCi0JCQkJCWlmIChJc0EobiwgVGFyZ2V0RW50cnkpKQorCQkJCQkvKgorCQkJ CQkgKiBGb3IgYWdnb3JkZXIgZWxlbWVudHMsIGNoZWNrIHdoZXRoZXIgdGhlIHNvcnQgb3BlcmF0 b3IsCisJCQkJCSAqIGlmIHNwZWNpZmllZCwgaXMgc2hpcHBhYmxlIG9yIG5vdC4KKwkJCQkJICov CisJCQkJCWlmIChhZ2ctPmFnZ29yZGVyKQogCQkJCQl7Ci0JCQkJCQlUYXJnZXRFbnRyeSAqdGxl ID0gKFRhcmdldEVudHJ5ICopIG47Ci0KLQkJCQkJCW4gPSAoTm9kZSAqKSB0bGUtPmV4cHI7CisJ CQkJCQlMaXN0Q2VsbCAgICpsYzsKKworCQkJCQkJZm9yZWFjaChsYywgYWdnLT5hZ2dvcmRlcikK KwkJCQkJCXsKKwkJCQkJCQlTb3J0R3JvdXBDbGF1c2UgKnNydCA9IChTb3J0R3JvdXBDbGF1c2Ug KikgbGZpcnN0KGxjKTsKKwkJCQkJCQlPaWQJCQlzb3J0Y29sdHlwZTsKKwkJCQkJCQlUeXBlQ2Fj aGVFbnRyeSAqdHlwZW50cnk7CisJCQkJCQkJVGFyZ2V0RW50cnkgKnRsZTsKKworCQkJCQkJCXRs ZSA9IGdldF9zb3J0Z3JvdXByZWZfdGxlKHNydC0+dGxlU29ydEdyb3VwUmVmLAorCQkJCQkJCQkJ CQkJCSAgIGFnZy0+YXJncyk7CisJCQkJCQkJc29ydGNvbHR5cGUgPSBleHByVHlwZSgoTm9kZSAq KSB0bGUtPmV4cHIpOworCQkJCQkJCXR5cGVudHJ5ID0gbG9va3VwX3R5cGVfY2FjaGUoc29ydGNv bHR5cGUsCisJCQkJCQkJCQkJCQkJCSBUWVBFQ0FDSEVfTFRfT1BSIHwgVFlQRUNBQ0hFX0dUX09Q Uik7CisKKwkJCQkJCQkvKgorCQkJCQkJCSAqIENoZWNrIHNoaXBwYWJpbGl0eSBvZiBub24tZGVm YXVsdCBzb3J0CisJCQkJCQkJICogb3BlcmF0b3IuCisJCQkJCQkJICovCisJCQkJCQkJaWYgKHNy dC0+c29ydG9wICE9IHR5cGVudHJ5LT5sdF9vcHIgJiYKKwkJCQkJCQkJc3J0LT5zb3J0b3AgIT0g dHlwZW50cnktPmd0X29wciAmJgorCQkJCQkJCQkhaXNfc2hpcHBhYmxlKHNydC0+c29ydG9wLCBP cGVyYXRvclJlbGF0aW9uSWQsCisJCQkJCQkJCQkJCSAgZnBpbmZvKSkKKwkJCQkJCQkJcmV0dXJu IGZhbHNlOworCQkJCQkJfQogCQkJCQl9CiAKLQkJCQkJaWYgKCFmb3JlaWduX2V4cHJfd2Fsa2Vy KG4sCisJCQkJCS8qIENoZWNrIGFnZ3JlZ2F0ZSBmaWx0ZXIgKi8KKwkJCQkJaWYgKCFmb3JlaWdu X2V4cHJfd2Fsa2VyKChOb2RlICopIGFnZy0+YWdnZmlsdGVyLAogCQkJCQkJCQkJCQkgZ2xvYl9j eHQsICZpbm5lcl9jeHQsIGNhc2VfYXJnX2N4dCkpCiAJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJ fQogCi0JCQkJLyoKLQkJCQkgKiBGb3IgYWdnb3JkZXIgZWxlbWVudHMsIGNoZWNrIHdoZXRoZXIg dGhlIHNvcnQgb3BlcmF0b3IsIGlmCi0JCQkJICogc3BlY2lmaWVkLCBpcyBzaGlwcGFibGUgb3Ig bm90LgotCQkJCSAqLwotCQkJCWlmIChhZ2ctPmFnZ29yZGVyKQotCQkJCXsKLQkJCQkJTGlzdENl bGwgICAqbGM7CisJCQkJCS8qCisJCQkJCSAqIElmIGFnZ3JlZ2F0ZSdzIGlucHV0IGNvbGxhdGlv biBpcyBub3QgZGVyaXZlZCBmcm9tIGEKKwkJCQkJICogZm9yZWlnbiBWYXIsIGl0IGNhbid0IGJl IHNlbnQgdG8gcmVtb3RlLgorCQkJCQkgKi8KKwkJCQkJaWYgKGFnZy0+aW5wdXRjb2xsaWQgPT0g SW52YWxpZE9pZCkKKwkJCQkJCSAvKiBPSywgaW5wdXRzIGFyZSBhbGwgbm9uY29sbGF0YWJsZSAq LyA7CisJCQkJCWVsc2UgaWYgKGlubmVyX2N4dC5zdGF0ZSAhPSBGRFdfQ09MTEFURV9TQUZFIHx8 CisJCQkJCQkJIGFnZy0+aW5wdXRjb2xsaWQgIT0gaW5uZXJfY3h0LmNvbGxhdGlvbikKKwkJCQkJ CXJldHVybiBmYWxzZTsKIAotCQkJCQlmb3JlYWNoKGxjLCBhZ2ctPmFnZ29yZGVyKQotCQkJCQl7 Ci0JCQkJCQlTb3J0R3JvdXBDbGF1c2UgKnNydCA9IChTb3J0R3JvdXBDbGF1c2UgKikgbGZpcnN0 KGxjKTsKLQkJCQkJCU9pZAkJCXNvcnRjb2x0eXBlOwotCQkJCQkJVHlwZUNhY2hlRW50cnkgKnR5 cGVudHJ5OwotCQkJCQkJVGFyZ2V0RW50cnkgKnRsZTsKLQotCQkJCQkJdGxlID0gZ2V0X3NvcnRn cm91cHJlZl90bGUoc3J0LT50bGVTb3J0R3JvdXBSZWYsCi0JCQkJCQkJCQkJCQkgICBhZ2ctPmFy Z3MpOwotCQkJCQkJc29ydGNvbHR5cGUgPSBleHByVHlwZSgoTm9kZSAqKSB0bGUtPmV4cHIpOwot CQkJCQkJdHlwZW50cnkgPSBsb29rdXBfdHlwZV9jYWNoZShzb3J0Y29sdHlwZSwKLQkJCQkJCQkJ CQkJCQkgVFlQRUNBQ0hFX0xUX09QUiB8IFRZUEVDQUNIRV9HVF9PUFIpOwotCQkJCQkJLyogQ2hl Y2sgc2hpcHBhYmlsaXR5IG9mIG5vbi1kZWZhdWx0IHNvcnQgb3BlcmF0b3IuICovCi0JCQkJCQlp ZiAoc3J0LT5zb3J0b3AgIT0gdHlwZW50cnktPmx0X29wciAmJgotCQkJCQkJCXNydC0+c29ydG9w ICE9IHR5cGVudHJ5LT5ndF9vcHIgJiYKLQkJCQkJCQkhaXNfc2hpcHBhYmxlKHNydC0+c29ydG9w LCBPcGVyYXRvclJlbGF0aW9uSWQsCi0JCQkJCQkJCQkJICBmcGluZm8pKQotCQkJCQkJCXJldHVy biBmYWxzZTsKLQkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBEZXRlY3Qgd2hldGhlciBub2RlIGlz IGludHJvZHVjaW5nIGEgY29sbGF0aW9uIG5vdAorCQkJCQkgKiBkZXJpdmVkIGZyb20gYSBmb3Jl aWduIFZhci4gIChJZiBzbywgd2UganVzdCBtYXJrIGl0CisJCQkJCSAqIHVuc2FmZSBmb3Igbm93 IHJhdGhlciB0aGFuIGltbWVkaWF0ZWx5IHJldHVybmluZyBmYWxzZSwKKwkJCQkJICogc2luY2Ug dGhlIHBhcmVudCBub2RlIG1pZ2h0IG5vdCBjYXJlLikKKwkJCQkJICovCisJCQkJCWNvbGxhdGlv biA9IGFnZy0+YWdnY29sbGlkOworCQkJCQlpZiAoY29sbGF0aW9uID09IEludmFsaWRPaWQpCisJ CQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX05PTkU7CisJCQkJCWVsc2UgaWYgKGlubmVyX2N4dC5z dGF0ZSA9PSBGRFdfQ09MTEFURV9TQUZFICYmCisJCQkJCQkJIGNvbGxhdGlvbiA9PSBpbm5lcl9j eHQuY29sbGF0aW9uKQorCQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9TQUZFOworCQkJCQllbHNl IGlmIChjb2xsYXRpb24gPT0gREVGQVVMVF9DT0xMQVRJT05fT0lEKQorCQkJCQkJc3RhdGUgPSBG RFdfQ09MTEFURV9OT05FOworCQkJCQllbHNlCisJCQkJCQlzdGF0ZSA9IEZEV19DT0xMQVRFX1VO U0FGRTsKIAkJCQl9Ci0KLQkJCQkvKiBDaGVjayBhZ2dyZWdhdGUgZmlsdGVyICovCi0JCQkJaWYg KCFmb3JlaWduX2V4cHJfd2Fsa2VyKChOb2RlICopIGFnZy0+YWdnZmlsdGVyLAotCQkJCQkJCQkJ CSBnbG9iX2N4dCwgJmlubmVyX2N4dCwgY2FzZV9hcmdfY3h0KSkKLQkJCQkJcmV0dXJuIGZhbHNl OwotCi0JCQkJLyoKLQkJCQkgKiBJZiBhZ2dyZWdhdGUncyBpbnB1dCBjb2xsYXRpb24gaXMgbm90 IGRlcml2ZWQgZnJvbSBhCi0JCQkJICogZm9yZWlnbiBWYXIsIGl0IGNhbid0IGJlIHNlbnQgdG8g cmVtb3RlLgotCQkJCSAqLwotCQkJCWlmIChhZ2ctPmlucHV0Y29sbGlkID09IEludmFsaWRPaWQp Ci0JCQkJCSAvKiBPSywgaW5wdXRzIGFyZSBhbGwgbm9uY29sbGF0YWJsZSAqLyA7Ci0JCQkJZWxz ZSBpZiAoaW5uZXJfY3h0LnN0YXRlICE9IEZEV19DT0xMQVRFX1NBRkUgfHwKLQkJCQkJCSBhZ2ct PmlucHV0Y29sbGlkICE9IGlubmVyX2N4dC5jb2xsYXRpb24pCi0JCQkJCXJldHVybiBmYWxzZTsK KwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CiAKIAkJCQkvKgotCQkJCSAqIERldGVjdCB3aGV0aGVy IG5vZGUgaXMgaW50cm9kdWNpbmcgYSBjb2xsYXRpb24gbm90IGRlcml2ZWQKLQkJCQkgKiBmcm9t IGEgZm9yZWlnbiBWYXIuICAoSWYgc28sIHdlIGp1c3QgbWFyayBpdCB1bnNhZmUgZm9yIG5vdwot CQkJCSAqIHJhdGhlciB0aGFuIGltbWVkaWF0ZWx5IHJldHVybmluZyBmYWxzZSwgc2luY2UgdGhl IHBhcmVudAotCQkJCSAqIG5vZGUgbWlnaHQgbm90IGNhcmUuKQorCQkJCSAqIElmIGl0J3MgYW55 dGhpbmcgZWxzZSwgYXNzdW1lIGl0J3MgdW5zYWZlLiAgVGhpcyBsaXN0IGNhbgorCQkJCSAqIGJl IGV4cGFuZGVkIGxhdGVyLCBidXQgZG9uJ3QgZm9yZ2V0IHRvIGFkZCBkZXBhcnNlIHN1cHBvcnQK KwkJCQkgKiBiZWxvdy4KIAkJCQkgKi8KLQkJCQljb2xsYXRpb24gPSBhZ2ctPmFnZ2NvbGxpZDsK LQkJCQlpZiAoY29sbGF0aW9uID09IEludmFsaWRPaWQpCi0JCQkJCXN0YXRlID0gRkRXX0NPTExB VEVfTk9ORTsKLQkJCQllbHNlIGlmIChpbm5lcl9jeHQuc3RhdGUgPT0gRkRXX0NPTExBVEVfU0FG RSAmJgotCQkJCQkJIGNvbGxhdGlvbiA9PSBpbm5lcl9jeHQuY29sbGF0aW9uKQotCQkJCQlzdGF0 ZSA9IEZEV19DT0xMQVRFX1NBRkU7Ci0JCQkJZWxzZSBpZiAoY29sbGF0aW9uID09IERFRkFVTFRf Q09MTEFUSU9OX09JRCkKLQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9OT05FOwotCQkJCWVsc2UK LQkJCQkJc3RhdGUgPSBGRFdfQ09MTEFURV9VTlNBRkU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVm YXVsdDoKLQotCQkJLyoKLQkJCSAqIElmIGl0J3MgYW55dGhpbmcgZWxzZSwgYXNzdW1lIGl0J3Mg dW5zYWZlLiAgVGhpcyBsaXN0IGNhbiBiZQotCQkJICogZXhwYW5kZWQgbGF0ZXIsIGJ1dCBkb24n dCBmb3JnZXQgdG8gYWRkIGRlcGFyc2Ugc3VwcG9ydCBiZWxvdy4KLQkJCSAqLwotCQkJcmV0dXJu IGZhbHNlOworCQkJCXJldHVybiBmYWxzZTsKKwkJfQogCX0KIAogCS8qCkBAIC0xMDA5LDYgKzEw NDEsMTUgQEAgaXNfZm9yZWlnbl9wYXJhbShQbGFubmVySW5mbyAqcm9vdCwKIAlpZiAoZXhwciA9 PSBOVUxMKQogCQlyZXR1cm4gZmFsc2U7CiAKKwlpZiAoaXNfc3RhYmxlX2V4cHIoKE5vZGUgKikg ZXhwcikpCisJeworCQkvKgorCQkgKiBXZSBjYW4gZ2V0IGhlcmUgb25seSBpZiBpc19mb3JlaWdu X2V4cHIoZXhwcikgcmV0dXJuZWQgdHJ1ZSwgc28KKwkJICogaXQncyBhIHN1cHBvcnRlZCBzdGFi bGUgZXhwcmVzc2lvbi4KKwkJICovCisJCXJldHVybiB0cnVlOworCX0KKwogCXN3aXRjaCAobm9k ZVRhZyhleHByKSkKIAl7CiAJCWNhc2UgVF9WYXI6CkBAIC0yNTc1LDYgKzI2MTYsMTIgQEAgZGVw YXJzZUV4cHIoRXhwciAqbm9kZSwgZGVwYXJzZV9leHByX2N4dCAqY29udGV4dCkKIAlpZiAobm9k ZSA9PSBOVUxMKQogCQlyZXR1cm47CiAKKwlpZiAoaXNfc3RhYmxlX2V4cHIoKE5vZGUgKikgbm9k ZSkpCisJeworCQlkZXBhcnNlU3RhYmxlRXhwcihub2RlLCBjb250ZXh0KTsKKwkJcmV0dXJuOwor CX0KKwogCXN3aXRjaCAobm9kZVRhZyhub2RlKSkKIAl7CiAJCWNhc2UgVF9WYXI6CkBAIC0zMTky LDYgKzMyMzksNDUgQEAgZGVwYXJzZVJlbGFiZWxUeXBlKFJlbGFiZWxUeXBlICpub2RlLCBkZXBh cnNlX2V4cHJfY3h0ICpjb250ZXh0KQogCQkJCQkJCQkJCSAgIG5vZGUtPnJlc3VsdHR5cG1vZCkp OwogfQogCisvKgorICogRGVwYXJzZSBhIHN0YWJsZSBleHByZXNzaW9uIGFzIHBhcmFtCisgKi8K K3N0YXRpYyB2b2lkCitkZXBhcnNlU3RhYmxlRXhwcihFeHByICpub2RlLCBkZXBhcnNlX2V4cHJf Y3h0ICpjb250ZXh0KQoreworCWludDMyCQl0eXBlID0gZXhwclR5cGUoKE5vZGUgKikgbm9kZSk7 CisJaW50MzIJCXR5cG1vZCA9IGV4cHJUeXBtb2QoKE5vZGUgKikgbm9kZSk7CisKKwlBc3NlcnQo dHlwZSAhPSBJbnZhbGlkT2lkKTsKKworCS8qIFRyZWF0IGxpa2UgYSBQYXJhbSAqLworCWlmIChj b250ZXh0LT5wYXJhbXNfbGlzdCkKKwl7CisJCWludAkJCXBpbmRleCA9IDA7CisJCUxpc3RDZWxs ICAgKmxjOworCisJCS8qIGZpbmQgaXRzIGluZGV4IGluIHBhcmFtc19saXN0ICovCisJCWZvcmVh Y2gobGMsICpjb250ZXh0LT5wYXJhbXNfbGlzdCkKKwkJeworCQkJcGluZGV4Kys7CisJCQlpZiAo ZXF1YWwobm9kZSwgKE5vZGUgKikgbGZpcnN0KGxjKSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYg KGxjID09IE5VTEwpCisJCXsKKwkJCS8qIG5vdCBpbiBsaXN0LCBzbyBhZGQgaXQgKi8KKwkJCXBp bmRleCsrOworCQkJKmNvbnRleHQtPnBhcmFtc19saXN0ID0gbGFwcGVuZCgqY29udGV4dC0+cGFy YW1zX2xpc3QsIG5vZGUpOworCQl9CisKKwkJcHJpbnRSZW1vdGVQYXJhbShwaW5kZXgsIHR5cGUs IHR5cG1vZCwgY29udGV4dCk7CisJfQorCWVsc2UKKwl7CisJCXByaW50UmVtb3RlUGxhY2Vob2xk ZXIodHlwZSwgdHlwbW9kLCBjb250ZXh0KTsKKwl9Cit9CisKIC8qCiAgKiBEZXBhcnNlIGEgQm9v bEV4cHIgbm9kZS4KICAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0 ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3Rn cmVzX2Zkdy5vdXQKaW5kZXggN2Q2ZjdkOWUzZGYuLjVkZWZjMmQzNzU4IDEwMDY0NAotLS0gYS9j b250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CisrKyBiL2NvbnRy aWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKQEAgLTEwNzMsNiArMTA3 Myw5MyBAQCBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSB0MS5jMSA9PT0gdDEuYzIgb3JkZXIg YnkgdDEuYzIgbGltaXQgMTsKICAgMSB8ICAxIHwgMDAwMDEgfCBGcmkgSmFuIDAyIDAwOjAwOjAw IDE5NzAgUFNUIHwgRnJpIEphbiAwMiAwMDowMDowMCAxOTcwIHwgMSAgfCAxICAgICAgICAgIHwg Zm9vCiAoMSByb3cpCiAKKy0tIFRlc3Qgc3RhYmxlIGV4cHJlc3Npb25zIHB1c2hkb3duCitFWFBM QUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgYzEsYzIsYzQgRlJPTSBmdDIgV0hFUkUg YzQgPSBjdXJyZW50X3RpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGb3Jl aWduIFNjYW4gb24gcHVibGljLmZ0MgorICAgT3V0cHV0OiBjMSwgYzIsIGM0CisgICBSZW1vdGUg U1FMOiBTRUxFQ1QgIkMgMSIsIGMyLCBjNCBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgoYzQgPSAk MTo6dGltZXN0YW1wIHdpdGggdGltZSB6b25lKSkKKygzIHJvd3MpCisKK1NFTEVDVCBjMSxjMixj NCBGUk9NIGZ0MiBXSEVSRSBjNCA9IGN1cnJlbnRfdGltZXN0YW1wOworIGMxIHwgYzIgfCBjNCAK Ky0tLS0rLS0tLSstLS0tCisoMCByb3dzKQorCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYp CitTRUxFQ1QgYzEsYzIsYzUgRlJPTSBmdDIgV0hFUkUgYzUgPiBsb2NhbHRpbWVzdGFtcCAtIGlu dGVydmFsICcxMDAwIHllYXJzJyBBTkQgYzEgPiA5OTAgT1JERVIgQlkgYzE7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMuZnQyCisgICBPdXRwdXQ6IGMxLCBjMiwg YzUKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIsIGM1IEZST00gIlMgMSIuIlQgMSIg V0hFUkUgKCgiQyAxIiA+IDk5MCkpIEFORCAoKGM1ID4gJDE6OnRpbWVzdGFtcCB3aXRob3V0IHRp bWUgem9uZSkpIE9SREVSIEJZICJDIDEiIEFTQyBOVUxMUyBMQVNUCisoMyByb3dzKQorCitTRUxF Q1QgYzEsYzIsYzUgRlJPTSBmdDIgV0hFUkUgYzUgPiBsb2NhbHRpbWVzdGFtcCAtIGludGVydmFs ICcxMDAwIHllYXJzJyBBTkQgYzEgPiA5OTAgT1JERVIgQlkgYzE7CisgIGMxICB8IGMyIHwgICAg ICAgICAgICBjNSAgICAgICAgICAgIAorLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAgOTkxIHwgIDEgfCBUaHUgQXByIDAyIDAwOjAwOjAwIDE5NzAKKyAgOTkyIHwgIDIg fCBGcmkgQXByIDAzIDAwOjAwOjAwIDE5NzAKKyAgOTkzIHwgIDMgfCBTYXQgQXByIDA0IDAwOjAw OjAwIDE5NzAKKyAgOTk0IHwgIDQgfCBTdW4gQXByIDA1IDAwOjAwOjAwIDE5NzAKKyAgOTk1IHwg IDUgfCBNb24gQXByIDA2IDAwOjAwOjAwIDE5NzAKKyAgOTk2IHwgIDYgfCBUdWUgQXByIDA3IDAw OjAwOjAwIDE5NzAKKyAgOTk3IHwgIDcgfCBXZWQgQXByIDA4IDAwOjAwOjAwIDE5NzAKKyAgOTk4 IHwgIDggfCBUaHUgQXByIDA5IDAwOjAwOjAwIDE5NzAKKyAgOTk5IHwgIDkgfCBGcmkgQXByIDEw IDAwOjAwOjAwIDE5NzAKKyAxMDAwIHwgIDAgfCBUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAKKygx MCByb3dzKQorCistLSBhbHNvIHNoaXBwYWJsZSBhcyB3aG9sZSBleHByZXNzaW9uIGlzIGV4ZWN1 dGVkIGxvY2FsbHkKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCBjMSxjMixj NCBGUk9NIGZ0MiBXSEVSRSBjNCA+IGN1cnJlbnRfdGltZXN0YW1wIC0gaW50ZXJ2YWwgJzEwMDAg eWVhcnMnIEFORCBjMSA+IDk5MCBPUkRFUiBCWSBjMTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRm9yZWlnbiBT Y2FuIG9uIHB1YmxpYy5mdDIKKyAgIE91dHB1dDogYzEsIGMyLCBjNAorICAgUmVtb3RlIFNRTDog U0VMRUNUICJDIDEiLCBjMiwgYzQgRlJPTSAiUyAxIi4iVCAxIiBXSEVSRSAoKCJDIDEiID4gOTkw KSkgQU5EICgoYzQgPiAkMTo6dGltZXN0YW1wIHdpdGggdGltZSB6b25lKSkgT1JERVIgQlkgIkMg MSIgQVNDIE5VTExTIExBU1QKKygzIHJvd3MpCisKK1NFTEVDVCBjMSxjMixjNCBGUk9NIGZ0MiBX SEVSRSBjNCA+IGN1cnJlbnRfdGltZXN0YW1wIC0gaW50ZXJ2YWwgJzEwMDAgeWVhcnMnIEFORCBj MSA+IDk5MCBPUkRFUiBCWSBjMTsKKyAgYzEgIHwgYzIgfCAgICAgICAgICAgICAgYzQgICAgICAg ICAgICAgIAorLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDk5 MSB8ICAxIHwgVGh1IEFwciAwMiAwMDowMDowMCAxOTcwIFBTVAorICA5OTIgfCAgMiB8IEZyaSBB cHIgMDMgMDA6MDA6MDAgMTk3MCBQU1QKKyAgOTkzIHwgIDMgfCBTYXQgQXByIDA0IDAwOjAwOjAw IDE5NzAgUFNUCisgIDk5NCB8ICA0IHwgU3VuIEFwciAwNSAwMDowMDowMCAxOTcwIFBTVAorICA5 OTUgfCAgNSB8IE1vbiBBcHIgMDYgMDA6MDA6MDAgMTk3MCBQU1QKKyAgOTk2IHwgIDYgfCBUdWUg QXByIDA3IDAwOjAwOjAwIDE5NzAgUFNUCisgIDk5NyB8ICA3IHwgV2VkIEFwciAwOCAwMDowMDow MCAxOTcwIFBTVAorICA5OTggfCAgOCB8IFRodSBBcHIgMDkgMDA6MDA6MDAgMTk3MCBQU1QKKyAg OTk5IHwgIDkgfCBGcmkgQXByIDEwIDAwOjAwOjAwIDE5NzAgUFNUCisgMTAwMCB8ICAwIHwgVGh1 IEphbiAwMSAwMDowMDowMCAxOTcwIFBTVAorKDEwIHJvd3MpCisKKy0tIGRpcmVjdCBtb2RpZnkK K0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1VQREFURSBmdDIgU0VUIGM0ID0gY3VycmVu dF90aW1lc3RhbXAgV0hFUkUgYzQgPCBjdXJyZW50X3RpbWVzdGFtcDsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIFVwZGF0ZSBvbiBwdWJsaWMuZnQyCisgICAtPiAgRm9yZWlnbiBVcGRhdGUgb24gcHVi bGljLmZ0MgorICAgICAgICAgUmVtb3RlIFNRTDogVVBEQVRFICJTIDEiLiJUIDEiIFNFVCBjNCA9 ICQxOjp0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmUgV0hFUkUgKChjNCA8ICQxOjp0aW1lc3RhbXAg d2l0aCB0aW1lIHpvbmUpKQorKDMgcm93cykKKworLS0gY2hlY2sgdGhhdCB3ZSBkb24ndCB0cnkg dG8gcHVzaCBkb3duIHBhcmFtZXRlciBpbiBncm91cCBieQorRVhQTEFJTiAoVkVSQk9TRSwgQ09T VFMgT0ZGKQorU0VMRUNUIHN1bShjMSksIGN1cnJlbnRfdGltZXN0YW1wIEZST00gZnQyIFdIRVJF IGMxID4gOTkwIEdST1VQIEJZIGN1cnJlbnRfdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIEdyb3VwQWdncmVnYXRlCisgICBPdXRwdXQ6IHN1bShjMSksIChD VVJSRU5UX1RJTUVTVEFNUCkKKyAgIEdyb3VwIEtleTogQ1VSUkVOVF9USU1FU1RBTVAKKyAgIC0+ ICBGb3JlaWduIFNjYW4gb24gcHVibGljLmZ0MgorICAgICAgICAgT3V0cHV0OiBDVVJSRU5UX1RJ TUVTVEFNUCwgYzEKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiBGUk9NICJTIDEi LiJUIDEiIFdIRVJFICgoIkMgMSIgPiA5OTApKQorKDYgcm93cykKKwogLS0gVGVzdCBDQVNFIHB1 c2hkb3duCiBFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCiBTRUxFQ1QgYzEsYzIsYzMgRlJP TSBmdDIgV0hFUkUgQ0FTRSBXSEVOIGMxID4gOTkwIFRIRU4gYzEgRU5EIDwgMTAwMCBPUkRFUiBC WSBjMTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jIGIv Y29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKaW5kZXggMDlhM2Y1ZTIzY2IuLjZh YTNhMjBmMjBjIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcu YworKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYwpAQCAtNDgzNCwxMiAr NDgzNCw5IEBAIHByZXBhcmVfcXVlcnlfcGFyYW1zKFBsYW5TdGF0ZSAqbm9kZSwKIAl9CiAKIAkv KgotCSAqIFByZXBhcmUgcmVtb3RlLXBhcmFtZXRlciBleHByZXNzaW9ucyBmb3IgZXZhbHVhdGlv bi4gIChOb3RlOiBpbgotCSAqIHByYWN0aWNlLCB3ZSBleHBlY3QgdGhhdCBhbGwgdGhlc2UgZXhw cmVzc2lvbnMgd2lsbCBiZSBqdXN0IFBhcmFtcywgc28KLQkgKiB3ZSBjb3VsZCBwb3NzaWJseSBk byBzb21ldGhpbmcgbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZyB0aGUgZnVsbAotCSAqIGV4cHJl c3Npb24tZXZhbCBtYWNoaW5lcnkgZm9yIHRoaXMuICBCdXQgcHJvYmFibHkgdGhlcmUgd291bGQg YmUgbGl0dGxlCi0JICogYmVuZWZpdCwgYW5kIGl0J2QgcmVxdWlyZSBwb3N0Z3Jlc19mZHcgdG8g a25vdyBtb3JlIHRoYW4gaXMgZGVzaXJhYmxlCi0JICogYWJvdXQgUGFyYW0gZXZhbHVhdGlvbi4p CisJICogUHJlcGFyZSByZW1vdGUtcGFyYW1ldGVyIGV4cHJlc3Npb25zIGZvciBldmFsdWF0aW9u LiAgKE5vdGU6IHdlIGNhbm5vdAorCSAqIGV4cGVjdCB0aGF0IGFsbCB0aGVzZSBleHByZXNzaW9u cyB3aWxsIGJlIGp1c3QgUGFyYW1zLCBzbyB3ZSBzaG91bGQgdXNlCisJICogdGhlIGZ1bGwgZXhw cmVzc2lvbi1ldmFsIG1hY2hpbmVyeSBmb3IgdGhpcykuCiAJICovCiAJKnBhcmFtX2V4cHJzID0g RXhlY0luaXRFeHByTGlzdChmZHdfZXhwcnMsIG5vZGUpOwogCmRpZmYgLS1naXQgYS9jb250cmli L3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3Rn cmVzX2Zkdy5oCmluZGV4IDhhZTc5ZTk3ZTQ0Li5hY2IzNjM5NGZjNiAxMDA2NDQKLS0tIGEvY29u dHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19m ZHcvcG9zdGdyZXNfZmR3LmgKQEAgLTIzMSw1ICsyMzEsNiBAQCBleHRlcm4gY29uc3QgY2hhciAq Z2V0X2pvaW50eXBlX25hbWUoSm9pblR5cGUgam9pbnR5cGUpOwogLyogaW4gc2hpcHBhYmxlLmMg Ki8KIGV4dGVybiBib29sIGlzX2J1aWx0aW4oT2lkIG9iamVjdElkKTsKIGV4dGVybiBib29sIGlz X3NoaXBwYWJsZShPaWQgb2JqZWN0SWQsIE9pZCBjbGFzc0lkLCBQZ0Zkd1JlbGF0aW9uSW5mbyAq ZnBpbmZvKTsKK2V4dGVybiBib29sIGlzX3N0YWJsZV9leHByKE5vZGUgKm5vZGUpOwogCiAjZW5k aWYJCQkJCQkJLyogUE9TVEdSRVNfRkRXX0ggKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L3NoaXBwYWJsZS5jIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc2hpcHBhYmxlLmMKaW5k ZXggOGU3NTlkYTAwZDUuLjUxNzNkNzUwMDM1IDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVz X2Zkdy9zaGlwcGFibGUuYworKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9zaGlwcGFibGUuYwpA QCAtMjUsOSArMjUsMTQgQEAKIAogI2luY2x1ZGUgImFjY2Vzcy90cmFuc2FtLmgiCiAjaW5jbHVk ZSAiY2F0YWxvZy9kZXBlbmRlbmN5LmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19wcm9jLmgiCisj aW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCisjaW5jbHVkZSAib3B0aW1pemVyL2NsYXVzZXMu aCIKKyNpbmNsdWRlICJvcHRpbWl6ZXIvb3B0aW1pemVyLmgiCiAjaW5jbHVkZSAicG9zdGdyZXNf ZmR3LmgiCiAjaW5jbHVkZSAidXRpbHMvaHNlYXJjaC5oIgogI2luY2x1ZGUgInV0aWxzL2ludmFs LmgiCisjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAjaW5jbHVkZSAidXRpbHMvc3lzY2Fj aGUuaCIKIAogLyogSGFzaCB0YWJsZSBmb3IgY2FjaGluZyB0aGUgcmVzdWx0cyBvZiBzaGlwcGFi aWxpdHkgbG9va3VwcyAqLwpAQCAtNTIsNiArNTcsNyBAQCB0eXBlZGVmIHN0cnVjdAogCWJvb2wJ CXNoaXBwYWJsZTsKIH0gU2hpcHBhYmxlQ2FjaGVFbnRyeTsKIAorc3RhdGljIGJvb2wgY29udGFp bl9wYXJhbXNfd2Fsa2VyKE5vZGUgKm5vZGUsIGJvb2wgKmNvbnRleHQpOwogCiAvKgogICogRmx1 c2ggY2FjaGUgZW50cmllcyB3aGVuIHBnX2ZvcmVpZ25fc2VydmVyIGlzIHVwZGF0ZWQuCkBAIC0y MDksMyArMjE1LDcxIEBAIGlzX3NoaXBwYWJsZShPaWQgb2JqZWN0SWQsIE9pZCBjbGFzc0lkLCBQ Z0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvKQogCiAJcmV0dXJuIGVudHJ5LT5zaGlwcGFibGU7CiB9 CisKKy8qCisgKiBjb250YWluX3BhcmFtcworICogICBEb2VzIHRoaXMgbm9kZSBoYXMgcGFyYW1z PworICovCitzdGF0aWMgYm9vbAorY29udGFpbl9wYXJhbXMoTm9kZSAqbm9kZSkKK3sKKwlib29s CQljb250YWlucyA9IGZhbHNlOworCisJY29udGFpbl9wYXJhbXNfd2Fsa2VyKG5vZGUsICh2b2lk ICopICZjb250YWlucyk7CisKKwlyZXR1cm4gY29udGFpbnM7Cit9CisKK3N0YXRpYyBib29sCitj b250YWluX3BhcmFtc193YWxrZXIoTm9kZSAqbm9kZSwgYm9vbCAqY29udGV4dCkKK3sKKwlpZiAo bm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKElzQShub2RlLCBQYXJhbSkpCisJ eworCQkqY29udGV4dCA9IHRydWU7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gZXhw cmVzc2lvbl90cmVlX3dhbGtlcihub2RlLCBjb250YWluX3BhcmFtc193YWxrZXIsCisJCQkJCQkJ CSAgKHZvaWQgKikgY29udGV4dCk7Cit9CisKKy8qCisgKiBDaGVjayBpZiBleHByZXNzaW9uIGlz IHN0YWJsZQorICovCitib29sCitpc19zdGFibGVfZXhwcihOb2RlICpub2RlKQoreworCWlmIChu b2RlID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCS8qIE5vIG5lZWQgdG8gdHVybiBvbiAn c2hpcCBzdGFibGUgZXhwcmVzc2lvbicgbWFjaGluZXJ5IGluIHRoZXNlIGNhc2VzICovCisJaWYg KElzQShub2RlLCBDb25zdCkgfHwgSXNBKG5vZGUsIExpc3QpKQorCQlyZXR1cm4gZmFsc2U7CisK KwkvKiBFeHByZXNzaW9uIHNob3VsZG4ndCByZWZlcmVuY2UgYW55IHRhYmxlICovCisJaWYgKGNv bnRhaW5fdmFyX2NsYXVzZShub2RlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGNvbnRhaW5f dm9sYXRpbGVfZnVuY3Rpb25zKG5vZGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoY29udGFp bl9zdWJwbGFucyhub2RlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGNvbnRhaW5fcGFyYW1z KG5vZGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoY29udGFpbl9hZ2dfY2xhdXNlKG5vZGUp KQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoY29udGFpbl9tdXRhYmxlX2Z1bmN0aW9ucyhub2Rl KSkKKwl7CisJCS8qIFRoZXNlIGFyZSBub3Qgdm9sYXRpbGUgZnVuY3Rpb25zLCBzbyB0aGV5IGFy ZSBzdGFibGUgKi8KKwkJaWYgKGV4cHJUeXBlKG5vZGUpICE9IEludmFsaWRPaWQpCisJCQlyZXR1 cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3Bv c3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Nx bC9wb3N0Z3Jlc19mZHcuc3FsCmluZGV4IDllYjY3M2UzNjkzLi5kZTA4NGJjNGVjZSAxMDA2NDQK LS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKKysrIGIvY29u dHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKQEAgLTQxMyw2ICs0MTMsMjgg QEAgRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQogICBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBX SEVSRSB0MS5jMSA9PT0gdDEuYzIgb3JkZXIgYnkgdDEuYzIgbGltaXQgMTsKIFNFTEVDVCAqIEZS T00gZnQxIHQxIFdIRVJFIHQxLmMxID09PSB0MS5jMiBvcmRlciBieSB0MS5jMiBsaW1pdCAxOwog CistLSBUZXN0IHN0YWJsZSBleHByZXNzaW9ucyBwdXNoZG93bgorRVhQTEFJTiAoVkVSQk9TRSwg Q09TVFMgT0ZGKQorU0VMRUNUIGMxLGMyLGM0IEZST00gZnQyIFdIRVJFIGM0ID0gY3VycmVudF90 aW1lc3RhbXA7CitTRUxFQ1QgYzEsYzIsYzQgRlJPTSBmdDIgV0hFUkUgYzQgPSBjdXJyZW50X3Rp bWVzdGFtcDsKKworRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIGMxLGMyLGM1 IEZST00gZnQyIFdIRVJFIGM1ID4gbG9jYWx0aW1lc3RhbXAgLSBpbnRlcnZhbCAnMTAwMCB5ZWFy cycgQU5EIGMxID4gOTkwIE9SREVSIEJZIGMxOworU0VMRUNUIGMxLGMyLGM1IEZST00gZnQyIFdI RVJFIGM1ID4gbG9jYWx0aW1lc3RhbXAgLSBpbnRlcnZhbCAnMTAwMCB5ZWFycycgQU5EIGMxID4g OTkwIE9SREVSIEJZIGMxOworCistLSBhbHNvIHNoaXBwYWJsZSBhcyB3aG9sZSBleHByZXNzaW9u IGlzIGV4ZWN1dGVkIGxvY2FsbHkKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVD VCBjMSxjMixjNCBGUk9NIGZ0MiBXSEVSRSBjNCA+IGN1cnJlbnRfdGltZXN0YW1wIC0gaW50ZXJ2 YWwgJzEwMDAgeWVhcnMnIEFORCBjMSA+IDk5MCBPUkRFUiBCWSBjMTsKK1NFTEVDVCBjMSxjMixj NCBGUk9NIGZ0MiBXSEVSRSBjNCA+IGN1cnJlbnRfdGltZXN0YW1wIC0gaW50ZXJ2YWwgJzEwMDAg eWVhcnMnIEFORCBjMSA+IDk5MCBPUkRFUiBCWSBjMTsKKworLS0gZGlyZWN0IG1vZGlmeQorRVhQ TEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorVVBEQVRFIGZ0MiBTRVQgYzQgPSBjdXJyZW50X3Rp bWVzdGFtcCBXSEVSRSBjNCA8IGN1cnJlbnRfdGltZXN0YW1wOworCistLSBjaGVjayB0aGF0IHdl IGRvbid0IHRyeSB0byBwdXNoIGRvd24gcGFyYW1ldGVyIGluIGdyb3VwIGJ5CitFWFBMQUlOIChW RVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgc3VtKGMxKSwgY3VycmVudF90aW1lc3RhbXAgRlJP TSBmdDIgV0hFUkUgYzEgPiA5OTAgR1JPVVAgQlkgY3VycmVudF90aW1lc3RhbXA7CisKIC0tIFRl c3QgQ0FTRSBwdXNoZG93bgogRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQogU0VMRUNUIGMx LGMyLGMzIEZST00gZnQyIFdIRVJFIENBU0UgV0hFTiBjMSA+IDk5MCBUSEVOIGMxIEVORCA8IDEw MDAgT1JERVIgQlkgYzE7Ci0tIAoyLjI1LjEKCg== --=_e44aa127caac0759071e68ad1575f92c--