Received: from maia.hub.org (maia-5.hub.org [200.46.204.29]) by mail.postgresql.org (Postfix) with ESMTP id 36608B5DC09 for ; Fri, 7 Oct 2011 06:13:05 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.29]) (amavisd-maia, port 10024) with ESMTP id 89594-09 for ; Fri, 7 Oct 2011 09:12:57 +0000 (UTC) X-Greylist: delayed 00:11:03.037092 by SQLgrey-1.8.0-rc2 Received: from tama500.ecl.ntt.co.jp (tama500.ecl.ntt.co.jp [129.60.39.148]) by mail.postgresql.org (Postfix) with ESMTP id AC077B5DC02 for ; Fri, 7 Oct 2011 06:12:55 -0300 (ADT) Received: from mfs6.rdh.ecl.ntt.co.jp (mfs6.rdh.ecl.ntt.co.jp [129.60.39.149]) by tama500.ecl.ntt.co.jp (8.14.5/8.14.5) with ESMTP id p9791m2n002211; Fri, 7 Oct 2011 18:01:48 +0900 (JST) Received: from mfs6.rdh.ecl.ntt.co.jp (localhost [127.0.0.1]) by mfs6.rdh.ecl.ntt.co.jp (Postfix) with ESMTP id 247B765F9; Fri, 7 Oct 2011 18:01:48 +0900 (JST) Received: from dmailsv1.y.ecl.ntt.co.jp (dmailsv1.y.ecl.ntt.co.jp [129.60.53.14]) by mfs6.rdh.ecl.ntt.co.jp (Postfix) with ESMTP id 0A09765EB; Fri, 7 Oct 2011 18:01:48 +0900 (JST) Received: from mailsv11.y.ecl.ntt.co.jp by dmailsv1.y.ecl.ntt.co.jp (8.14.4/dmailsv1-2.1) with ESMTP id p9791lpZ006814; Fri, 7 Oct 2011 18:01:47 +0900 (JST) Received: from localhost by mailsv11.y.ecl.ntt.co.jp (8.14.4/Lab-1.9) with ESMTP id p9791l7b011618; Fri, 7 Oct 2011 18:01:47 +0900 (JST) Message-ID: <4E8EC1D8.3080700@lab.ntt.co.jp> Date: Fri, 07 Oct 2011 18:09:44 +0900 From: Etsuro Fujita User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.9) Gecko/20100915 Thunderbird/3.1.4 MIME-Version: 1.0 CC: Shigeru Hanada , pgsql-hackers@postgresql.org Subject: Re: WIP: Collecting statistics on CSV file data References: <4E6DE18B.4010505@lab.ntt.co.jp> <4E7861C1.2000607@gmail.com> In-Reply-To: <4E7861C1.2000607@gmail.com> Content-Type: multipart/mixed; boundary="------------080504080301030801070700" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0.516 tagged_above=-5 required=5 tests=BAYES_20=-0.001, MISSING_HEADERS=1.021, RCVD_IN_DNSWL_NONE=-0.0001, RP_MATCHES_RCVD=-0.504 X-Spam-Level: X-Archive-Number: 201110/358 X-Sequence-Number: 196164 This is a multi-part message in MIME format. --------------080504080301030801070700 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Hi Hanada-san, I'm very sorry for late reply. (2011/09/20 18:49), Shigeru Hanada wrote: > I took a look at the patch, and found that it couldn't be applied > cleanly against HEAD. Please rebase your patch against current HEAD of > master branch, rather than 9.1beta1. > > The wiki pages below would be helpful for you. > http://wiki.postgresql.org/wiki/Submitting_a_Patch > http://wiki.postgresql.org/wiki/Creating_Clean_Patches > http://wiki.postgresql.org/wiki/Reviewing_a_Patch > > And it would be easy to use git to follow changes made by other > developers in master branch. > http://wiki.postgresql.org/wiki/Working_with_Git Thank you for the review and the helpful information. I rebased. Please find attached a patch. I'll add the patch to the next CF. Changes: * cleanups and fixes * addition of the following to ALTER FOREIGN TABLE ALTER [COLUMN] column SET STATISTICS integer ALTER [COLUMN] column SET ( n_distinct = val ) (n_distinct only) ALTER [COLUMN] column RESET ( n_distinct ) * reflection of the force_not_null info in acquiring sample rows * documentation Best regards, Etsuro Fujita --------------080504080301030801070700 Content-Type: text/plain; name="postgresql-analyze-v2.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="postgresql-analyze-v2.patch" KioqIGEvY29udHJpYi9maWxlX2Zkdy9maWxlX2Zkdy5jCi0tLSBiL2NvbnRyaWIvZmlsZV9m ZHcvZmlsZV9mZHcuYwoqKioqKioqKioqKioqKioKKioqIDE1LDMwICoqKioKLS0tIDE1LDQy IC0tLS0KICAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICAjaW5jbHVkZSA8dW5pc3RkLmg+CiAg CisgI2luY2x1ZGUgImFjY2Vzcy9odHVwLmgiCiAgI2luY2x1ZGUgImFjY2Vzcy9yZWxvcHRp b25zLmgiCisgI2luY2x1ZGUgImFjY2Vzcy90cmFuc2FtLmgiCiAgI2luY2x1ZGUgImNhdGFs b2cvcGdfZm9yZWlnbl90YWJsZS5oIgogICNpbmNsdWRlICJjb21tYW5kcy9jb3B5LmgiCisg I2luY2x1ZGUgImNvbW1hbmRzL2RiY29tbWFuZHMuaCIKICAjaW5jbHVkZSAiY29tbWFuZHMv ZGVmcmVtLmgiCiAgI2luY2x1ZGUgImNvbW1hbmRzL2V4cGxhaW4uaCIKKyAjaW5jbHVkZSAi Y29tbWFuZHMvdmFjdXVtLmgiCiAgI2luY2x1ZGUgImZvcmVpZ24vZmR3YXBpLmgiCiAgI2lu Y2x1ZGUgImZvcmVpZ24vZm9yZWlnbi5oIgogICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICAj aW5jbHVkZSAibm9kZXMvbWFrZWZ1bmNzLmgiCiAgI2luY2x1ZGUgIm9wdGltaXplci9jb3N0 LmgiCisgI2luY2x1ZGUgIm9wdGltaXplci9wbGFuY2F0LmgiCisgI2luY2x1ZGUgInBhcnNl ci9wYXJzZV9yZWxhdGlvbi5oIgorICNpbmNsdWRlICJwZ3N0YXQuaCIKKyAjaW5jbHVkZSAi dXRpbHMvYXR0b3B0Y2FjaGUuaCIKKyAjaW5jbHVkZSAidXRpbHMvZWxvZy5oIgorICNpbmNs dWRlICJ1dGlscy9ndWMuaCIKKyAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCisgI2lu Y2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCiAgI2luY2x1ZGUgInV0aWxzL3JlbC5oIgogICNp bmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgogIAoqKioqKioqKioqKioqKioKKioqIDEwMSwx MDYgKioqKiBzdGF0aWMgdm9pZCBmaWxlQmVnaW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0 YXRlICpub2RlLCBpbnQgZWZsYWdzKTsKLS0tIDExMywxMTkgLS0tLQogIHN0YXRpYyBUdXBs ZVRhYmxlU2xvdCAqZmlsZUl0ZXJhdGVGb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpu b2RlKTsKICBzdGF0aWMgdm9pZCBmaWxlUmVTY2FuRm9yZWlnblNjYW4oRm9yZWlnblNjYW5T dGF0ZSAqbm9kZSk7CiAgc3RhdGljIHZvaWQgZmlsZUVuZEZvcmVpZ25TY2FuKEZvcmVpZ25T Y2FuU3RhdGUgKm5vZGUpOworIHN0YXRpYyB2b2lkIGZpbGVBbmFseXplRm9yZWlnblRhYmxl KFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgaW50IGVsZXZlbCk7CiAg CiAgLyoKICAgKiBIZWxwZXIgZnVuY3Rpb25zCioqKioqKioqKioqKioqKgoqKiogMTEyLDEx OCAqKioqIHN0YXRpYyBMaXN0ICpnZXRfZmlsZV9mZHdfYXR0cmlidXRlX29wdGlvbnMoT2lk IHJlbGlkKTsKICBzdGF0aWMgdm9pZCBlc3RpbWF0ZV9jb3N0cyhQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqYmFzZXJlbCwKICAJCQkgICBjb25zdCBjaGFyICpmaWxlbmFtZSwK ICAJCQkgICBDb3N0ICpzdGFydHVwX2Nvc3QsIENvc3QgKnRvdGFsX2Nvc3QpOwohIAogIAog IC8qCiAgICogRm9yZWlnbi1kYXRhIHdyYXBwZXIgaGFuZGxlciBmdW5jdGlvbjogcmV0dXJu IGEgc3RydWN0IHdpdGggcG9pbnRlcnMKLS0tIDEyNSwxMzIgLS0tLQogIHN0YXRpYyB2b2lk IGVzdGltYXRlX2Nvc3RzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpiYXNlcmVs LAogIAkJCSAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogIAkJCSAgIENvc3QgKnN0YXJ0dXBf Y29zdCwgQ29zdCAqdG90YWxfY29zdCk7CiEgc3RhdGljIHZvaWQgZmlsZV9mZHdfZG9fYW5h bHl6ZV9yZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10LCBpbnQgZWxl dmVsKTsKISBzdGF0aWMgaW50ICBmaWxlX2Zkd19hY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0 aW9uIG9uZXJlbCwgaW50IGVsZXZlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3Ms IEJsb2NrTnVtYmVyICp0b3RhbHBhZ2VzLCBkb3VibGUgKnRvdGFscm93cyk7CiAgCiAgLyoK ICAgKiBGb3JlaWduLWRhdGEgd3JhcHBlciBoYW5kbGVyIGZ1bmN0aW9uOiByZXR1cm4gYSBz dHJ1Y3Qgd2l0aCBwb2ludGVycwoqKioqKioqKioqKioqKioKKioqIDEyOSwxMzQgKioqKiBm aWxlX2Zkd19oYW5kbGVyKFBHX0ZVTkNUSU9OX0FSR1MpCi0tLSAxNDMsMTQ5IC0tLS0KICAJ ZmR3cm91dGluZS0+SXRlcmF0ZUZvcmVpZ25TY2FuID0gZmlsZUl0ZXJhdGVGb3JlaWduU2Nh bjsKICAJZmR3cm91dGluZS0+UmVTY2FuRm9yZWlnblNjYW4gPSBmaWxlUmVTY2FuRm9yZWln blNjYW47CiAgCWZkd3JvdXRpbmUtPkVuZEZvcmVpZ25TY2FuID0gZmlsZUVuZEZvcmVpZ25T Y2FuOworIAlmZHdyb3V0aW5lLT5BbmFseXplRm9yZWlnblRhYmxlID0gZmlsZUFuYWx5emVG b3JlaWduVGFibGU7CiAgCiAgCVBHX1JFVFVSTl9QT0lOVEVSKGZkd3JvdXRpbmUpOwogIH0K KioqKioqKioqKioqKioqCioqKiA1NzUsNTgwICoqKiogZmlsZVJlU2NhbkZvcmVpZ25TY2Fu KEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUpCi0tLSA1OTAsNjA1IC0tLS0KICB9CiAgCiAgLyoK KyAgKiBmaWxlQW5hbHl6ZUZvcmVpZ25UYWJsZQorICAqCQlBbmFseXplIHRhYmxlCisgICov Cisgc3RhdGljIHZvaWQKKyBmaWxlQW5hbHl6ZUZvcmVpZ25UYWJsZShSZWxhdGlvbiBvbmVy ZWwsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIGludCBlbGV2ZWwpCisgeworIAlmaWxlX2Zkd19k b19hbmFseXplX3JlbChvbmVyZWwsIHZhY3N0bXQsIGVsZXZlbCk7CisgfQorIAorIC8qCiAg ICogRXN0aW1hdGUgY29zdHMgb2Ygc2Nhbm5pbmcgYSBmb3JlaWduIHRhYmxlLgogICAqLwog IHN0YXRpYyB2b2lkCioqKioqKioqKioqKioqKgoqKiogNTg0LDU5MCAqKioqIGVzdGltYXRl X2Nvc3RzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpiYXNlcmVsLAogIHsKICAJ c3RydWN0IHN0YXQgc3RhdF9idWY7CiAgCUJsb2NrTnVtYmVyIHBhZ2VzOwohIAlpbnQJCQl0 dXBsZV93aWR0aDsKICAJZG91YmxlCQludHVwbGVzOwogIAlkb3VibGUJCW5yb3dzOwogIAlD b3N0CQlydW5fY29zdCA9IDA7Ci0tLSA2MDksNjE2IC0tLS0KICB7CiAgCXN0cnVjdCBzdGF0 IHN0YXRfYnVmOwogIAlCbG9ja051bWJlciBwYWdlczsKISAJQmxvY2tOdW1iZXIJcmVscGFn ZXM7CiEgCWRvdWJsZQkJcmVsdHVwbGVzOwogIAlkb3VibGUJCW50dXBsZXM7CiAgCWRvdWJs ZQkJbnJvd3M7CiAgCUNvc3QJCXJ1bl9jb3N0ID0gMDsKKioqKioqKioqKioqKioqCioqKiA2 MDQsNjE5ICoqKiogZXN0aW1hdGVfY29zdHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdElu Zm8gKmJhc2VyZWwsCiAgCWlmIChwYWdlcyA8IDEpCiAgCQlwYWdlcyA9IDE7CiAgCiEgCS8q CiEgCSAqIEVzdGltYXRlIHRoZSBudW1iZXIgb2YgdHVwbGVzIGluIHRoZSBmaWxlLiAgV2Ug YmFjayBpbnRvIHRoaXMgZXN0aW1hdGUKISAJICogdXNpbmcgdGhlIHBsYW5uZXIncyBpZGVh IG9mIHRoZSByZWxhdGlvbiB3aWR0aDsgd2hpY2ggaXMgYm9ndXMgaWYgbm90CiEgCSAqIGFs bCBjb2x1bW5zIGFyZSBiZWluZyByZWFkLCBub3QgdG8gbWVudGlvbiB0aGF0IHRoZSB0ZXh0 IHJlcHJlc2VudGF0aW9uCiEgCSAqIG9mIGEgcm93IHByb2JhYmx5IGlzbid0IHRoZSBzYW1l IHNpemUgYXMgaXRzIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgohIAkgKiBGSVhNRSBsYXRl ci4KISAJICovCiEgCXR1cGxlX3dpZHRoID0gTUFYQUxJR04oYmFzZXJlbC0+d2lkdGgpICsg TUFYQUxJR04oc2l6ZW9mKEhlYXBUdXBsZUhlYWRlckRhdGEpKTsKICAKISAJbnR1cGxlcyA9 IGNsYW1wX3Jvd19lc3QoKGRvdWJsZSkgc3RhdF9idWYuc3Rfc2l6ZSAvIChkb3VibGUpIHR1 cGxlX3dpZHRoKTsKICAKICAJLyoKICAJICogTm93IGVzdGltYXRlIHRoZSBudW1iZXIgb2Yg cm93cyByZXR1cm5lZCBieSB0aGUgc2NhbiBhZnRlciBhcHBseWluZyB0aGUKLS0tIDYzMCw2 NjEgLS0tLQogIAlpZiAocGFnZXMgPCAxKQogIAkJcGFnZXMgPSAxOwogIAohIAlyZWxwYWdl cyA9IGJhc2VyZWwtPnBhZ2VzOwohIAlyZWx0dXBsZXMgPSBiYXNlcmVsLT50dXBsZXM7CiAg CiEgCWlmIChyZWxwYWdlcyA+IDApCiEgCXsKISAJCWRvdWJsZQkJZGVuc2l0eTsKISAKISAJ CWRlbnNpdHkgPSByZWx0dXBsZXMgLyAoZG91YmxlKSByZWxwYWdlczsKISAKISAJCW50dXBs ZXMgPSBjbGFtcF9yb3dfZXN0KGRlbnNpdHkgKiAoZG91YmxlKSBwYWdlcyk7CiEgCX0KISAJ ZWxzZQohIAl7CiEgCQlpbnQJCQl0dXBsZV93aWR0aDsKISAKISAJCS8qCiEgCQkgKiBFc3Rp bWF0ZSB0aGUgbnVtYmVyIG9mIHR1cGxlcyBpbiB0aGUgZmlsZS4gIFdlIGJhY2sgaW50byB0 aGlzIGVzdGltYXRlCiEgCQkgKiB1c2luZyB0aGUgcGxhbm5lcidzIGlkZWEgb2YgdGhlIHJl bGF0aW9uIHdpZHRoOyB3aGljaCBpcyBib2d1cyBpZiBub3QKISAJCSAqIGFsbCBjb2x1bW5z IGFyZSBiZWluZyByZWFkLCBub3QgdG8gbWVudGlvbiB0aGF0IHRoZSB0ZXh0IHJlcHJlc2Vu dGF0aW9uCiEgCQkgKiBvZiBhIHJvdyBwcm9iYWJseSBpc24ndCB0aGUgc2FtZSBzaXplIGFz IGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KISAJCSAqIEZJWE1FIGxhdGVyLgohIAkJ ICovCiEgCQl0dXBsZV93aWR0aCA9IE1BWEFMSUdOKGJhc2VyZWwtPndpZHRoKSArIE1BWEFM SUdOKHNpemVvZihIZWFwVHVwbGVIZWFkZXJEYXRhKSk7CiEgCiEgCQludHVwbGVzID0gY2xh bXBfcm93X2VzdCgoZG91YmxlKSBzdGF0X2J1Zi5zdF9zaXplIC8gKGRvdWJsZSkgdHVwbGVf d2lkdGgpOwohIAl9CiAgCiAgCS8qCiAgCSAqIE5vdyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9m IHJvd3MgcmV0dXJuZWQgYnkgdGhlIHNjYW4gYWZ0ZXIgYXBwbHlpbmcgdGhlCioqKioqKioq KioqKioqKgoqKiogNjQ1LDY0NyAqKioqIGVzdGltYXRlX2Nvc3RzKFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICpiYXNlcmVsLAotLS0gNjg3LDEwOTIgLS0tLQogIAlydW5fY29z dCArPSBjcHVfcGVyX3R1cGxlICogbnR1cGxlczsKICAJKnRvdGFsX2Nvc3QgPSAqc3RhcnR1 cF9jb3N0ICsgcnVuX2Nvc3Q7CiAgfQorIAorIC8qCisgICogZmlsZV9mZHdfZG9fYW5hbHl6 ZV9yZWwoKSAtLSBhbmFseXplIG9uZSBmb3JlaWduIHRhYmxlCisgICovCisgc3RhdGljIHZv aWQKKyBmaWxlX2Zkd19kb19hbmFseXplX3JlbChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0 bXQgKnZhY3N0bXQsIGludCBlbGV2ZWwpCisgeworIAlpbnQJCQlpLAorIAkJCQlhdHRyX2Nu dCwKKyAJCQkJdGNudCwKKyAJCQkJbnVtcm93cyA9IDAsCisgCQkJCXRhcmdyb3dzOworIAlk b3VibGUJCXRvdGFscm93cyA9IDA7CisgCUJsb2NrTnVtYmVyCXRvdGFscGFnZXMgPSAwOwor IAlIZWFwVHVwbGUgICpyb3dzOworIAlWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHM7Cisg CU1lbW9yeUNvbnRleHQgYW5sX2NvbnRleHQ7CisgCU1lbW9yeUNvbnRleHQgY2FsbGVyX2Nv bnRleHQ7CisgCisgCWVyZXBvcnQoZWxldmVsLAorIAkJCShlcnJtc2coImFuYWx5emluZyBc IiVzLiVzXCIiLAorIAkJCQkJZ2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNw YWNlKG9uZXJlbCkpLAorIAkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkp KTsKKyAKKyAJLyoKKyAJICogU2V0IHVwIGEgd29ya2luZyBjb250ZXh0IHNvIHRoYXQgd2Ug Y2FuIGVhc2lseSBmcmVlIHdoYXRldmVyIGp1bmsgZ2V0cworIAkgKiBjcmVhdGVkLgorIAkg Ki8KKyAJYW5sX2NvbnRleHQgPSBBbGxvY1NldENvbnRleHRDcmVhdGUoQ3VycmVudE1lbW9y eUNvbnRleHQsCisgCQkJCQkJCQkJCSJBbmFseXplIiwKKyAJCQkJCQkJCQkJQUxMT0NTRVRf REVGQVVMVF9NSU5TSVpFLAorIAkJCQkJCQkJCQlBTExPQ1NFVF9ERUZBVUxUX0lOSVRTSVpF LAorIAkJCQkJCQkJCQlBTExPQ1NFVF9ERUZBVUxUX01BWFNJWkUpOworIAljYWxsZXJfY29u dGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhhbmxfY29udGV4dCk7CisgCisgCS8qCisg CSAqIERldGVybWluZSB3aGljaCBjb2x1bW5zIHRvIGFuYWx5emUKKyAJICoKKyAJICogTm90 ZSB0aGF0IHN5c3RlbSBhdHRyaWJ1dGVzIGFyZSBuZXZlciBhbmFseXplZC4KKyAJICovCisg CWlmICh2YWNzdG10LT52YV9jb2xzICE9IE5JTCkKKyAJeworIAkJTGlzdENlbGwJICAgKmxl OworIAorIAkJdmFjYXR0cnN0YXRzID0gKFZhY0F0dHJTdGF0cyAqKikgcGFsbG9jKGxpc3Rf bGVuZ3RoKHZhY3N0bXQtPnZhX2NvbHMpICoKKyAJCQkJCQkJCQkJCQlzaXplb2YoVmFjQXR0 clN0YXRzICopKTsKKyAJCXRjbnQgPSAwOworIAkJZm9yZWFjaChsZSwgdmFjc3RtdC0+dmFf Y29scykKKyAJCXsKKyAJCQljaGFyCSAgICpjb2wgPSBzdHJWYWwobGZpcnN0KGxlKSk7Cisg CisgCQkJaSA9IGF0dG5hbWVBdHROdW0ob25lcmVsLCBjb2wsIGZhbHNlKTsKKyAJCQlpZiAo aSA9PSBJbnZhbGlkQXR0ck51bWJlcikKKyAJCQkJZXJlcG9ydChFUlJPUiwKKyAJCQkJCQko ZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9DT0xVTU4pLAorIAkJCQkJCSBlcnJtc2coImNv bHVtbiBcIiVzXCIgb2YgcmVsYXRpb24gXCIlc1wiIGRvZXMgbm90IGV4aXN0IiwKKyAJCQkJ CQkJCWNvbCwgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsKKyAJCQl2YWNh dHRyc3RhdHNbdGNudF0gPSBleGFtaW5lX2F0dHJpYnV0ZShvbmVyZWwsIGksIE5VTEwsIGFu bF9jb250ZXh0KTsKKyAJCQlpZiAodmFjYXR0cnN0YXRzW3RjbnRdICE9IE5VTEwpCisgCQkJ CXRjbnQrKzsKKyAJCX0KKyAJCWF0dHJfY250ID0gdGNudDsKKyAJfQorIAllbHNlCisgCXsK KyAJCWF0dHJfY250ID0gb25lcmVsLT5yZF9hdHQtPm5hdHRzOworIAkJdmFjYXR0cnN0YXRz ID0gKFZhY0F0dHJTdGF0cyAqKikgcGFsbG9jKGF0dHJfY250ICogc2l6ZW9mKFZhY0F0dHJT dGF0cyAqKSk7CisgCQl0Y250ID0gMDsKKyAJCWZvciAoaSA9IDE7IGkgPD0gYXR0cl9jbnQ7 IGkrKykKKyAJCXsKKyAJCQl2YWNhdHRyc3RhdHNbdGNudF0gPSBleGFtaW5lX2F0dHJpYnV0 ZShvbmVyZWwsIGksIE5VTEwsIGFubF9jb250ZXh0KTsKKyAJCQlpZiAodmFjYXR0cnN0YXRz W3RjbnRdICE9IE5VTEwpCisgCQkJCXRjbnQrKzsKKyAJCX0KKyAJCWF0dHJfY250ID0gdGNu dDsKKyAJfQorIAorIAkvKgorIAkgKiBRdWl0IGlmIG5vIGFuYWx5emFibGUgY29sdW1ucy4K KyAJICovCisgCWlmIChhdHRyX2NudCA8PSAwKQorIAkJZ290byBjbGVhbnVwOworIAorIAkv KgorIAkgKiBEZXRlcm1pbmUgaG93IG1hbnkgcm93cyB3ZSBuZWVkIHRvIHNhbXBsZSwgdXNp bmcgdGhlIHdvcnN0IGNhc2UgZnJvbQorIAkgKiBhbGwgYW5hbHl6YWJsZSBjb2x1bW5zLglX ZSB1c2UgYSBsb3dlciBib3VuZCBvZiAxMDAgcm93cyB0byBhdm9pZAorIAkgKiBwb3NzaWJs ZSBvdmVyZmxvdyBpbiBWaXR0ZXIncyBhbGdvcml0aG0uCisgCSAqLworIAl0YXJncm93cyA9 IDEwMDsKKyAJZm9yIChpID0gMDsgaSA8IGF0dHJfY250OyBpKyspCisgCXsKKyAJCWlmICh0 YXJncm93cyA8IHZhY2F0dHJzdGF0c1tpXS0+bWlucm93cykKKyAJCQl0YXJncm93cyA9IHZh Y2F0dHJzdGF0c1tpXS0+bWlucm93czsKKyAJfQorIAorIAkvKgorIAkgKiBBY3F1aXJlIHRo ZSBzYW1wbGUgcm93cworIAkgKi8KKyAJcm93cyA9IChIZWFwVHVwbGUgKikgcGFsbG9jKHRh cmdyb3dzICogc2l6ZW9mKEhlYXBUdXBsZSkpOworIAludW1yb3dzID0gZmlsZV9mZHdfYWNx dWlyZV9zYW1wbGVfcm93cyhvbmVyZWwsIGVsZXZlbCwgcm93cywgdGFyZ3Jvd3MsICZ0b3Rh bHBhZ2VzLCAmdG90YWxyb3dzKTsKKyAKKyAJLyoKKyAJICogQ29tcHV0ZSB0aGUgc3RhdGlz dGljcy4JVGVtcG9yYXJ5IHJlc3VsdHMgZHVyaW5nIHRoZSBjYWxjdWxhdGlvbnMgZm9yCisg CSAqIGVhY2ggY29sdW1uIGFyZSBzdG9yZWQgaW4gYSBjaGlsZCBjb250ZXh0LiAgVGhlIGNh bGMgcm91dGluZXMgYXJlCisgCSAqIHJlc3BvbnNpYmxlIHRvIG1ha2Ugc3VyZSB0aGF0IHdo YXRldmVyIHRoZXkgc3RvcmUgaW50byB0aGUgVmFjQXR0clN0YXRzCisgCSAqIHN0cnVjdHVy ZSBpcyBhbGxvY2F0ZWQgaW4gYW5sX2NvbnRleHQuCisgCSAqLworIAlpZiAobnVtcm93cyA+ IDApCisgCXsKKyAJCU1lbW9yeUNvbnRleHQgY29sX2NvbnRleHQsIG9sZF9jb250ZXh0Owor IAorIAkJY29sX2NvbnRleHQgPSBBbGxvY1NldENvbnRleHRDcmVhdGUoYW5sX2NvbnRleHQs CisgCQkJCQkJCQkJCQkiQW5hbHl6ZSBDb2x1bW4iLAorIAkJCQkJCQkJCQkJQUxMT0NTRVRf REVGQVVMVF9NSU5TSVpFLAorIAkJCQkJCQkJCQkJQUxMT0NTRVRfREVGQVVMVF9JTklUU0la RSwKKyAJCQkJCQkJCQkJCUFMTE9DU0VUX0RFRkFVTFRfTUFYU0laRSk7CisgCQlvbGRfY29u dGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhjb2xfY29udGV4dCk7CisgCisgCQlmb3Ig KGkgPSAwOyBpIDwgYXR0cl9jbnQ7IGkrKykKKyAJCXsKKyAJCQlWYWNBdHRyU3RhdHMJICAg KnN0YXRzID0gdmFjYXR0cnN0YXRzW2ldOworIAkJCUF0dHJpYnV0ZU9wdHMJICAgKmFvcHQg PSBnZXRfYXR0cmlidXRlX29wdGlvbnMob25lcmVsLT5yZF9pZCwgc3RhdHMtPmF0dHItPmF0 dG51bSk7CisgCisgCQkJc3RhdHMtPnJvd3MgPSByb3dzOworIAkJCXN0YXRzLT50dXBEZXNj ID0gb25lcmVsLT5yZF9hdHQ7CisgCQkJKCpzdGF0cy0+Y29tcHV0ZV9zdGF0cykgKHN0YXRz LAorIAkJCQkJCQkJCSBzdGRfZmV0Y2hfZnVuYywKKyAJCQkJCQkJCQkgbnVtcm93cywKKyAJ CQkJCQkJCQkgdG90YWxyb3dzKTsKKyAKKyAJCQkvKgorIAkJCSAqIElmIHRoZSBhcHByb3By aWF0ZSBmbGF2b3Igb2YgdGhlIG5fZGlzdGluY3Qgb3B0aW9uIGlzCisgCQkJICogc3BlY2lm aWVkLCBvdmVycmlkZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgorIAkJCSAqLwor IAkJCWlmIChhb3B0ICE9IE5VTEwpCisgCQkJeworIAkJCQlmbG9hdDgJCW5fZGlzdGluY3Qg PSBhb3B0LT5uX2Rpc3RpbmN0OworIAorIAkJCQlpZiAobl9kaXN0aW5jdCAhPSAwLjApCisg CQkJCQlzdGF0cy0+c3RhZGlzdGluY3QgPSBuX2Rpc3RpbmN0OworIAkJCX0KKyAKKyAJCQlN ZW1vcnlDb250ZXh0UmVzZXRBbmREZWxldGVDaGlsZHJlbihjb2xfY29udGV4dCk7CisgCQl9 CisgCisgCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkX2NvbnRleHQpOworIAkJTWVtb3J5 Q29udGV4dERlbGV0ZShjb2xfY29udGV4dCk7CisgCisgCQkvKgorIAkJICogRW1pdCB0aGUg Y29tcGxldGVkIHN0YXRzIHJvd3MgaW50byBwZ19zdGF0aXN0aWMsIHJlcGxhY2luZyBhbnkK KyAJCSAqIHByZXZpb3VzIHN0YXRpc3RpY3MgZm9yIHRoZSB0YXJnZXQgY29sdW1ucy4JKElm IHRoZXJlIGFyZSBzdGF0cyBpbgorIAkJICogcGdfc3RhdGlzdGljIGZvciBjb2x1bW5zIHdl IGRpZG4ndCBwcm9jZXNzLCB3ZSBsZWF2ZSB0aGVtIGFsb25lLikKKyAJCSAqLworIAkJdXBk YXRlX2F0dHN0YXRzKG9uZXJlbC0+cmRfaWQsIGZhbHNlLCBhdHRyX2NudCwgdmFjYXR0cnN0 YXRzKTsKKyAJfQorIAorIAkvKgorIAkgKiBVcGRhdGUgcGFnZXMvdHVwbGVzIHN0YXRzIGlu IHBnX2NsYXNzLgorIAkgKi8KKyAJdmFjX3VwZGF0ZV9yZWxzdGF0cyhvbmVyZWwsIHRvdGFs cGFnZXMsIHRvdGFscm93cywgZmFsc2UsIEludmFsaWRUcmFuc2FjdGlvbklkKTsKKyAKKyAJ LyoKKyAJICogUmVwb3J0IEFOQUxZWkUgdG8gdGhlIHN0YXRzIGNvbGxlY3RvciwgdG9vOyBs aWtld2lzZSwgdGVsbCBpdCB0byBhZG9wdAorIAkgKiB0aGVzZSBudW1iZXJzIG9ubHkgaWYg d2UncmUgbm90IGluc2lkZSBhIFZBQ1VVTSB0aGF0IGdvdCBhIGJldHRlcgorIAkgKiBudW1i ZXIuCUhvd2V2ZXIsIGEgY2FsbCB3aXRoIGluaCA9IHRydWUgc2hvdWxkbid0IHJlc2V0IHRo ZSBzdGF0cy4KKyAJICovCisgCXBnc3RhdF9yZXBvcnRfYW5hbHl6ZShvbmVyZWwsIHRvdGFs cm93cywgMCk7CisgCisgCS8qIFdlIHNraXAgdG8gaGVyZSBpZiB0aGVyZSB3ZXJlIG5vIGFu YWx5emFibGUgY29sdW1ucyAqLworIGNsZWFudXA6CisgCisgCS8qIFJlc3RvcmUgY3VycmVu dCBjb250ZXh0IGFuZCByZWxlYXNlIG1lbW9yeSAqLworIAlNZW1vcnlDb250ZXh0U3dpdGNo VG8oY2FsbGVyX2NvbnRleHQpOworIAlNZW1vcnlDb250ZXh0RGVsZXRlKGFubF9jb250ZXh0 KTsKKyAJYW5sX2NvbnRleHQgPSBOVUxMOworIH0KKyAKKyAvKgorICAqIGZpbGVfZmR3X2Fj cXVpcmVfc2FtcGxlX3Jvd3MgLS0gYWNxdWlyZSBhIHJhbmRvbSBzYW1wbGUgb2Ygcm93cyBm cm9tIHRoZSB0YWJsZQorICAqCisgICogU2VsZWN0ZWQgcm93cyBhcmUgcmV0dXJuZWQgaW4g dGhlIGNhbGxlci1hbGxvY2F0ZWQgYXJyYXkgcm93c1tdLCB3aGljaAorICAqIG11c3QgaGF2 ZSBhdCBsZWFzdCB0YXJncm93cyBlbnRyaWVzLgorICAqIFRoZSBhY3R1YWwgbnVtYmVyIG9m IHJvd3Mgc2VsZWN0ZWQgaXMgcmV0dXJuZWQgYXMgdGhlIGZ1bmN0aW9uIHJlc3VsdC4KKyAg KiBXZSBhbHNvIGNvdW50IHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUsIGFuZCBy ZXR1cm4gaXQgaW50byAqdG90YWxyb3dzLgorICAqCisgICogVGhlIHJldHVybmVkIGxpc3Qg b2YgdHVwbGVzIGlzIGluIG9yZGVyIGJ5IHBoeXNpY2FsIHBvc2l0aW9uIGluIHRoZSB0YWJs ZS4KKyAgKiAoV2Ugd2lsbCByZWx5IG9uIHRoaXMgbGF0ZXIgdG8gZGVyaXZlIGNvcnJlbGF0 aW9uIGVzdGltYXRlcy4pCisgICovCisgc3RhdGljIGludAorIGZpbGVfZmR3X2FjcXVpcmVf c2FtcGxlX3Jvd3MoUmVsYXRpb24gb25lcmVsLCBpbnQgZWxldmVsLCBIZWFwVHVwbGUgKnJv d3MsIGludCB0YXJncm93cywgQmxvY2tOdW1iZXIgKnRvdGFscGFnZXMsIGRvdWJsZSAqdG90 YWxyb3dzKQorIHsKKyAJaW50CQkJbnVtcm93cyA9IDA7CisgCWRvdWJsZQkJc2FtcGxlcm93 cyA9IDA7ICAvKiB0b3RhbCAjIHJvd3MgY29sbGVjdGVkICovCisgCWRvdWJsZQkJcm93c3Rv c2tpcCA9IC0xOyAvKiAtMSBtZWFucyBub3Qgc2V0IHlldCAqLworIAlkb3VibGUJCXJzdGF0 ZTsKKyAJSGVhcFR1cGxlCXR1cGxlOworIAlUdXBsZURlc2MJdHVwRGVzYzsKKyAJVHVwbGVD b25zdHIgKmNvbnN0cjsKKyAJaW50CQkJbmF0dHM7CisgCWludAkJCWF0dHJDaGs7CisgCURh dHVtCSAgICp2YWx1ZXM7CisgCWJvb2wJICAgKm51bGxzOworIAlib29sCQlmb3VuZDsKKyAJ Ym9vbAkJc2FtcGxlX2l0ID0gZmFsc2U7CisgCUJsb2NrTnVtYmVyCWJsa251bTsKKyAJT2Zm c2V0TnVtYmVyIG9mZm51bTsKKyAJY2hhcgkgICAqZmlsZW5hbWU7CisgCXN0cnVjdCBzdGF0 CXN0YXRfYnVmOworIAlMaXN0CSAgICpvcHRpb25zOworIAlMaXN0Q2VsbCAgICpsYzsKKyAJ TGlzdAkgICAqZm9yY2Vfbm90bnVsbCA9IE5JTDsKKyAJYm9vbAkgICAqZm9yY2Vfbm90bnVs bF9mbGFnczsKKyAJQ29weVN0YXRlCWNzdGF0ZTsKKyAJRXJyb3JDb250ZXh0Q2FsbGJhY2sg ZXJyY29udGV4dDsKKyAKKyAJQXNzZXJ0KG9uZXJlbCk7CisgCUFzc2VydCh0YXJncm93cyA+ IDApOworIAorIAl0dXBEZXNjID0gUmVsYXRpb25HZXREZXNjcihvbmVyZWwpOworIAljb25z dHIgPSB0dXBEZXNjLT5jb25zdHI7CisgCW5hdHRzID0gdHVwRGVzYy0+bmF0dHM7CisgCXZh bHVlcyA9IChEYXR1bSAqKSBwYWxsb2ModHVwRGVzYy0+bmF0dHMgKiBzaXplb2YoRGF0dW0p KTsKKyAJbnVsbHMgPSAoYm9vbCAqKSBwYWxsb2ModHVwRGVzYy0+bmF0dHMgKiBzaXplb2Yo Ym9vbCkpOworIAlmb3JjZV9ub3RudWxsX2ZsYWdzID0gKGJvb2wgKikgcGFsbG9jMChuYXR0 cyAqIHNpemVvZihib29sKSk7CisgCisgCS8qIEZldGNoIG9wdGlvbnMgb2YgZm9yZWlnbiB0 YWJsZSAqLworIAlmaWxlR2V0T3B0aW9ucyhSZWxhdGlvbkdldFJlbGlkKG9uZXJlbCksICZm aWxlbmFtZSwgJm9wdGlvbnMpOworIAorIAlmb3JlYWNoKGxjLCBvcHRpb25zKQorIAl7Cisg CQlEZWZFbGVtICAgICpkZWYgPSAoRGVmRWxlbSAqKSBsZmlyc3QobGMpOworIAorIAkJaWYg KHN0cmNtcChkZWYtPmRlZm5hbWUsICJmb3JjZV9ub3RfbnVsbCIpID09IDApCisgCQl7Cisg CQkJZm9yY2Vfbm90bnVsbCA9IChMaXN0ICopIGRlZi0+YXJnOworIAkJCWJyZWFrOworIAkJ fQorIAl9CisgCisgCWlmIChmb3JjZV9ub3RudWxsKQorIAl7CisgCQlMaXN0CSAgICphdHRu dW1zOworIAkJTGlzdENlbGwgICAqY3VyOworIAorIAkJYXR0bnVtcyA9IENvcHlHZXRBdHRu dW1zKHR1cERlc2MsIG9uZXJlbCwgZm9yY2Vfbm90bnVsbCk7CisgCisgCQlmb3JlYWNoKGN1 ciwgYXR0bnVtcykKKyAJCXsKKyAJCQlpbnQJCQlhdHRudW0gPSBsZmlyc3RfaW50KGN1cik7 CisgCisgCQkJZm9yY2Vfbm90bnVsbF9mbGFnc1thdHRudW0gLSAxXSA9IHRydWU7CisgCQl9 CisgCX0KKyAKKyAJLyoKKyAJICogR2V0IHNpemUgb2YgdGhlIGZpbGUuCisgCSAqLworIAlp ZiAoc3RhdChmaWxlbmFtZSwgJnN0YXRfYnVmKSA8IDApCisgCQllcmVwb3J0KEVSUk9SLAor IAkJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKyAJCQkJIGVycm1zZygiY291bGQg bm90IHN0YXQgZmlsZSBcIiVzXCI6ICVtIiwKKyAJCQkJCQlmaWxlbmFtZSkpKTsKKyAKKyAJ LyoKKyAJICogQ29udmVydCBzaXplIHRvIHBhZ2VzIGZvciB1c2UgaW4gSS9PIGNvc3QgZXN0 aW1hdGUuCisgCSAqLworIAkqdG90YWxwYWdlcyA9IChzdGF0X2J1Zi5zdF9zaXplICsgKEJM Q0tTWiAtIDEpKSAvIEJMQ0tTWjsKKyAJaWYgKCp0b3RhbHBhZ2VzIDwgMSkKKyAJCSp0b3Rh bHBhZ2VzID0gMTsKKyAKKyAJLyoKKyAJICogQ3JlYXRlIENvcHlTdGF0ZSBmcm9tIEZEVyBv cHRpb25zLiAgV2UgYWx3YXlzIGFjcXVpcmUgYWxsIGNvbHVtbnMsIHNvCisgCSAqIGFzIHRv IG1hdGNoIHRoZSBleHBlY3RlZCBTY2FuVHVwbGVTbG90IHNpZ25hdHVyZS4KKyAJICovCisg CWNzdGF0ZSA9IEJlZ2luQ29weUZyb20ob25lcmVsLCBmaWxlbmFtZSwgTklMLCBvcHRpb25z KTsKKyAKKyAJLyogUHJlcGFyZSBmb3Igc2FtcGxpbmcgcm93cyAqLworIAlyc3RhdGUgPSBp bml0X3NlbGVjdGlvbl9zdGF0ZSh0YXJncm93cyk7CisgCisgCWZvciAoOzspCisgCXsKKyAJ CXNhbXBsZV9pdCA9IHRydWU7CisgCisgCQkvKiBTZXQgdXAgY2FsbGJhY2sgdG8gaWRlbnRp ZnkgZXJyb3IgbGluZSBudW1iZXIuICovCisgCQllcnJjb250ZXh0LmNhbGxiYWNrID0gQ29w eUZyb21FcnJvckNhbGxiYWNrOworIAkJZXJyY29udGV4dC5hcmcgPSAodm9pZCAqKSBjc3Rh dGU7CisgCQllcnJjb250ZXh0LnByZXZpb3VzID0gZXJyb3JfY29udGV4dF9zdGFjazsKKyAJ CWVycm9yX2NvbnRleHRfc3RhY2sgPSAmZXJyY29udGV4dDsKKyAKKyAJCWZvdW5kID0gTmV4 dENvcHlGcm9tKGNzdGF0ZSwgTlVMTCwgdmFsdWVzLCBudWxscywgTlVMTCk7CisgCisgCQkv KiBSZW1vdmUgZXJyb3IgY2FsbGJhY2suICovCisgCQllcnJvcl9jb250ZXh0X3N0YWNrID0g ZXJyY29udGV4dC5wcmV2aW91czsKKyAKKyAJCWlmICghZm91bmQpCisgCQkJYnJlYWs7Cisg CisgCQl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZSh0dXBEZXNjLCB2YWx1ZXMsIG51bGxzKTsK KyAKKyAJCWlmIChjb25zdHIgJiYgY29uc3RyLT5oYXNfbm90X251bGwpCisgCQl7CisgCQkJ Zm9yIChhdHRyQ2hrID0gMTsgYXR0ckNoayA8PSBuYXR0czsgYXR0ckNoaysrKQorIAkJCXsK KyAJCQkJaWYgKG9uZXJlbC0+cmRfYXR0LT5hdHRyc1thdHRyQ2hrIC0gMV0tPmF0dG5vdG51 bGwgJiYKKyAJCQkJCSFmb3JjZV9ub3RudWxsX2ZsYWdzW2F0dHJDaGsgLSAxXSAmJgorIAkJ CQkJaGVhcF9hdHRpc251bGwodHVwbGUsIGF0dHJDaGspKQorIAkJCQl7CisgCQkJCQlzYW1w bGVfaXQgPSBmYWxzZTsKKyAJCQkJCWJyZWFrOworIAkJCQl9CisgCQkJfQorIAkJfQorIAor IAkJaWYgKCFzYW1wbGVfaXQpCisgCQl7CisgCQkJaGVhcF9mcmVldHVwbGUodHVwbGUpOwor IAkJCWNvbnRpbnVlOworIAkJfQorIAorIAkJLyoKKyAJCSAqIFRoZSBmaXJzdCB0YXJncm93 cyBzYW1wbGUgcm93cyBhcmUgc2ltcGx5IGNvcGllZCBpbnRvIHRoZQorIAkJICogcmVzZXJ2 b2lyLiBUaGVuIHdlIHN0YXJ0IHJlcGxhY2luZyB0dXBsZXMgaW4gdGhlIHNhbXBsZQorIAkJ ICogdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgcmVsYXRpb24uCVRoaXMgYWxnb3Jp dGhtIGlzCisgCQkgKiBmcm9tIEplZmYgVml0dGVyJ3MgcGFwZXIgKHNlZSBmdWxsIGNpdGF0 aW9uIGJlbG93KS4gSXQKKyAJCSAqIHdvcmtzIGJ5IHJlcGVhdGVkbHkgY29tcHV0aW5nIHRo ZSBudW1iZXIgb2YgdHVwbGVzIHRvIHNraXAKKyAJCSAqIGJlZm9yZSBzZWxlY3RpbmcgYSB0 dXBsZSwgd2hpY2ggcmVwbGFjZXMgYSByYW5kb21seSBjaG9zZW4KKyAJCSAqIGVsZW1lbnQg b2YgdGhlIHJlc2Vydm9pciAoY3VycmVudCBzZXQgb2YgdHVwbGVzKS4gIEF0IGFsbAorIAkJ ICogdGltZXMgdGhlIHJlc2Vydm9pciBpcyBhIHRydWUgcmFuZG9tIHNhbXBsZSBvZiB0aGUg dHVwbGVzCisgCQkgKiB3ZSd2ZSBwYXNzZWQgb3ZlciBzbyBmYXIsIHNvIHdoZW4gd2UgZmFs bCBvZmYgdGhlIGVuZCBvZgorIAkJICogdGhlIHJlbGF0aW9uIHdlJ3JlIGRvbmUuCisgCQkg Ki8KKyAJCWlmIChudW1yb3dzIDwgdGFyZ3Jvd3MpCisgCQl7CisgCQkJYmxrbnVtID0gKEJs b2NrTnVtYmVyKSBzYW1wbGVyb3dzIC8gTWF4T2Zmc2V0TnVtYmVyOworIAkJCW9mZm51bSA9 IChPZmZzZXROdW1iZXIpIHNhbXBsZXJvd3MgJSBNYXhPZmZzZXROdW1iZXIgKyAxOworIAkJ CUl0ZW1Qb2ludGVyU2V0KCZ0dXBsZS0+dF9zZWxmLCBibGtudW0sIG9mZm51bSk7CisgCQkJ cm93c1tudW1yb3dzKytdID0gaGVhcF9jb3B5dHVwbGUodHVwbGUpOworIAkJfQorIAkJZWxz ZQorIAkJeworIAkJCS8qCisgCQkJICogdCBpbiBWaXR0ZXIncyBwYXBlciBpcyB0aGUgbnVt YmVyIG9mIHJlY29yZHMgYWxyZWFkeQorIAkJCSAqIHByb2Nlc3NlZC4gIElmIHdlIG5lZWQg dG8gY29tcHV0ZSBhIG5ldyBTIHZhbHVlLCB3ZQorIAkJCSAqIG11c3QgdXNlIHRoZSBub3Qt eWV0LWluY3JlbWVudGVkIHZhbHVlIG9mIHNhbXBsZXJvd3MgYXMKKyAJCQkgKiB0LgorIAkJ CSAqLworIAkJCWlmIChyb3dzdG9za2lwIDwgMCkKKyAJCQkJcm93c3Rvc2tpcCA9IGdldF9u ZXh0X1Moc2FtcGxlcm93cywgdGFyZ3Jvd3MsICZyc3RhdGUpOworIAorIAkJCWlmIChyb3dz dG9za2lwIDw9IDApCisgCQkJeworIAkJCQkvKgorIAkJCQkgKiBGb3VuZCBhIHN1aXRhYmxl IHR1cGxlLCBzbyBzYXZlIGl0LCByZXBsYWNpbmcgb25lCisgCQkJCSAqIG9sZCB0dXBsZSBh dCByYW5kb20KKyAJCQkJICovCisgCQkJCWludCBrID0gKGludCkgKHRhcmdyb3dzICogcmFu ZG9tX2ZyYWN0KCkpOworIAorIAkJCQlBc3NlcnQoayA+PSAwICYmIGsgPCB0YXJncm93cyk7 CisgCQkJCWhlYXBfZnJlZXR1cGxlKHJvd3Nba10pOworIAorIAkJCQlibGtudW0gPSAoQmxv Y2tOdW1iZXIpIHNhbXBsZXJvd3MgLyBNYXhPZmZzZXROdW1iZXI7CisgCQkJCW9mZm51bSA9 IChPZmZzZXROdW1iZXIpIHNhbXBsZXJvd3MgJSBNYXhPZmZzZXROdW1iZXIgKyAxOworIAkJ CQlJdGVtUG9pbnRlclNldCgmdHVwbGUtPnRfc2VsZiwgYmxrbnVtLCBvZmZudW0pOworIAkJ CQlyb3dzW2tdID0gaGVhcF9jb3B5dHVwbGUodHVwbGUpOworIAkJCX0KKyAKKyAJCQlyb3dz dG9za2lwIC09IDE7CisgCQl9CisgCisgCQlzYW1wbGVyb3dzICs9IDE7CisgCQloZWFwX2Zy ZWV0dXBsZSh0dXBsZSk7CisgCX0KKyAKKyAJLyoKKyAJICogSWYgd2UgZGlkbid0IGZpbmQg YXMgbWFueSB0dXBsZXMgYXMgd2Ugd2FudGVkIHRoZW4gd2UncmUgZG9uZS4gTm8gc29ydAor IAkgKiBpcyBuZWVkZWQsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBpbiBvcmRlci4KKyAJICoK KyAJICogT3RoZXJ3aXNlIHdlIG5lZWQgdG8gc29ydCB0aGUgY29sbGVjdGVkIHR1cGxlcyBi eSBwb3NpdGlvbgorIAkgKiAoaXRlbXBvaW50ZXIpLiBJdCdzIG5vdCB3b3J0aCB3b3JyeWlu ZyBhYm91dCBjb3JuZXIgY2FzZXMgd2hlcmUgdGhlCisgCSAqIHR1cGxlcyBhcmUgYWxyZWFk eSBzb3J0ZWQuCisgCSAqLworIAlpZiAobnVtcm93cyA9PSB0YXJncm93cykKKyAJCXFzb3J0 KCh2b2lkICopIHJvd3MsIG51bXJvd3MsIHNpemVvZihIZWFwVHVwbGUpLCBjb21wYXJlX3Jv d3MpOworIAorIAkqdG90YWxyb3dzID0gc2FtcGxlcm93czsKKyAKKyAJRW5kQ29weUZyb20o Y3N0YXRlKTsKKyAKKyAJcGZyZWUodmFsdWVzKTsKKyAJcGZyZWUobnVsbHMpOworIAlwZnJl ZShmb3JjZV9ub3RudWxsX2ZsYWdzKTsKKyAKKyAJLyoKKyAJICogRW1pdCBzb21lIGludGVy ZXN0aW5nIHJlbGF0aW9uIGluZm8KKyAJICovCisgCWVyZXBvcnQoZWxldmVsLAorIAkJCShl cnJtc2coIlwiJXNcIjogc2Nhbm5lZCwgIgorIAkJCQkJImNvbnRhaW5pbmcgJWQgcm93czsg IgorIAkJCQkJIiVkIHJvd3MgaW4gc2FtcGxlIiwKKyAJCQkJCVJlbGF0aW9uR2V0UmVsYXRp b25OYW1lKG9uZXJlbCksIChpbnQpIHNhbXBsZXJvd3MsIG51bXJvd3MpKSk7CisgCisgCXJl dHVybiBudW1yb3dzOworIH0KKioqIGEvY29udHJpYi9maWxlX2Zkdy9pbnB1dC9maWxlX2Zk dy5zb3VyY2UKLS0tIGIvY29udHJpYi9maWxlX2Zkdy9pbnB1dC9maWxlX2Zkdy5zb3VyY2UK KioqKioqKioqKioqKioqCioqKiAxMTEsMTE2ICoqKiogRVhFQ1VURSBzdCgxMDApOwotLS0g MTExLDEyMSAtLS0tCiAgRVhFQ1VURSBzdCgxMDApOwogIERFQUxMT0NBVEUgc3Q7CiAgCisg LS0gc3RhdGlzdGljcyBjb2xsZWN0aW9uIHRlc3RzCisgQU5BTFlaRSBhZ2dfY3N2OworIFNF TEVDVCByZWxwYWdlcywgcmVsdHVwbGVzIEZST00gcGdfY2xhc3MgV0hFUkUgcmVsbmFtZSA9 ICdhZ2dfY3N2JzsKKyBTRUxFQ1QgKiBGUk9NIHBnX3N0YXRzIFdIRVJFIHRhYmxlbmFtZSA9 ICdhZ2dfY3N2JzsKKyAKICAtLSB0YWJsZW9pZAogIFNFTEVDVCB0YWJsZW9pZDo6cmVnY2xh c3MsIGIgRlJPTSBhZ2dfY3N2OwogIAoqKiogYS9jb250cmliL2ZpbGVfZmR3L291dHB1dC9m aWxlX2Zkdy5zb3VyY2UKLS0tIGIvY29udHJpYi9maWxlX2Zkdy9vdXRwdXQvZmlsZV9mZHcu c291cmNlCioqKioqKioqKioqKioqKgoqKiogMTc0LDE3OSAqKioqIEVYRUNVVEUgc3QoMTAw KTsKLS0tIDE3NCwxOTQgLS0tLQogICgxIHJvdykKICAKICBERUFMTE9DQVRFIHN0OworIC0t IHN0YXRpc3RpY3MgY29sbGVjdGlvbiB0ZXN0cworIEFOQUxZWkUgYWdnX2NzdjsKKyBTRUxF Q1QgcmVscGFnZXMsIHJlbHR1cGxlcyBGUk9NIHBnX2NsYXNzIFdIRVJFIHJlbG5hbWUgPSAn YWdnX2Nzdic7CisgIHJlbHBhZ2VzIHwgcmVsdHVwbGVzIAorIC0tLS0tLS0tLS0rLS0tLS0t LS0tLS0KKyAgICAgICAgIDEgfCAgICAgICAgIDMKKyAoMSByb3cpCisgCisgU0VMRUNUICog RlJPTSBwZ19zdGF0cyBXSEVSRSB0YWJsZW5hbWUgPSAnYWdnX2Nzdic7CisgIHNjaGVtYW5h bWUgfCB0YWJsZW5hbWUgfCBhdHRuYW1lIHwgaW5oZXJpdGVkIHwgbnVsbF9mcmFjIHwgYXZn X3dpZHRoIHwgbl9kaXN0aW5jdCB8IG1vc3RfY29tbW9uX3ZhbHMgfCBtb3N0X2NvbW1vbl9m cmVxcyB8ICAgIGhpc3RvZ3JhbV9ib3VuZHMgICAgIHwgY29ycmVsYXRpb24gCisgLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSst LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tCisgIHB1 YmxpYyAgICAgfCBhZ2dfY3N2ICAgfCBhICAgICAgIHwgZiAgICAgICAgIHwgICAgICAgICAw IHwgICAgICAgICAyIHwgICAgICAgICAtMSB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAg ICAgICAgICAgICB8IHswLDQyLDEwMH0gICAgICAgICAgICAgIHwgICAgICAgIC0wLjUKKyAg cHVibGljICAgICB8IGFnZ19jc3YgICB8IGIgICAgICAgfCBmICAgICAgICAgfCAgICAgICAg IDAgfCAgICAgICAgIDQgfCAgICAgICAgIC0xIHwgICAgICAgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgICAgIHwgezAuMDk1NjEsOTkuMDk3LDMyNC43OH0gfCAgICAgICAgIDAuNQor ICgyIHJvd3MpCisgCiAgLS0gdGFibGVvaWQKICBTRUxFQ1QgdGFibGVvaWQ6OnJlZ2NsYXNz LCBiIEZST00gYWdnX2NzdjsKICAgdGFibGVvaWQgfCAgICBiICAgIAoqKiogYS9kb2Mvc3Jj L3NnbWwvZmR3aGFuZGxlci5zZ21sCi0tLSBiL2RvYy9zcmMvc2dtbC9mZHdoYW5kbGVyLnNn bWwKKioqKioqKioqKioqKioqCioqKiAyMzMsMjM4ICoqKiogRW5kRm9yZWlnblNjYW4gKEZv cmVpZ25TY2FuU3RhdGUgKm5vZGUpOwotLS0gMjMzLDI1NyAtLS0tCiAgICAgICBmb3IgYWRk aXRpb25hbCBkZXRhaWxzLgogICAgICA8L3BhcmE+CiAgCisgICAgIDxwYXJhPgorIDxwcm9n cmFtbGlzdGluZz4KKyB2b2lkCisgQW5hbHl6ZUZvcmVpZ25UYWJsZSAoUmVsYXRpb24gb25l cmVsLAorICAgICAgICAgICAgICAgICAgICAgIFZhY3V1bVN0bXQgKnZhY3N0bXQsIAorICAg ICAgICAgICAgICAgICAgICAgIGludCBlbGV2ZWwpOworIDwvcHJvZ3JhbWxpc3Rpbmc+Cisg CisgICAgICBDb2xsZWN0IHN0YXRpc3RpY3Mgb24gYSBmb3JlaWduIHRhYmxlIGFuZCBzdG9y ZSB0aGUgcmVzdWx0cyBpbiB0aGUKKyAgICAgIHBnX2NsYXNzIGFuZCBwZ19zdGF0aXN0aWNz IHN5c3RlbSBjYXRhbG9nLgorICAgICAgVGhpcyBpcyBjYWxsZWQgd2hlbiA8Y29tbWFuZD5B TkFMWVpFPC8+IGNvbW1hbmQgaXMgcnVuLgorICAgICA8L3BhcmE+CisgCisgICAgIDxwYXJh PgorICAgICAgVGhlIDxzdHJ1Y3RuYW1lPkZkd1JvdXRpbmU8Lz4gYW5kIDxzdHJ1Y3RuYW1l PkZkd1BsYW48Lz4gc3RydWN0IHR5cGVzCisgICAgICBhcmUgZGVjbGFyZWQgaW4gPGZpbGVu YW1lPnNyYy9pbmNsdWRlL2ZvcmVpZ24vZmR3YXBpLmg8Lz4sIHdoaWNoIHNlZQorICAgICAg Zm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKyAgICAgPC9wYXJhPgorIAogICAgIDwvc2VjdDE+ CiAgCiAgIDwvY2hhcHRlcj4KKioqIGEvZG9jL3NyYy9zZ21sL3JlZi9hbHRlcl9mb3JlaWdu X3RhYmxlLnNnbWwKLS0tIGIvZG9jL3NyYy9zZ21sL3JlZi9hbHRlcl9mb3JlaWduX3RhYmxl LnNnbWwKKioqKioqKioqKioqKioqCioqKiAzNiw0MSAqKioqIEFMVEVSIEZPUkVJR04gVEFC TEUgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPm5hbWU8L3JlcGxhY2VhYmxlPgot LS0gMzYsNDQgLS0tLQogICAgICBEUk9QIFsgQ09MVU1OIF0gWyBJRiBFWElTVFMgXSA8cmVw bGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJsZT4gWyBSRVNU UklDVCB8IENBU0NBREUgXQogICAgICBBTFRFUiBbIENPTFVNTiBdIDxyZXBsYWNlYWJsZSBj bGFzcz0iUEFSQU1FVEVSIj5jb2x1bW48L3JlcGxhY2VhYmxlPiBbIFNFVCBEQVRBIF0gVFlQ RSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+dHlwZTwvcmVwbGFjZWFibGU+CiAg ICAgIEFMVEVSIFsgQ09MVU1OIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNv bHVtbjwvcmVwbGFjZWFibGU+IHsgU0VUIHwgRFJPUCB9IE5PVCBOVUxMCisgICAgIEFMVEVS IFsgQ09MVU1OIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVw bGFjZWFibGU+IFNFVCBTVEFUSVNUSUNTIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVS Ij5pbnRlZ2VyPC9yZXBsYWNlYWJsZT4KKyAgICAgQUxURVIgWyBDT0xVTU4gXSA8cmVwbGFj ZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJsZT4gU0VUICggPHJl cGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmF0dHJpYnV0ZV9vcHRpb248L3JlcGxhY2Vh YmxlPiA9IDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj52YWx1ZTwvcmVwbGFjZWFi bGU+IFssIC4uLiBdICkKKyAgICAgQUxURVIgWyBDT0xVTU4gXSA8cmVwbGFjZWFibGUgY2xh c3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJsZT4gUkVTRVQgKCA8cmVwbGFjZWFi bGUgY2xhc3M9IlBBUkFNRVRFUiI+YXR0cmlidXRlX29wdGlvbjwvcmVwbGFjZWFibGU+IFss IC4uLiBdICkKICAgICAgQUxURVIgWyBDT0xVTU4gXSA8cmVwbGFjZWFibGUgY2xhc3M9IlBB UkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJsZT4gT1BUSU9OUyAoIFsgQUREIHwgU0VUIHwg RFJPUCBdIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5vcHRpb248L3JlcGxhY2Vh YmxlPiBbJzxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj52YWx1ZTwvcmVwbGFjZWFi bGU+J10gWywgLi4uIF0pCiAgICAgIE9XTkVSIFRPIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFS QU1FVEVSIj5uZXdfb3duZXI8L3JlcGxhY2VhYmxlPgogICAgICBPUFRJT05TICggWyBBREQg fCBTRVQgfCBEUk9QIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPm9wdGlvbjwv cmVwbGFjZWFibGU+IFsnPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPnZhbHVlPC9y ZXBsYWNlYWJsZT4nXSBbLCAuLi4gXSkKKioqKioqKioqKioqKioqCioqKiA5NCw5OSAqKioq IEFMVEVSIEZPUkVJR04gVEFCTEUgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPm5h bWU8L3JlcGxhY2VhYmxlPgotLS0gOTcsMTQ2IC0tLS0KICAgICA8L3Zhcmxpc3RlbnRyeT4K ICAKICAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVybT48bGl0ZXJhbD5TRVQgU1RBVElT VElDUzwvbGl0ZXJhbD48L3Rlcm0+CisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgor ICAgICAgIFRoaXMgZm9ybQorICAgICAgIHNldHMgdGhlIHBlci1jb2x1bW4gc3RhdGlzdGlj cy1nYXRoZXJpbmcgdGFyZ2V0IGZvciBzdWJzZXF1ZW50CisgICAgICAgPHhyZWYgbGlua2Vu ZD0ic3FsLWFuYWx5emUiPiBvcGVyYXRpb25zLgorICAgICAgIFRoZSB0YXJnZXQgY2FuIGJl IHNldCBpbiB0aGUgcmFuZ2UgMCB0byAxMDAwMDsgYWx0ZXJuYXRpdmVseSwgc2V0IGl0Cisg ICAgICAgdG8gLTEgdG8gcmV2ZXJ0IHRvIHVzaW5nIHRoZSBzeXN0ZW0gZGVmYXVsdCBzdGF0 aXN0aWNzCisgICAgICAgdGFyZ2V0ICg8eHJlZiBsaW5rZW5kPSJndWMtZGVmYXVsdC1zdGF0 aXN0aWNzLXRhcmdldCI+KS4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAg ICA8L3Zhcmxpc3RlbnRyeT4KKyAKKyAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVybT48 bGl0ZXJhbD5TRVQgKCA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+YXR0cmlidXRl X29wdGlvbjwvcmVwbGFjZWFibGU+ID0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIi PnZhbHVlPC9yZXBsYWNlYWJsZT4gWywgLi4uIF0gKTwvbGl0ZXJhbD48L3Rlcm0+CisgICAg IDx0ZXJtPjxsaXRlcmFsPlJFU0VUICggPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIi PmF0dHJpYnV0ZV9vcHRpb248L3JlcGxhY2VhYmxlPiBbLCAuLi4gXSApPC9saXRlcmFsPjwv dGVybT4KKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgVGhpcyBmb3Jt CisgICAgICAgc2V0cyBvciByZXNldHMgcGVyLWF0dHJpYnV0ZSBvcHRpb25zLiAgQ3VycmVu dGx5LCB0aGUgb25seSBkZWZpbmVkCisgICAgICAgcGVyLWF0dHJpYnV0ZSBvcHRpb25zIGlz IDxsaXRlcmFsPm5fZGlzdGluY3Q8Lz4sIHdoaWNoIG92ZXJyaWRlCisgICAgICAgdGhlIG51 bWJlci1vZi1kaXN0aW5jdC12YWx1ZXMgZXN0aW1hdGVzIG1hZGUgYnkgc3Vic2VxdWVudAor ICAgICAgIDx4cmVmIGxpbmtlbmQ9InNxbC1hbmFseXplIj4gb3BlcmF0aW9ucy4gIDxsaXRl cmFsPm5fZGlzdGluY3Q8Lz4KKyAgICAgICBhZmZlY3RzIHRoZSBzdGF0aXN0aWNzIGZvciB0 aGUgZm9yZWlnbiB0YWJsZSBpdHNlbGYuICBXaGVuIHNldCB0bworICAgICAgIGEgcG9zaXRp dmUgdmFsdWUsIDxjb21tYW5kPkFOQUxZWkU8Lz4gd2lsbCBhc3N1bWUgdGhhdCB0aGUgY29s dW1uCisgICAgICAgY29udGFpbnMgZXhhY3RseSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBk aXN0aW5jdCBub25udWxsIHZhbHVlcy4KKyAgICAgICBXaGVuIHNldCB0byBhIG5lZ2F0aXZl IHZhbHVlLCB3aGljaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAgIHRv IC0xLCA8Y29tbWFuZD5BTkFMWVpFPC8+IHdpbGwgYXNzdW1lIHRoYXQgdGhlIG51bWJlciBv ZiBkaXN0aW5jdAorICAgICAgIG5vbm51bGwgdmFsdWVzIGluIHRoZSBjb2x1bW4gaXMgbGlu ZWFyIGluIHRoZSBzaXplIG9mIHRoZSBmb3JlaWduCisgICAgICAgdGFibGU7IHRoZSBleGFj dCBjb3VudCBpcyB0byBiZSBjb21wdXRlZCBieSBtdWx0aXBseWluZworICAgICAgIHRoZSBl c3RpbWF0ZWQgZm9yZWlnbiB0YWJsZSBzaXplIGJ5IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZgor ICAgICAgIHRoZSBnaXZlbiBudW1iZXIuICBGb3IgZXhhbXBsZSwKKyAgICAgICBhIHZhbHVl IG9mIC0xIGltcGxpZXMgdGhhdCBhbGwgdmFsdWVzIGluIHRoZSBjb2x1bW4gYXJlIGRpc3Rp bmN0LAorICAgICAgIHdoaWxlIGEgdmFsdWUgb2YgLTAuNSBpbXBsaWVzIHRoYXQgZWFjaCB2 YWx1ZSBhcHBlYXJzIHR3aWNlIG9uIHRoZQorICAgICAgIGF2ZXJhZ2UuCisgICAgICAgVGhp cyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlIHNpemUgb2YgdGhlIGZvcmVpZ24gdGFibGUgY2hh bmdlcyBvdmVyCisgICAgICAgdGltZSwgc2luY2UgdGhlIG11bHRpcGxpY2F0aW9uIGJ5IHRo ZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZm9yZWlnbgorICAgICAgIHRhYmxlIGlzIG5vdCBw ZXJmb3JtZWQgdW50aWwgcXVlcnkgcGxhbm5pbmcgdGltZS4gIFNwZWNpZnkgYSB2YWx1ZQor ICAgICAgIG9mIDAgdG8gcmV2ZXJ0IHRvIGVzdGltYXRpbmcgdGhlIG51bWJlciBvZiBkaXN0 aW5jdCB2YWx1ZXMgbm9ybWFsbHkuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+ CisgICAgPC92YXJsaXN0ZW50cnk+CisgCisgICAgPHZhcmxpc3RlbnRyeT4KICAgICAgPHRl cm0+PGxpdGVyYWw+T1dORVI8L2xpdGVyYWw+PC90ZXJtPgogICAgICA8bGlzdGl0ZW0+CiAg ICAgICA8cGFyYT4KKioqIGEvZG9jL3NyYy9zZ21sL3JlZi9hbmFseXplLnNnbWwKLS0tIGIv ZG9jL3NyYy9zZ21sL3JlZi9hbmFseXplLnNnbWwKKioqKioqKioqKioqKioqCioqKiAzOSw0 NyAqKioqIEFOQUxZWkUgWyBWRVJCT1NFIF0gWyA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFN RVRFUiI+dGFibGU8L3JlcGxhY2VhYmxlPiBbICggPHJlCiAgCiAgICA8cGFyYT4KICAgICBX aXRoIG5vIHBhcmFtZXRlciwgPGNvbW1hbmQ+QU5BTFlaRTwvY29tbWFuZD4gZXhhbWluZXMg ZXZlcnkgdGFibGUgaW4gdGhlCiEgICAgY3VycmVudCBkYXRhYmFzZS4gIFdpdGggYSBwYXJh bWV0ZXIsIDxjb21tYW5kPkFOQUxZWkU8L2NvbW1hbmQ+IGV4YW1pbmVzCiEgICAgb25seSB0 aGF0IHRhYmxlLiAgSXQgaXMgZnVydGhlciBwb3NzaWJsZSB0byBnaXZlIGEgbGlzdCBvZiBj b2x1bW4gbmFtZXMsCiEgICAgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBzdGF0aXN0aWNzIGZv ciB0aG9zZSBjb2x1bW5zIGFyZSBjb2xsZWN0ZWQuCiAgICA8L3BhcmE+CiAgIDwvcmVmc2Vj dDE+CiAgCi0tLSAzOSw0OCAtLS0tCiAgCiAgICA8cGFyYT4KICAgICBXaXRoIG5vIHBhcmFt ZXRlciwgPGNvbW1hbmQ+QU5BTFlaRTwvY29tbWFuZD4gZXhhbWluZXMgZXZlcnkgdGFibGUg aW4gdGhlCiEgICAgY3VycmVudCBkYXRhYmFzZSBleGNlcHQgZm9yIGZvcmVpZ24gdGFibGVz LiAgV2l0aCBhIHBhcmFtZXRlciwgPGNvbW1hbmQ+CiEgICAgQU5BTFlaRTwvY29tbWFuZD4g ZXhhbWluZXMgb25seSB0aGF0IHRhYmxlLiAgSXQgaXMgZnVydGhlciBwb3NzaWJsZSB0byAK ISAgICBnaXZlIGEgbGlzdCBvZiBjb2x1bW4gbmFtZXMsIGluIHdoaWNoIGNhc2Ugb25seSB0 aGUgc3RhdGlzdGljcyBmb3IgdGhvc2UKISAgICBjb2x1bW5zIGFyZSBjb2xsZWN0ZWQuCiAg ICA8L3BhcmE+CiAgIDwvcmVmc2VjdDE+CiAgCioqKioqKioqKioqKioqKgoqKiogNjMsNjkg KioqKiBBTkFMWVpFIFsgVkVSQk9TRSBdIFsgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVU RVIiPnRhYmxlPC9yZXBsYWNlYWJsZT4gWyAoIDxyZQogICAgICA8bGlzdGl0ZW0+CiAgICAg ICA8cGFyYT4KICAgICAgICBUaGUgbmFtZSAocG9zc2libHkgc2NoZW1hLXF1YWxpZmllZCkg b2YgYSBzcGVjaWZpYyB0YWJsZSB0bwohICAgICAgIGFuYWx5emUuIERlZmF1bHRzIHRvIGFs bCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UuCiAgICAgICA8L3BhcmE+CiAgICAg IDwvbGlzdGl0ZW0+CiAgICAgPC92YXJsaXN0ZW50cnk+Ci0tLSA2NCw3MSAtLS0tCiAgICAg IDxsaXN0aXRlbT4KICAgICAgIDxwYXJhPgogICAgICAgIFRoZSBuYW1lIChwb3NzaWJseSBz Y2hlbWEtcXVhbGlmaWVkKSBvZiBhIHNwZWNpZmljIHRhYmxlIHRvCiEgICAgICAgYW5hbHl6 ZS4gRGVmYXVsdHMgdG8gYWxsIHRhYmxlcyBpbiB0aGUgY3VycmVudCBkYXRhYmFzZSBleGNl cHQKISAgICAgICBmb3IgZm9yZWlnbiB0YWJsZXMuCiAgICAgICA8L3BhcmE+CiAgICAgIDwv bGlzdGl0ZW0+CiAgICAgPC92YXJsaXN0ZW50cnk+CioqKioqKioqKioqKioqKgoqKiogMTM4 LDE0MyAqKioqIEFOQUxZWkUgWyBWRVJCT1NFIF0gWyA8cmVwbGFjZWFibGUgY2xhc3M9IlBB UkFNRVRFUiI+dGFibGU8L3JlcGxhY2VhYmxlPiBbICggPHJlCi0tLSAxNDAsMTQ4IC0tLS0K ICAgICBjaG9pY2VzIG9mIHF1ZXJ5IHBsYW5zIHRvIGNoYW5nZSBhZnRlciA8Y29tbWFuZD5B TkFMWVpFPC9jb21tYW5kPiBpcyBydW4uCiAgICAgVG8gYXZvaWQgdGhpcywgcmFpc2UgdGhl IGFtb3VudCBvZiBzdGF0aXN0aWNzIGNvbGxlY3RlZCBieQogICAgIDxjb21tYW5kPkFOQUxZ WkU8L2NvbW1hbmQ+LCBhcyBkZXNjcmliZWQgYmVsb3cuCisgICAgTm90ZSB0aGF0IHRoZSB0 aW1lIG5lZWRlZCB0byBhbmFseXplIGEgZm9yZWlnbiB0YWJsZSBkZXBlbmRzIG9uCisgICAg dGhlIGltcGxlbWVudGF0aW9uIG9mIGEgZm9yZWlnbiBkYXRhIHdyYXBwZXJzIHZpYSB3aGlj aCB0aGF0IHRhYmxlIGlzCisgICAgYXR0YWNoZWQuCiAgICA8L3BhcmE+CiAgCiAgICA8cGFy YT4KKioqIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6ZS5jCi0tLSBiL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL2FuYWx5emUuYwoqKioqKioqKioqKioqKioKKioqIDIyLDI3ICoqKioK LS0tIDIyLDI4IC0tLS0KICAjaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIKICAjaW5jbHVkZSAi Y2F0YWxvZy9pbmRleC5oIgogICNpbmNsdWRlICJjYXRhbG9nL2luZGV4aW5nLmgiCisgI2lu Y2x1ZGUgImNhdGFsb2cvcGdfY2xhc3MuaCIKICAjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb2xs YXRpb24uaCIKICAjaW5jbHVkZSAiY2F0YWxvZy9wZ19pbmhlcml0c19mbi5oIgogICNpbmNs dWRlICJjYXRhbG9nL3BnX25hbWVzcGFjZS5oIgoqKioqKioqKioqKioqKioKKioqIDI5LDM0 ICoqKioKLS0tIDMwLDM3IC0tLS0KICAjaW5jbHVkZSAiY29tbWFuZHMvdGFibGVjbWRzLmgi CiAgI2luY2x1ZGUgImNvbW1hbmRzL3ZhY3V1bS5oIgogICNpbmNsdWRlICJleGVjdXRvci9l eGVjdXRvci5oIgorICNpbmNsdWRlICJmb3JlaWduL2ZvcmVpZ24uaCIKKyAjaW5jbHVkZSAi Zm9yZWlnbi9mZHdhcGkuaCIKICAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAgI2luY2x1ZGUg Im5vZGVzL25vZGVGdW5jcy5oIgogICNpbmNsdWRlICJwYXJzZXIvcGFyc2Vfb3Blci5oIgoq KioqKioqKioqKioqKioKKioqIDkzLDExMiAqKioqIHN0YXRpYyB2b2lkIGNvbXB1dGVfaW5k ZXhfc3RhdHMoUmVsYXRpb24gb25lcmVsLCBkb3VibGUgdG90YWxyb3dzLAogIAkJCQkJQW5s SW5kZXhEYXRhICppbmRleGRhdGEsIGludCBuaW5kZXhlcywKICAJCQkJCUhlYXBUdXBsZSAq cm93cywgaW50IG51bXJvd3MsCiAgCQkJCQlNZW1vcnlDb250ZXh0IGNvbF9jb250ZXh0KTsK LSBzdGF0aWMgVmFjQXR0clN0YXRzICpleGFtaW5lX2F0dHJpYnV0ZShSZWxhdGlvbiBvbmVy ZWwsIGludCBhdHRudW0sCi0gCQkJCSAgTm9kZSAqaW5kZXhfZXhwcik7CiAgc3RhdGljIGlu dCBhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dz LAogIAkJCQkJaW50IHRhcmdyb3dzLCBkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3Rh bGRlYWRyb3dzKTsKLSBzdGF0aWMgZG91YmxlIHJhbmRvbV9mcmFjdCh2b2lkKTsKLSBzdGF0 aWMgZG91YmxlIGluaXRfc2VsZWN0aW9uX3N0YXRlKGludCBuKTsKLSBzdGF0aWMgZG91Ymxl IGdldF9uZXh0X1MoZG91YmxlIHQsIGludCBuLCBkb3VibGUgKnN0YXRlcHRyKTsKLSBzdGF0 aWMgaW50CWNvbXBhcmVfcm93cyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKICBz dGF0aWMgaW50IGFjcXVpcmVfaW5oZXJpdGVkX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJl bCwKICAJCQkJCQkJICBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKICAJCQkJCQkJ ICBkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzKTsKLSBzdGF0aWMg dm9pZCB1cGRhdGVfYXR0c3RhdHMoT2lkIHJlbGlkLCBib29sIGluaCwKLSAJCQkJaW50IG5h dHRzLCBWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHMpOwotIHN0YXRpYyBEYXR1bSBzdGRf ZmV0Y2hfZnVuYyhWYWNBdHRyU3RhdHNQIHN0YXRzLCBpbnQgcm93bnVtLCBib29sICppc051 bGwpOwogIHN0YXRpYyBEYXR1bSBpbmRfZmV0Y2hfZnVuYyhWYWNBdHRyU3RhdHNQIHN0YXRz LCBpbnQgcm93bnVtLCBib29sICppc051bGwpOwogIAogIHN0YXRpYyBib29sIHN0ZF90eXBh bmFseXplKFZhY0F0dHJTdGF0cyAqc3RhdHMpOwotLS0gOTYsMTA2IC0tLS0KKioqKioqKioq KioqKioqCioqKiAxODMsMTkyICoqKiogYW5hbHl6ZV9yZWwoT2lkIHJlbGlkLCBWYWN1dW1T dG10ICp2YWNzdG10LCBCdWZmZXJBY2Nlc3NTdHJhdGVneSBic3RyYXRlZ3kpCiAgCX0KICAK ICAJLyoKISAJICogQ2hlY2sgdGhhdCBpdCdzIGEgcGxhaW4gdGFibGU7IHdlIHVzZWQgdG8g ZG8gdGhpcyBpbiBnZXRfcmVsX29pZHMoKSBidXQKISAJICogc2VlbXMgc2FmZXIgdG8gY2hl Y2sgYWZ0ZXIgd2UndmUgbG9ja2VkIHRoZSByZWxhdGlvbi4KICAJICovCiEgCWlmIChvbmVy ZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1JFTEFUSU9OKQogIAl7CiAgCQkvKiBO byBuZWVkIGZvciBhIFdBUk5JTkcgaWYgd2UgYWxyZWFkeSBjb21wbGFpbmVkIGR1cmluZyBW QUNVVU0gKi8KICAJCWlmICghKHZhY3N0bXQtPm9wdGlvbnMgJiBWQUNPUFRfVkFDVVVNKSkK LS0tIDE3NywxODcgLS0tLQogIAl9CiAgCiAgCS8qCiEgCSAqIENoZWNrIHRoYXQgaXQncyBh IHBsYWluIHRhYmxlIG9yIGEgZm9yZWlnbiB0YWJsZTsgd2UgdXNlZCB0byBkbyB0aGlzIGlu CiEgCSAqIGdldF9yZWxfb2lkcygpIGJ1dCBzZWVtcyBzYWZlciB0byBjaGVjayBhZnRlciB3 ZSd2ZSBsb2NrZWQgdGhlIHJlbGF0aW9uLgogIAkgKi8KISAJaWYgKCEob25lcmVsLT5yZF9y ZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9SRUxBVElPTiB8fAohIAkJb25lcmVsLT5yZF9yZWwt PnJlbGtpbmQgPT0gUkVMS0lORF9GT1JFSUdOX1RBQkxFKSkKICAJewogIAkJLyogTm8gbmVl ZCBmb3IgYSBXQVJOSU5HIGlmIHdlIGFscmVhZHkgY29tcGxhaW5lZCBkdXJpbmcgVkFDVVVN ICovCiAgCQlpZiAoISh2YWNzdG10LT5vcHRpb25zICYgVkFDT1BUX1ZBQ1VVTSkpCioqKioq KioqKioqKioqKgoqKiogMjI4LDI0MCAqKioqIGFuYWx5emVfcmVsKE9pZCByZWxpZCwgVmFj dXVtU3RtdCAqdmFjc3RtdCwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5KQogIAkv KgogIAkgKiBEbyB0aGUgbm9ybWFsIG5vbi1yZWN1cnNpdmUgQU5BTFlaRS4KICAJICovCiEg CWRvX2FuYWx5emVfcmVsKG9uZXJlbCwgdmFjc3RtdCwgZmFsc2UpOwogIAohIAkvKgohIAkg KiBJZiB0aGVyZSBhcmUgY2hpbGQgdGFibGVzLCBkbyByZWN1cnNpdmUgQU5BTFlaRS4KISAJ ICovCiEgCWlmIChvbmVyZWwtPnJkX3JlbC0+cmVsaGFzc3ViY2xhc3MpCiEgCQlkb19hbmFs eXplX3JlbChvbmVyZWwsIHZhY3N0bXQsIHRydWUpOwogIAogIAkvKgogIAkgKiBDbG9zZSBz b3VyY2UgcmVsYXRpb24gbm93LCBidXQga2VlcCBsb2NrIHNvIHRoYXQgbm8gb25lIGRlbGV0 ZXMgaXQKLS0tIDIyMywyNTIgLS0tLQogIAkvKgogIAkgKiBEbyB0aGUgbm9ybWFsIG5vbi1y ZWN1cnNpdmUgQU5BTFlaRS4KICAJICovCiEgCWlmIChvbmVyZWwtPnJkX3JlbC0+cmVsa2lu ZCA9PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUpCiEgCXsKISAJCUZvcmVpZ25EYXRhV3JhcHBl ciAqd3JhcHBlcjsgCiEgCQlGb3JlaWduU2VydmVyCSAgICpzZXJ2ZXI7CiEgCQlGb3JlaWdu VGFibGUJICAgKnRhYmxlOwohIAkJRmR3Um91dGluZQkJICAgKmZkd3JvdXRpbmU7CiAgCiEg CQl0YWJsZSA9IEdldEZvcmVpZ25UYWJsZShSZWxhdGlvbkdldFJlbGlkKG9uZXJlbCkpOwoh IAkJc2VydmVyID0gR2V0Rm9yZWlnblNlcnZlcih0YWJsZS0+c2VydmVyaWQpOwohIAkJd3Jh cHBlciA9IEdldEZvcmVpZ25EYXRhV3JhcHBlcihzZXJ2ZXItPmZkd2lkKTsKISAJCWZkd3Jv dXRpbmUgPSBHZXRGZHdSb3V0aW5lKHdyYXBwZXItPmZkd2hhbmRsZXIpOwohIAohIAkJZmR3 cm91dGluZS0+QW5hbHl6ZUZvcmVpZ25UYWJsZShvbmVyZWwsIHZhY3N0bXQsIGVsZXZlbCk7 CiEgCX0KISAJZWxzZQohIAl7CiEgCQlkb19hbmFseXplX3JlbChvbmVyZWwsIHZhY3N0bXQs IGZhbHNlKTsKISAKISAJCS8qCiEgCQkgKiBJZiB0aGVyZSBhcmUgY2hpbGQgdGFibGVzLCBk byByZWN1cnNpdmUgQU5BTFlaRS4KISAJCSAqLwohIAkJaWYgKG9uZXJlbC0+cmRfcmVsLT5y ZWxoYXNzdWJjbGFzcykKISAJCQlkb19hbmFseXplX3JlbChvbmVyZWwsIHZhY3N0bXQsIHRy dWUpOwohIAl9CiAgCiAgCS8qCiAgCSAqIENsb3NlIHNvdXJjZSByZWxhdGlvbiBub3csIGJ1 dCBrZWVwIGxvY2sgc28gdGhhdCBubyBvbmUgZGVsZXRlcyBpdAoqKioqKioqKioqKioqKioK KioqIDM0MiwzNDggKioqKiBkb19hbmFseXplX3JlbChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1 bVN0bXQgKnZhY3N0bXQsIGJvb2wgaW5oKQogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5E RUZJTkVEX0NPTFVNTiksCiAgCQkJCQllcnJtc2coImNvbHVtbiBcIiVzXCIgb2YgcmVsYXRp b24gXCIlc1wiIGRvZXMgbm90IGV4aXN0IiwKICAJCQkJCQkgICBjb2wsIFJlbGF0aW9uR2V0 UmVsYXRpb25OYW1lKG9uZXJlbCkpKSk7CiEgCQkJdmFjYXR0cnN0YXRzW3RjbnRdID0gZXhh bWluZV9hdHRyaWJ1dGUob25lcmVsLCBpLCBOVUxMKTsKICAJCQlpZiAodmFjYXR0cnN0YXRz W3RjbnRdICE9IE5VTEwpCiAgCQkJCXRjbnQrKzsKICAJCX0KLS0tIDM1NCwzNjAgLS0tLQog IAkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX0NPTFVNTiksCiAgCQkJCQllcnJt c2coImNvbHVtbiBcIiVzXCIgb2YgcmVsYXRpb24gXCIlc1wiIGRvZXMgbm90IGV4aXN0IiwK ICAJCQkJCQkgICBjb2wsIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG9uZXJlbCkpKSk7CiEg CQkJdmFjYXR0cnN0YXRzW3RjbnRdID0gZXhhbWluZV9hdHRyaWJ1dGUob25lcmVsLCBpLCBO VUxMLCBhbmxfY29udGV4dCk7CiAgCQkJaWYgKHZhY2F0dHJzdGF0c1t0Y250XSAhPSBOVUxM KQogIAkJCQl0Y250Kys7CiAgCQl9CioqKioqKioqKioqKioqKgoqKiogMzU2LDM2MiAqKioq IGRvX2FuYWx5emVfcmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwg Ym9vbCBpbmgpCiAgCQl0Y250ID0gMDsKICAJCWZvciAoaSA9IDE7IGkgPD0gYXR0cl9jbnQ7 IGkrKykKICAJCXsKISAJCQl2YWNhdHRyc3RhdHNbdGNudF0gPSBleGFtaW5lX2F0dHJpYnV0 ZShvbmVyZWwsIGksIE5VTEwpOwogIAkJCWlmICh2YWNhdHRyc3RhdHNbdGNudF0gIT0gTlVM TCkKICAJCQkJdGNudCsrOwogIAkJfQotLS0gMzY4LDM3NCAtLS0tCiAgCQl0Y250ID0gMDsK ICAJCWZvciAoaSA9IDE7IGkgPD0gYXR0cl9jbnQ7IGkrKykKICAJCXsKISAJCQl2YWNhdHRy c3RhdHNbdGNudF0gPSBleGFtaW5lX2F0dHJpYnV0ZShvbmVyZWwsIGksIE5VTEwsIGFubF9j b250ZXh0KTsKICAJCQlpZiAodmFjYXR0cnN0YXRzW3RjbnRdICE9IE5VTEwpCiAgCQkJCXRj bnQrKzsKICAJCX0KKioqKioqKioqKioqKioqCioqKiA0MTAsNDE2ICoqKiogZG9fYW5hbHl6 ZV9yZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10LCBib29sIGluaCkK ICAJCQkJCQlpbmRleGtleSA9IChOb2RlICopIGxmaXJzdChpbmRleHByX2l0ZW0pOwogIAkJ CQkJCWluZGV4cHJfaXRlbSA9IGxuZXh0KGluZGV4cHJfaXRlbSk7CiAgCQkJCQkJdGhpc2Rh dGEtPnZhY2F0dHJzdGF0c1t0Y250XSA9CiEgCQkJCQkJCWV4YW1pbmVfYXR0cmlidXRlKEly ZWxbaW5kXSwgaSArIDEsIGluZGV4a2V5KTsKICAJCQkJCQlpZiAodGhpc2RhdGEtPnZhY2F0 dHJzdGF0c1t0Y250XSAhPSBOVUxMKQogIAkJCQkJCQl0Y250Kys7CiAgCQkJCQl9Ci0tLSA0 MjIsNDI4IC0tLS0KICAJCQkJCQlpbmRleGtleSA9IChOb2RlICopIGxmaXJzdChpbmRleHBy X2l0ZW0pOwogIAkJCQkJCWluZGV4cHJfaXRlbSA9IGxuZXh0KGluZGV4cHJfaXRlbSk7CiAg CQkJCQkJdGhpc2RhdGEtPnZhY2F0dHJzdGF0c1t0Y250XSA9CiEgCQkJCQkJCWV4YW1pbmVf YXR0cmlidXRlKElyZWxbaW5kXSwgaSArIDEsIGluZGV4a2V5LCBhbmxfY29udGV4dCk7CiAg CQkJCQkJaWYgKHRoaXNkYXRhLT52YWNhdHRyc3RhdHNbdGNudF0gIT0gTlVMTCkKICAJCQkJ CQkJdGNudCsrOwogIAkJCQkJfQoqKioqKioqKioqKioqKioKKioqIDgwMCw4MDcgKioqKiBj b21wdXRlX2luZGV4X3N0YXRzKFJlbGF0aW9uIG9uZXJlbCwgZG91YmxlIHRvdGFscm93cywK ICAgKiBJZiBpbmRleF9leHByIGlzbid0IE5VTEwsIHRoZW4gd2UncmUgdHJ5aW5nIHRvIGFu YWx5emUgYW4gZXhwcmVzc2lvbiBpbmRleCwKICAgKiBhbmQgaW5kZXhfZXhwciBpcyB0aGUg ZXhwcmVzc2lvbiB0cmVlIHJlcHJlc2VudGluZyB0aGUgY29sdW1uJ3MgZGF0YS4KICAgKi8K ISBzdGF0aWMgVmFjQXR0clN0YXRzICoKISBleGFtaW5lX2F0dHJpYnV0ZShSZWxhdGlvbiBv bmVyZWwsIGludCBhdHRudW0sIE5vZGUgKmluZGV4X2V4cHIpCiAgewogIAlGb3JtX3BnX2F0 dHJpYnV0ZSBhdHRyID0gb25lcmVsLT5yZF9hdHQtPmF0dHJzW2F0dG51bSAtIDFdOwogIAlI ZWFwVHVwbGUJdHlwdHVwbGU7Ci0tLSA4MTIsODE5IC0tLS0KICAgKiBJZiBpbmRleF9leHBy IGlzbid0IE5VTEwsIHRoZW4gd2UncmUgdHJ5aW5nIHRvIGFuYWx5emUgYW4gZXhwcmVzc2lv biBpbmRleCwKICAgKiBhbmQgaW5kZXhfZXhwciBpcyB0aGUgZXhwcmVzc2lvbiB0cmVlIHJl cHJlc2VudGluZyB0aGUgY29sdW1uJ3MgZGF0YS4KICAgKi8KISBWYWNBdHRyU3RhdHMgKgoh IGV4YW1pbmVfYXR0cmlidXRlKFJlbGF0aW9uIG9uZXJlbCwgaW50IGF0dG51bSwgTm9kZSAq aW5kZXhfZXhwciwgTWVtb3J5Q29udGV4dCBhbmxfY29udGV4dCkKICB7CiAgCUZvcm1fcGdf YXR0cmlidXRlIGF0dHIgPSBvbmVyZWwtPnJkX2F0dC0+YXR0cnNbYXR0bnVtIC0gMV07CiAg CUhlYXBUdXBsZQl0eXB0dXBsZTsKKioqKioqKioqKioqKioqCioqKiAxMjQ3LDEyNTMgKioq KiBhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dz LCBpbnQgdGFyZ3Jvd3MsCiAgfQogIAogIC8qIFNlbGVjdCBhIHJhbmRvbSB2YWx1ZSBSIHVu aWZvcm1seSBkaXN0cmlidXRlZCBpbiAoMCAtIDEpICovCiEgc3RhdGljIGRvdWJsZQogIHJh bmRvbV9mcmFjdCh2b2lkKQogIHsKICAJcmV0dXJuICgoZG91YmxlKSByYW5kb20oKSArIDEp IC8gKChkb3VibGUpIE1BWF9SQU5ET01fVkFMVUUgKyAyKTsKLS0tIDEyNTksMTI2NSAtLS0t CiAgfQogIAogIC8qIFNlbGVjdCBhIHJhbmRvbSB2YWx1ZSBSIHVuaWZvcm1seSBkaXN0cmli dXRlZCBpbiAoMCAtIDEpICovCiEgZG91YmxlCiAgcmFuZG9tX2ZyYWN0KHZvaWQpCiAgewog IAlyZXR1cm4gKChkb3VibGUpIHJhbmRvbSgpICsgMSkgLyAoKGRvdWJsZSkgTUFYX1JBTkRP TV9WQUxVRSArIDIpOwoqKioqKioqKioqKioqKioKKioqIDEyNjcsMTI4MCAqKioqIHJhbmRv bV9mcmFjdCh2b2lkKQogICAqIGRldGVybWluZXMgdGhlIG51bWJlciBvZiByZWNvcmRzIHRv IHNraXAgYmVmb3JlIHRoZSBuZXh0IHJlY29yZCBpcwogICAqIHByb2Nlc3NlZC4KICAgKi8K ISBzdGF0aWMgZG91YmxlCiAgaW5pdF9zZWxlY3Rpb25fc3RhdGUoaW50IG4pCiAgewogIAkv KiBJbml0aWFsIHZhbHVlIG9mIFcgKGZvciB1c2Ugd2hlbiBBbGdvcml0aG0gWiBpcyBmaXJz dCBhcHBsaWVkKSAqLwogIAlyZXR1cm4gZXhwKC1sb2cocmFuZG9tX2ZyYWN0KCkpIC8gbik7 CiAgfQogIAohIHN0YXRpYyBkb3VibGUKICBnZXRfbmV4dF9TKGRvdWJsZSB0LCBpbnQgbiwg ZG91YmxlICpzdGF0ZXB0cikKICB7CiAgCWRvdWJsZQkJUzsKLS0tIDEyNzksMTI5MiAtLS0t CiAgICogZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgdG8gc2tpcCBiZWZvcmUg dGhlIG5leHQgcmVjb3JkIGlzCiAgICogcHJvY2Vzc2VkLgogICAqLwohIGRvdWJsZQogIGlu aXRfc2VsZWN0aW9uX3N0YXRlKGludCBuKQogIHsKICAJLyogSW5pdGlhbCB2YWx1ZSBvZiBX IChmb3IgdXNlIHdoZW4gQWxnb3JpdGhtIFogaXMgZmlyc3QgYXBwbGllZCkgKi8KICAJcmV0 dXJuIGV4cCgtbG9nKHJhbmRvbV9mcmFjdCgpKSAvIG4pOwogIH0KICAKISBkb3VibGUKICBn ZXRfbmV4dF9TKGRvdWJsZSB0LCBpbnQgbiwgZG91YmxlICpzdGF0ZXB0cikKICB7CiAgCWRv dWJsZQkJUzsKKioqKioqKioqKioqKioqCioqKiAxMzU5LDEzNjUgKioqKiBnZXRfbmV4dF9T KGRvdWJsZSB0LCBpbnQgbiwgZG91YmxlICpzdGF0ZXB0cikKICAvKgogICAqIHFzb3J0IGNv bXBhcmF0b3IgZm9yIHNvcnRpbmcgcm93c1tdIGFycmF5CiAgICovCiEgc3RhdGljIGludAog IGNvbXBhcmVfcm93cyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQogIHsKICAJSGVh cFR1cGxlCWhhID0gKihjb25zdCBIZWFwVHVwbGUgKikgYTsKLS0tIDEzNzEsMTM3NyAtLS0t CiAgLyoKICAgKiBxc29ydCBjb21wYXJhdG9yIGZvciBzb3J0aW5nIHJvd3NbXSBhcnJheQog ICAqLwohIGludAogIGNvbXBhcmVfcm93cyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpi KQogIHsKICAJSGVhcFR1cGxlCWhhID0gKihjb25zdCBIZWFwVHVwbGUgKikgYTsKKioqKioq KioqKioqKioqCioqKiAxNTU0LDE1NjAgKioqKiBhY3F1aXJlX2luaGVyaXRlZF9zYW1wbGVf cm93cyhSZWxhdGlvbiBvbmVyZWwsIEhlYXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAog ICAqCQlBTkFMWVpFIHRoZSBzYW1lIHRhYmxlIGNvbmN1cnJlbnRseS4gIFByZXNlbnRseSwg d2UgbG9jayB0aGF0IG91dAogICAqCQlieSB0YWtpbmcgYSBzZWxmLWV4Y2x1c2l2ZSBsb2Nr IG9uIHRoZSByZWxhdGlvbiBpbiBhbmFseXplX3JlbCgpLgogICAqLwohIHN0YXRpYyB2b2lk CiAgdXBkYXRlX2F0dHN0YXRzKE9pZCByZWxpZCwgYm9vbCBpbmgsIGludCBuYXR0cywgVmFj QXR0clN0YXRzICoqdmFjYXR0cnN0YXRzKQogIHsKICAJUmVsYXRpb24Jc2Q7Ci0tLSAxNTY2 LDE1NzIgLS0tLQogICAqCQlBTkFMWVpFIHRoZSBzYW1lIHRhYmxlIGNvbmN1cnJlbnRseS4g IFByZXNlbnRseSwgd2UgbG9jayB0aGF0IG91dAogICAqCQlieSB0YWtpbmcgYSBzZWxmLWV4 Y2x1c2l2ZSBsb2NrIG9uIHRoZSByZWxhdGlvbiBpbiBhbmFseXplX3JlbCgpLgogICAqLwoh IHZvaWQKICB1cGRhdGVfYXR0c3RhdHMoT2lkIHJlbGlkLCBib29sIGluaCwgaW50IG5hdHRz LCBWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHMpCiAgewogIAlSZWxhdGlvbglzZDsKKioq KioqKioqKioqKioqCioqKiAxNjkxLDE2OTcgKioqKiB1cGRhdGVfYXR0c3RhdHMoT2lkIHJl bGlkLCBib29sIGluaCwgaW50IG5hdHRzLCBWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHMp CiAgICogVGhpcyBleGlzdHMgdG8gcHJvdmlkZSBzb21lIGluc3VsYXRpb24gYmV0d2VlbiBj b21wdXRlX3N0YXRzIHJvdXRpbmVzCiAgICogYW5kIHRoZSBhY3R1YWwgc3RvcmFnZSBvZiB0 aGUgc2FtcGxlIGRhdGEuCiAgICovCiEgc3RhdGljIERhdHVtCiAgc3RkX2ZldGNoX2Z1bmMo VmFjQXR0clN0YXRzUCBzdGF0cywgaW50IHJvd251bSwgYm9vbCAqaXNOdWxsKQogIHsKICAJ aW50CQkJYXR0bnVtID0gc3RhdHMtPnR1cGF0dG51bTsKLS0tIDE3MDMsMTcwOSAtLS0tCiAg ICogVGhpcyBleGlzdHMgdG8gcHJvdmlkZSBzb21lIGluc3VsYXRpb24gYmV0d2VlbiBjb21w dXRlX3N0YXRzIHJvdXRpbmVzCiAgICogYW5kIHRoZSBhY3R1YWwgc3RvcmFnZSBvZiB0aGUg c2FtcGxlIGRhdGEuCiAgICovCiEgRGF0dW0KICBzdGRfZmV0Y2hfZnVuYyhWYWNBdHRyU3Rh dHNQIHN0YXRzLCBpbnQgcm93bnVtLCBib29sICppc051bGwpCiAgewogIAlpbnQJCQlhdHRu dW0gPSBzdGF0cy0+dHVwYXR0bnVtOwoqKiogYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 LmMKLS0tIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weS5jCioqKioqKioqKioqKioqKgoq KiogMjg4LDI5NSAqKioqIHN0YXRpYyBEYXR1bSBDb3B5UmVhZEJpbmFyeUF0dHJpYnV0ZShD b3B5U3RhdGUgY3N0YXRlLAogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVPdXRUZXh0KENv cHlTdGF0ZSBjc3RhdGUsIGNoYXIgKnN0cmluZyk7CiAgc3RhdGljIHZvaWQgQ29weUF0dHJp YnV0ZU91dENTVihDb3B5U3RhdGUgY3N0YXRlLCBjaGFyICpzdHJpbmcsCiAgCQkJCQlib29s IHVzZV9xdW90ZSwgYm9vbCBzaW5nbGVfYXR0cik7Ci0gc3RhdGljIExpc3QgKkNvcHlHZXRB dHRudW1zKFR1cGxlRGVzYyB0dXBEZXNjLCBSZWxhdGlvbiByZWwsCi0gCQkJICAgTGlzdCAq YXR0bmFtZWxpc3QpOwogIHN0YXRpYyBjaGFyICpsaW1pdF9wcmludG91dF9sZW5ndGgoY29u c3QgY2hhciAqc3RyKTsKICAKICAvKiBMb3ctbGV2ZWwgY29tbXVuaWNhdGlvbnMgZnVuY3Rp b25zICovCi0tLSAyODgsMjkzIC0tLS0KKioqKioqKioqKioqKioqCioqKiAzNzI1LDM3MzEg KioqKiBDb3B5QXR0cmlidXRlT3V0Q1NWKENvcHlTdGF0ZSBjc3RhdGUsIGNoYXIgKnN0cmlu ZywKICAgKgogICAqIHJlbCBjYW4gYmUgTlVMTCAuLi4gaXQncyBvbmx5IHVzZWQgZm9yIGVy cm9yIHJlcG9ydHMuCiAgICovCiEgc3RhdGljIExpc3QgKgogIENvcHlHZXRBdHRudW1zKFR1 cGxlRGVzYyB0dXBEZXNjLCBSZWxhdGlvbiByZWwsIExpc3QgKmF0dG5hbWVsaXN0KQogIHsK ICAJTGlzdAkgICAqYXR0bnVtcyA9IE5JTDsKLS0tIDM3MjMsMzcyOSAtLS0tCiAgICoKICAg KiByZWwgY2FuIGJlIE5VTEwgLi4uIGl0J3Mgb25seSB1c2VkIGZvciBlcnJvciByZXBvcnRz LgogICAqLwohIExpc3QgKgogIENvcHlHZXRBdHRudW1zKFR1cGxlRGVzYyB0dXBEZXNjLCBS ZWxhdGlvbiByZWwsIExpc3QgKmF0dG5hbWVsaXN0KQogIHsKICAJTGlzdAkgICAqYXR0bnVt cyA9IE5JTDsKKioqIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKLS0tIGIv c3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKioqKioqKioqKioqKioqCioqKiAz MTEsMzE2ICoqKiogc3RhdGljIHZvaWQgQVRQcmVwU2V0U3RhdGlzdGljcyhSZWxhdGlvbiBy ZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsCi0tLSAzMTEsMzE4IC0tLS0KICAJCQkJCU5vZGUg Km5ld1ZhbHVlLCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAgc3RhdGljIHZvaWQgQVRFeGVjU2V0 U3RhdGlzdGljcyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsCiAgCQkJCQlO b2RlICpuZXdWYWx1ZSwgTE9DS01PREUgbG9ja21vZGUpOworIHN0YXRpYyB2b2lkIEFUUHJl cFNldE9wdGlvbnMoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLAorIAkJCQkg Tm9kZSAqb3B0aW9ucywgTE9DS01PREUgbG9ja21vZGUpOwogIHN0YXRpYyB2b2lkIEFURXhl Y1NldE9wdGlvbnMoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLAogIAkJCQkg Tm9kZSAqb3B0aW9ucywgYm9vbCBpc1Jlc2V0LCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAgc3Rh dGljIHZvaWQgQVRFeGVjU2V0U3RvcmFnZShSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNv bE5hbWUsCioqKioqKioqKioqKioqKgoqKiogMjg4NiwyODkyICoqKiogQVRQcmVwQ21kKExp c3QgKip3cXVldWUsIFJlbGF0aW9uIHJlbCwgQWx0ZXJUYWJsZUNtZCAqY21kLAogIAkJCWJy ZWFrOwogIAkJY2FzZSBBVF9TZXRPcHRpb25zOgkJLyogQUxURVIgQ09MVU1OIFNFVCAoIG9w dGlvbnMgKSAqLwogIAkJY2FzZSBBVF9SZXNldE9wdGlvbnM6CS8qIEFMVEVSIENPTFVNTiBS RVNFVCAoIG9wdGlvbnMgKSAqLwohIAkJCUFUU2ltcGxlUGVybWlzc2lvbnMocmVsLCBBVFRf VEFCTEUgfCBBVFRfSU5ERVgpOwogIAkJCS8qIFRoaXMgY29tbWFuZCBuZXZlciByZWN1cnNl cyAqLwogIAkJCXBhc3MgPSBBVF9QQVNTX01JU0M7CiAgCQkJYnJlYWs7Ci0tLSAyODg4LDI4 OTUgLS0tLQogIAkJCWJyZWFrOwogIAkJY2FzZSBBVF9TZXRPcHRpb25zOgkJLyogQUxURVIg Q09MVU1OIFNFVCAoIG9wdGlvbnMgKSAqLwogIAkJY2FzZSBBVF9SZXNldE9wdGlvbnM6CS8q IEFMVEVSIENPTFVNTiBSRVNFVCAoIG9wdGlvbnMgKSAqLwohIAkJCUFUU2ltcGxlUGVybWlz c2lvbnMocmVsLCBBVFRfVEFCTEUgfCBBVFRfSU5ERVggfCBBVFRfRk9SRUlHTl9UQUJMRSk7 CiEgCQkJQVRQcmVwU2V0T3B0aW9ucyhyZWwsIGNtZC0+bmFtZSwgY21kLT5kZWYsIGxvY2tt b2RlKTsKICAJCQkvKiBUaGlzIGNvbW1hbmQgbmV2ZXIgcmVjdXJzZXMgKi8KICAJCQlwYXNz ID0gQVRfUEFTU19NSVNDOwogIAkJCWJyZWFrOwoqKioqKioqKioqKioqKioKKioqIDQ4MjIs NDgyOCAqKioqIEFUUHJlcFNldFN0YXRpc3RpY3MoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFy ICpjb2xOYW1lLCBOb2RlICpuZXdWYWx1ZSwgTE9DS01PREUKICAJICogYWxsb3dTeXN0ZW1U YWJsZU1vZHMgdG8gYmUgdHVybmVkIG9uLgogIAkgKi8KICAJaWYgKHJlbC0+cmRfcmVsLT5y ZWxraW5kICE9IFJFTEtJTkRfUkVMQVRJT04gJiYKISAJCXJlbC0+cmRfcmVsLT5yZWxraW5k ICE9IFJFTEtJTkRfSU5ERVgpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShF UlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKICAJCQkJIGVycm1zZygiXCIlc1wiIGlzIG5v dCBhIHRhYmxlIG9yIGluZGV4IiwKLS0tIDQ4MjUsNDgzMiAtLS0tCiAgCSAqIGFsbG93U3lz dGVtVGFibGVNb2RzIHRvIGJlIHR1cm5lZCBvbi4KICAJICovCiAgCWlmIChyZWwtPnJkX3Jl bC0+cmVsa2luZCAhPSBSRUxLSU5EX1JFTEFUSU9OICYmCiEgCQlyZWwtPnJkX3JlbC0+cmVs a2luZCAhPSBSRUxLSU5EX0lOREVYICYmCiEgCQlyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBS RUxLSU5EX0ZPUkVJR05fVEFCTEUpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29k ZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKICAJCQkJIGVycm1zZygiXCIlc1wiIGlz IG5vdCBhIHRhYmxlIG9yIGluZGV4IiwKKioqKioqKioqKioqKioqCioqKiA0ODk0LDQ4OTkg KioqKiBBVEV4ZWNTZXRTdGF0aXN0aWNzKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29s TmFtZSwgTm9kZSAqbmV3VmFsdWUsIExPQ0tNT0RFCi0tLSA0ODk4LDQ5MjMgLS0tLQogIH0K ICAKICBzdGF0aWMgdm9pZAorIEFUUHJlcFNldE9wdGlvbnMoUmVsYXRpb24gcmVsLCBjb25z dCBjaGFyICpjb2xOYW1lLCBOb2RlICpvcHRpb25zLAorIAkJCQkgTE9DS01PREUgbG9ja21v ZGUpCisgeworIAlpZiAocmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9GT1JFSUdO X1RBQkxFKQorIAl7CisgCQlMaXN0Q2VsbCAgICpjZWxsOworIAorIAkJZm9yZWFjaChjZWxs LCAoTGlzdCAqKSBvcHRpb25zKQorIAkJeworIAkJCURlZkVsZW0gICAgKmRlZiA9IChEZWZF bGVtICopIGxmaXJzdChjZWxsKTsKKyAKKyAJCQlpZiAocGdfc3RybmNhc2VjbXAoZGVmLT5k ZWZuYW1lLCAibl9kaXN0aW5jdF9pbmhlcml0ZWQiLCBzdHJsZW4oIm5fZGlzdGluY3RfaW5o ZXJpdGVkIikpID09IDApCisgCQkJCWVyZXBvcnQoRVJST1IsCisgCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAorIAkJCQkJCSBlcnJtc2coIm9wdGlv biBcIm5fZGlzdGluY3RfaW5oZXJpdGVkXCIgaXMgbm90IHN1cHBvcnRlZCBmb3IgYSBmb3Jl aWduIHRhYmxlIikpKTsKKyAJCX0KKyAJfQorIH0KKyAKKyBzdGF0aWMgdm9pZAogIEFURXhl Y1NldE9wdGlvbnMoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLCBOb2RlICpv cHRpb25zLAogIAkJCQkgYm9vbCBpc1Jlc2V0LCBMT0NLTU9ERSBsb2NrbW9kZSkKICB7Cioq KiBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHkuaAotLS0gYi9zcmMvaW5jbHVkZS9jb21t YW5kcy9jb3B5LmgKKioqKioqKioqKioqKioqCioqKiAzMiwzNyAqKioqIGV4dGVybiBib29s IE5leHRDb3B5RnJvbShDb3B5U3RhdGUgY3N0YXRlLCBFeHByQ29udGV4dCAqZWNvbnRleHQs Ci0tLSAzMiwzOCAtLS0tCiAgZXh0ZXJuIGJvb2wgTmV4dENvcHlGcm9tUmF3RmllbGRzKENv cHlTdGF0ZSBjc3RhdGUsCiAgCQkJCQkgIGNoYXIgKioqZmllbGRzLCBpbnQgKm5maWVsZHMp OwogIGV4dGVybiB2b2lkIENvcHlGcm9tRXJyb3JDYWxsYmFjayh2b2lkICphcmcpOworIGV4 dGVybiBMaXN0ICpDb3B5R2V0QXR0bnVtcyhUdXBsZURlc2MgdHVwRGVzYywgUmVsYXRpb24g cmVsLCBMaXN0ICphdHRuYW1lbGlzdCk7CiAgCiAgZXh0ZXJuIERlc3RSZWNlaXZlciAqQ3Jl YXRlQ29weURlc3RSZWNlaXZlcih2b2lkKTsKICAKKioqIGEvc3JjL2luY2x1ZGUvY29tbWFu ZHMvdmFjdXVtLmgKLS0tIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvdmFjdXVtLmgKKioqKioq KioqKioqKioqCioqKiAxNjYsMTcwICoqKiogZXh0ZXJuIHZvaWQgbGF6eV92YWN1dW1fcmVs KFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwKLS0tIDE2NiwxNzggLS0t LQogIC8qIGluIGNvbW1hbmRzL2FuYWx5emUuYyAqLwogIGV4dGVybiB2b2lkIGFuYWx5emVf cmVsKE9pZCByZWxpZCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwKICAJCQlCdWZmZXJBY2Nlc3NT dHJhdGVneSBic3RyYXRlZ3kpOworIGV4dGVybiBWYWNBdHRyU3RhdHMgKiBleGFtaW5lX2F0 dHJpYnV0ZShSZWxhdGlvbiBvbmVyZWwsIGludCBhdHRudW0sIE5vZGUgKmluZGV4X2V4cHIs CisgCQkJTWVtb3J5Q29udGV4dCBhbmxfY29udGV4dCk7CisgZXh0ZXJuIGRvdWJsZSByYW5k b21fZnJhY3Qodm9pZCk7CisgZXh0ZXJuIGRvdWJsZSBpbml0X3NlbGVjdGlvbl9zdGF0ZShp bnQgbik7CisgZXh0ZXJuIGRvdWJsZSBnZXRfbmV4dF9TKGRvdWJsZSB0LCBpbnQgbiwgZG91 YmxlICpzdGF0ZXB0cik7CisgZXh0ZXJuIGludAljb21wYXJlX3Jvd3MoY29uc3Qgdm9pZCAq YSwgY29uc3Qgdm9pZCAqYik7CisgZXh0ZXJuIHZvaWQJdXBkYXRlX2F0dHN0YXRzKE9pZCBy ZWxpZCwgYm9vbCBpbmgsIGludCBuYXR0cywgVmFjQXR0clN0YXRzICoqdmFjYXR0cnN0YXRz KTsKKyBleHRlcm4gRGF0dW0gc3RkX2ZldGNoX2Z1bmMoVmFjQXR0clN0YXRzUCBzdGF0cywg aW50IHJvd251bSwgYm9vbCAqaXNOdWxsKTsKICAKICAjZW5kaWYgICAvKiBWQUNVVU1fSCAq LwoqKiogYS9zcmMvaW5jbHVkZS9mb3JlaWduL2Zkd2FwaS5oCi0tLSBiL3NyYy9pbmNsdWRl L2ZvcmVpZ24vZmR3YXBpLmgKKioqKioqKioqKioqKioqCioqKiAxMiwxOSAqKioqCi0tLSAx MiwyMSAtLS0tCiAgI2lmbmRlZiBGRFdBUElfSAogICNkZWZpbmUgRkRXQVBJX0gKICAKKyAj aW5jbHVkZSAiZm9yZWlnbi9mb3JlaWduLmgiCiAgI2luY2x1ZGUgIm5vZGVzL2V4ZWNub2Rl cy5oIgogICNpbmNsdWRlICJub2Rlcy9yZWxhdGlvbi5oIgorICNpbmNsdWRlICJ1dGlscy9y ZWwuaCIKICAKICAvKiBUbyBhdm9pZCBpbmNsdWRpbmcgZXhwbGFpbi5oIGhlcmUsIHJlZmVy ZW5jZSBFeHBsYWluU3RhdGUgdGh1czogKi8KICBzdHJ1Y3QgRXhwbGFpblN0YXRlOwoqKioq KioqKioqKioqKioKKioqIDY4LDczICoqKiogdHlwZWRlZiB2b2lkICgqUmVTY2FuRm9yZWln blNjYW5fZnVuY3Rpb24pIChGb3JlaWduU2NhblN0YXRlICpub2RlKTsKLS0tIDcwLDc4IC0t LS0KICAKICB0eXBlZGVmIHZvaWQgKCpFbmRGb3JlaWduU2Nhbl9mdW5jdGlvbikgKEZvcmVp Z25TY2FuU3RhdGUgKm5vZGUpOwogIAorIHR5cGVkZWYgdm9pZCAoKkFuYWx5emVGb3JlaWdu VGFibGVfZnVuY3Rpb24pIChSZWxhdGlvbiByZWxhdGlvbiwKKyAJCQkJCQkJCQkJCSAgVmFj dXVtU3RtdCAqdmFjc3RtdCwKKyAJCQkJCQkJCQkJCSAgaW50IGVsZXZlbCk7CiAgCiAgLyoK ICAgKiBGZHdSb3V0aW5lIGlzIHRoZSBzdHJ1Y3QgcmV0dXJuZWQgYnkgYSBmb3JlaWduLWRh dGEgd3JhcHBlcidzIGhhbmRsZXIKKioqKioqKioqKioqKioqCioqKiA4OCw5MyAqKioqIHR5 cGVkZWYgc3RydWN0IEZkd1JvdXRpbmUKLS0tIDkzLDk5IC0tLS0KICAJSXRlcmF0ZUZvcmVp Z25TY2FuX2Z1bmN0aW9uIEl0ZXJhdGVGb3JlaWduU2NhbjsKICAJUmVTY2FuRm9yZWlnblNj YW5fZnVuY3Rpb24gUmVTY2FuRm9yZWlnblNjYW47CiAgCUVuZEZvcmVpZ25TY2FuX2Z1bmN0 aW9uIEVuZEZvcmVpZ25TY2FuOworIAlBbmFseXplRm9yZWlnblRhYmxlX2Z1bmN0aW9uIEFu YWx5emVGb3JlaWduVGFibGU7CiAgfSBGZHdSb3V0aW5lOwogIAogIAo= --------------080504080301030801070700--