Received: from maia.hub.org (maia-2.hub.org [200.46.204.251]) by mail.postgresql.org (Postfix) with ESMTP id 5C52FB5DBD9 for ; Thu, 20 Oct 2011 06:48:28 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.251]) (amavisd-maia, port 10024) with ESMTP id 29073-08 for ; Thu, 20 Oct 2011 09:48:20 +0000 (UTC) X-Greylist: from auto-whitelisted 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 15FDAB5DBD0 for ; Thu, 20 Oct 2011 06:48:18 -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 p9K9mFVM026844; Thu, 20 Oct 2011 18:48:15 +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 E5FC36843; Thu, 20 Oct 2011 18:48:14 +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 C64EE660F; Thu, 20 Oct 2011 18:48:14 +0900 (JST) Received: from mailsv01.y.ecl.ntt.co.jp by dmailsv1.y.ecl.ntt.co.jp (8.14.4/dmailsv1-2.1) with ESMTP id p9K9mESb022795; Thu, 20 Oct 2011 18:48:14 +0900 (JST) Received: from localhost by mailsv01.y.ecl.ntt.co.jp (8.14.5/Lab-1.9) with ESMTP id p9K9mE5O023509; Thu, 20 Oct 2011 18:48:14 +0900 (JST) Message-ID: <4E9FF04B.3050504@lab.ntt.co.jp> Date: Thu, 20 Oct 2011 18:56:27 +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 To: Shigeru Hanada CC: pgsql-hackers@postgresql.org Subject: Re: WIP: Collecting statistics on CSV file data References: <4E6DE18B.4010505@lab.ntt.co.jp> <4E7861C1.2000607@gmail.com> <4E8EC1D8.3080700@lab.ntt.co.jp> <4E9C6573.8050507@gmail.com> In-Reply-To: <4E9C6573.8050507@gmail.com> Content-Type: multipart/mixed; boundary="------------090606060704000703020708" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-0.505 tagged_above=-5 required=5 tests=BAYES_40=-0.001, RCVD_IN_DNSWL_NONE=-0.0001, RP_MATCHES_RCVD=-0.504 X-Spam-Level: X-Archive-Number: 201110/1140 X-Sequence-Number: 196946 This is a multi-part message in MIME format. --------------090606060704000703020708 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Hi, I revised the patch according to Hanada-san's comments. Attached is the updated version of the patch. Changes: * pull up of logging "analyzing foo.bar" * new vac_update_relstats always called * tab-completion in psql * add "foreign tables are not analyzed automatically..." to 23.1.3 Updating Planner Statistics * some other modifications Best regards, Etsuro Fujita --------------090606060704000703020708 Content-Type: text/plain; name="postgresql-analyze-v3.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="postgresql-analyze-v3.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 cyA9IGJhc2VyZWwtPnBhZ2VzOwohIAlyZWx0dXBsZXMgPSBiYXNlcmVsLT50dXBsZXM7CiEg CiEgCWlmIChyZWxwYWdlcyA+IDApCiEgCXsKISAJCWRvdWJsZQkJZGVuc2l0eTsKICAKISAJ CWRlbnNpdHkgPSByZWx0dXBsZXMgLyAoZG91YmxlKSByZWxwYWdlczsKISAKISAJCW50dXBs ZXMgPSBjbGFtcF9yb3dfZXN0KGRlbnNpdHkgKiAoZG91YmxlKSBwYWdlcyk7CiEgCX0KISAJ ZWxzZQohIAl7CiEgCQlpbnQJCQl0dXBsZV93aWR0aDsKISAKISAJCS8qCiEgCQkgKiBFc3Rp bWF0ZSB0aGUgbnVtYmVyIG9mIHR1cGxlcyBpbiB0aGUgZmlsZS4gIFdlIGJhY2sgaW50byB0 aGlzIGVzdGltYXRlCiEgCQkgKiB1c2luZyB0aGUgcGxhbm5lcidzIGlkZWEgb2YgdGhlIHJl bGF0aW9uIHdpZHRoOyB3aGljaCBpcyBib2d1cyBpZiBub3QKISAJCSAqIGFsbCBjb2x1bW5z IGFyZSBiZWluZyByZWFkLCBub3QgdG8gbWVudGlvbiB0aGF0IHRoZSB0ZXh0IHJlcHJlc2Vu dGF0aW9uCiEgCQkgKiBvZiBhIHJvdyBwcm9iYWJseSBpc24ndCB0aGUgc2FtZSBzaXplIGFz IGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KISAJCSAqIEZJWE1FIGxhdGVyLgohIAkJ ICovCiEgCQl0dXBsZV93aWR0aCA9IE1BWEFMSUdOKGJhc2VyZWwtPndpZHRoKSArIE1BWEFM SUdOKHNpemVvZihIZWFwVHVwbGVIZWFkZXJEYXRhKSk7CiEgCiEgCQludHVwbGVzID0gY2xh bXBfcm93X2VzdCgoZG91YmxlKSBzdGF0X2J1Zi5zdF9zaXplIC8gKGRvdWJsZSkgdHVwbGVf d2lkdGgpOwohIAl9CiAgCiAgCS8qCiAgCSAqIE5vdyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9m IHJvd3MgcmV0dXJuZWQgYnkgdGhlIHNjYW4gYWZ0ZXIgYXBwbHlpbmcgdGhlCioqKioqKioq KioqKioqKgoqKiogNjQ1LDY0NyAqKioqIGVzdGltYXRlX2Nvc3RzKFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICpiYXNlcmVsLAotLS0gNjg3LDEwNDYgLS0tLQogIAlydW5fY29z dCArPSBjcHVfcGVyX3R1cGxlICogbnR1cGxlczsKICAJKnRvdGFsX2Nvc3QgPSAqc3RhcnR1 cF9jb3N0ICsgcnVuX2Nvc3Q7CiAgfQorIAorIC8qCisgICogZmlsZV9mZHdfZG9fYW5hbHl6 ZV9yZWwoKSAtLSBhbmFseXplIG9uZSBmb3JlaWduIHRhYmxlCisgICovCisgc3RhdGljIHZv aWQKKyBmaWxlX2Zkd19kb19hbmFseXplX3JlbChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0 bXQgKnZhY3N0bXQsIGludCBlbGV2ZWwpCisgeworIAlpbnQJCQlpLAorIAkJCQlhdHRyX2Nu dCwKKyAJCQkJdGNudCwKKyAJCQkJbnVtcm93cyA9IDAsCisgCQkJCXRhcmdyb3dzOworIAlk b3VibGUJCXRvdGFscm93cyA9IDA7CisgCUJsb2NrTnVtYmVyCXRvdGFscGFnZXMgPSAwOwor IAlIZWFwVHVwbGUgICpyb3dzOworIAlWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHM7Cisg CU1lbW9yeUNvbnRleHQgYW5sX2NvbnRleHQ7CisgCU1lbW9yeUNvbnRleHQgY2FsbGVyX2Nv bnRleHQ7CisgCisgCS8qCisgCSAqIFNldCB1cCBhIHdvcmtpbmcgY29udGV4dCBzbyB0aGF0 IHdlIGNhbiBlYXNpbHkgZnJlZSB3aGF0ZXZlciBqdW5rIGdldHMKKyAJICogY3JlYXRlZC4K KyAJICovCisgCWFubF9jb250ZXh0ID0gQWxsb2NTZXRDb250ZXh0Q3JlYXRlKEN1cnJlbnRN ZW1vcnlDb250ZXh0LAorIAkJCQkJCQkJCQkiQW5hbHl6ZSIsCisgCQkJCQkJCQkJCUFMTE9D U0VUX0RFRkFVTFRfTUlOU0laRSwKKyAJCQkJCQkJCQkJQUxMT0NTRVRfREVGQVVMVF9JTklU U0laRSwKKyAJCQkJCQkJCQkJQUxMT0NTRVRfREVGQVVMVF9NQVhTSVpFKTsKKyAJY2FsbGVy X2NvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oYW5sX2NvbnRleHQpOworIAorIAkv KgorIAkgKiBEZXRlcm1pbmUgd2hpY2ggY29sdW1ucyB0byBhbmFseXplCisgCSAqCisgCSAq IE5vdGUgdGhhdCBzeXN0ZW0gYXR0cmlidXRlcyBhcmUgbmV2ZXIgYW5hbHl6ZWQuCisgCSAq LworIAlpZiAodmFjc3RtdC0+dmFfY29scyAhPSBOSUwpCisgCXsKKyAJCUxpc3RDZWxsCSAg ICpsZTsKKyAKKyAJCXZhY2F0dHJzdGF0cyA9IChWYWNBdHRyU3RhdHMgKiopIHBhbGxvYyhs aXN0X2xlbmd0aCh2YWNzdG10LT52YV9jb2xzKSAqCisgCQkJCQkJCQkJCQkJc2l6ZW9mKFZh Y0F0dHJTdGF0cyAqKSk7CisgCQl0Y250ID0gMDsKKyAJCWZvcmVhY2gobGUsIHZhY3N0bXQt PnZhX2NvbHMpCisgCQl7CisgCQkJY2hhcgkgICAqY29sID0gc3RyVmFsKGxmaXJzdChsZSkp OworIAorIAkJCWkgPSBhdHRuYW1lQXR0TnVtKG9uZXJlbCwgY29sLCBmYWxzZSk7CisgCQkJ aWYgKGkgPT0gSW52YWxpZEF0dHJOdW1iZXIpCisgCQkJCWVyZXBvcnQoRVJST1IsCisgCQkJ CQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfQ09MVU1OKSwKKyAJCQkJCQkgZXJybXNn KCJjb2x1bW4gXCIlc1wiIG9mIHJlbGF0aW9uIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsCisg CQkJCQkJCQljb2wsIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG9uZXJlbCkpKSk7CisgCQkJ dmFjYXR0cnN0YXRzW3RjbnRdID0gZXhhbWluZV9hdHRyaWJ1dGUob25lcmVsLCBpLCBOVUxM LCBhbmxfY29udGV4dCk7CisgCQkJaWYgKHZhY2F0dHJzdGF0c1t0Y250XSAhPSBOVUxMKQor IAkJCQl0Y250Kys7CisgCQl9CisgCQlhdHRyX2NudCA9IHRjbnQ7CisgCX0KKyAJZWxzZQor IAl7CisgCQlhdHRyX2NudCA9IG9uZXJlbC0+cmRfYXR0LT5uYXR0czsKKyAJCXZhY2F0dHJz dGF0cyA9IChWYWNBdHRyU3RhdHMgKiopIHBhbGxvYyhhdHRyX2NudCAqIHNpemVvZihWYWNB dHRyU3RhdHMgKikpOworIAkJdGNudCA9IDA7CisgCQlmb3IgKGkgPSAxOyBpIDw9IGF0dHJf Y250OyBpKyspCisgCQl7CisgCQkJdmFjYXR0cnN0YXRzW3RjbnRdID0gZXhhbWluZV9hdHRy aWJ1dGUob25lcmVsLCBpLCBOVUxMLCBhbmxfY29udGV4dCk7CisgCQkJaWYgKHZhY2F0dHJz dGF0c1t0Y250XSAhPSBOVUxMKQorIAkJCQl0Y250Kys7CisgCQl9CisgCQlhdHRyX2NudCA9 IHRjbnQ7CisgCX0KKyAKKyAJLyoKKyAJICogRGV0ZXJtaW5lIGhvdyBtYW55IHJvd3Mgd2Ug bmVlZCB0byBzYW1wbGUsIHVzaW5nIHRoZSB3b3JzdCBjYXNlIGZyb20KKyAJICogYWxsIGFu YWx5emFibGUgY29sdW1ucy4JV2UgdXNlIGEgbG93ZXIgYm91bmQgb2YgMTAwIHJvd3MgdG8g YXZvaWQKKyAJICogcG9zc2libGUgb3ZlcmZsb3cgaW4gVml0dGVyJ3MgYWxnb3JpdGhtLgor IAkgKi8KKyAJdGFyZ3Jvd3MgPSAxMDA7CisgCWZvciAoaSA9IDA7IGkgPCBhdHRyX2NudDsg aSsrKQorIAl7CisgCQlpZiAodGFyZ3Jvd3MgPCB2YWNhdHRyc3RhdHNbaV0tPm1pbnJvd3Mp CisgCQkJdGFyZ3Jvd3MgPSB2YWNhdHRyc3RhdHNbaV0tPm1pbnJvd3M7CisgCX0KKyAKKyAJ LyoKKyAJICogQWNxdWlyZSB0aGUgc2FtcGxlIHJvd3MKKyAJICovCisgCXJvd3MgPSAoSGVh cFR1cGxlICopIHBhbGxvYyh0YXJncm93cyAqIHNpemVvZihIZWFwVHVwbGUpKTsKKyAJbnVt cm93cyA9IGZpbGVfZmR3X2FjcXVpcmVfc2FtcGxlX3Jvd3Mob25lcmVsLCBlbGV2ZWwsIHJv d3MsIHRhcmdyb3dzLCAmdG90YWxwYWdlcywgJnRvdGFscm93cyk7CisgCisgCS8qCisgCSAq IENvbXB1dGUgdGhlIHN0YXRpc3RpY3MuCVRlbXBvcmFyeSByZXN1bHRzIGR1cmluZyB0aGUg Y2FsY3VsYXRpb25zIGZvcgorIAkgKiBlYWNoIGNvbHVtbiBhcmUgc3RvcmVkIGluIGEgY2hp bGQgY29udGV4dC4gIFRoZSBjYWxjIHJvdXRpbmVzIGFyZQorIAkgKiByZXNwb25zaWJsZSB0 byBtYWtlIHN1cmUgdGhhdCB3aGF0ZXZlciB0aGV5IHN0b3JlIGludG8gdGhlIFZhY0F0dHJT dGF0cworIAkgKiBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGluIGFubF9jb250ZXh0LgorIAkg Ki8KKyAJaWYgKG51bXJvd3MgPiAwKQorIAl7CisgCQlNZW1vcnlDb250ZXh0IGNvbF9jb250 ZXh0LCBvbGRfY29udGV4dDsKKyAKKyAJCWNvbF9jb250ZXh0ID0gQWxsb2NTZXRDb250ZXh0 Q3JlYXRlKGFubF9jb250ZXh0LAorIAkJCQkJCQkJCQkJIkFuYWx5emUgQ29sdW1uIiwKKyAJ CQkJCQkJCQkJCUFMTE9DU0VUX0RFRkFVTFRfTUlOU0laRSwKKyAJCQkJCQkJCQkJCUFMTE9D U0VUX0RFRkFVTFRfSU5JVFNJWkUsCisgCQkJCQkJCQkJCQlBTExPQ1NFVF9ERUZBVUxUX01B WFNJWkUpOworIAkJb2xkX2NvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oY29sX2Nv bnRleHQpOworIAorIAkJZm9yIChpID0gMDsgaSA8IGF0dHJfY250OyBpKyspCisgCQl7Cisg CQkJVmFjQXR0clN0YXRzCSAgICpzdGF0cyA9IHZhY2F0dHJzdGF0c1tpXTsKKyAJCQlBdHRy aWJ1dGVPcHRzCSAgICphb3B0ID0gZ2V0X2F0dHJpYnV0ZV9vcHRpb25zKG9uZXJlbC0+cmRf aWQsIHN0YXRzLT5hdHRyLT5hdHRudW0pOworIAorIAkJCXN0YXRzLT5yb3dzID0gcm93czsK KyAJCQlzdGF0cy0+dHVwRGVzYyA9IG9uZXJlbC0+cmRfYXR0OworIAkJCSgqc3RhdHMtPmNv bXB1dGVfc3RhdHMpIChzdGF0cywKKyAJCQkJCQkJCQkgc3RkX2ZldGNoX2Z1bmMsCisgCQkJ CQkJCQkJIG51bXJvd3MsCisgCQkJCQkJCQkJIHRvdGFscm93cyk7CisgCisgCQkJLyoKKyAJ CQkgKiBJZiB0aGUgYXBwcm9wcmlhdGUgZmxhdm9yIG9mIHRoZSBuX2Rpc3RpbmN0IG9wdGlv biBpcworIAkJCSAqIHNwZWNpZmllZCwgb3ZlcnJpZGUgd2l0aCB0aGUgY29ycmVzcG9uZGlu ZyB2YWx1ZS4KKyAJCQkgKi8KKyAJCQlpZiAoYW9wdCAhPSBOVUxMKQorIAkJCXsKKyAJCQkJ ZmxvYXQ4CQluX2Rpc3RpbmN0ID0gYW9wdC0+bl9kaXN0aW5jdDsKKyAKKyAJCQkJaWYgKG5f ZGlzdGluY3QgIT0gMC4wKQorIAkJCQkJc3RhdHMtPnN0YWRpc3RpbmN0ID0gbl9kaXN0aW5j dDsKKyAJCQl9CisgCisgCQkJTWVtb3J5Q29udGV4dFJlc2V0QW5kRGVsZXRlQ2hpbGRyZW4o Y29sX2NvbnRleHQpOworIAkJfQorIAorIAkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZF9j b250ZXh0KTsKKyAJCU1lbW9yeUNvbnRleHREZWxldGUoY29sX2NvbnRleHQpOworIAorIAkJ LyoKKyAJCSAqIEVtaXQgdGhlIGNvbXBsZXRlZCBzdGF0cyByb3dzIGludG8gcGdfc3RhdGlz dGljLCByZXBsYWNpbmcgYW55CisgCQkgKiBwcmV2aW91cyBzdGF0aXN0aWNzIGZvciB0aGUg dGFyZ2V0IGNvbHVtbnMuCShJZiB0aGVyZSBhcmUgc3RhdHMgaW4KKyAJCSAqIHBnX3N0YXRp c3RpYyBmb3IgY29sdW1ucyB3ZSBkaWRuJ3QgcHJvY2Vzcywgd2UgbGVhdmUgdGhlbSBhbG9u ZS4pCisgCQkgKi8KKyAJCXVwZGF0ZV9hdHRzdGF0cyhvbmVyZWwtPnJkX2lkLCBmYWxzZSwg YXR0cl9jbnQsIHZhY2F0dHJzdGF0cyk7CisgCX0KKyAKKyAJLyoKKyAJICogVXBkYXRlIHBh Z2VzL3R1cGxlcyBzdGF0cyBpbiBwZ19jbGFzcy4KKyAJICovCisgCXZhY191cGRhdGVfcmVs c3RhdHMob25lcmVsLCB0b3RhbHBhZ2VzLCB0b3RhbHJvd3MsIDAsIGZhbHNlLCBJbnZhbGlk VHJhbnNhY3Rpb25JZCk7CisgCisgCS8qCisgCSAqIFJlcG9ydCBBTkFMWVpFIHRvIHRoZSBz dGF0cyBjb2xsZWN0b3IsIHRvby4KKyAJICovCisgCXBnc3RhdF9yZXBvcnRfYW5hbHl6ZShv bmVyZWwsIHRvdGFscm93cywgMCk7CisgCisgCS8qIFJlc3RvcmUgY3VycmVudCBjb250ZXh0 IGFuZCByZWxlYXNlIG1lbW9yeSAqLworIAlNZW1vcnlDb250ZXh0U3dpdGNoVG8oY2FsbGVy X2NvbnRleHQpOworIAlNZW1vcnlDb250ZXh0RGVsZXRlKGFubF9jb250ZXh0KTsKKyAJYW5s X2NvbnRleHQgPSBOVUxMOworIH0KKyAKKyAvKgorICAqIGZpbGVfZmR3X2FjcXVpcmVfc2Ft cGxlX3Jvd3MgLS0gYWNxdWlyZSBhIHJhbmRvbSBzYW1wbGUgb2Ygcm93cyBmcm9tIHRoZSB0 YWJsZQorICAqCisgICogU2VsZWN0ZWQgcm93cyBhcmUgcmV0dXJuZWQgaW4gdGhlIGNhbGxl ci1hbGxvY2F0ZWQgYXJyYXkgcm93c1tdLCB3aGljaAorICAqIG11c3QgaGF2ZSBhdCBsZWFz dCB0YXJncm93cyBlbnRyaWVzLgorICAqIFRoZSBhY3R1YWwgbnVtYmVyIG9mIHJvd3Mgc2Vs ZWN0ZWQgaXMgcmV0dXJuZWQgYXMgdGhlIGZ1bmN0aW9uIHJlc3VsdC4KKyAgKiBXZSBhbHNv IGNvdW50IHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUsIGFuZCByZXR1cm4gaXQg aW50byAqdG90YWxyb3dzLgorICAqCisgICogVGhlIHJldHVybmVkIGxpc3Qgb2YgdHVwbGVz IGlzIGluIG9yZGVyIGJ5IHBoeXNpY2FsIHBvc2l0aW9uIGluIHRoZSB0YWJsZS4KKyAgKiAo V2Ugd2lsbCByZWx5IG9uIHRoaXMgbGF0ZXIgdG8gZGVyaXZlIGNvcnJlbGF0aW9uIGVzdGlt YXRlcy4pCisgICovCisgc3RhdGljIGludAorIGZpbGVfZmR3X2FjcXVpcmVfc2FtcGxlX3Jv d3MoUmVsYXRpb24gb25lcmVsLCBpbnQgZWxldmVsLCBIZWFwVHVwbGUgKnJvd3MsIGludCB0 YXJncm93cywgQmxvY2tOdW1iZXIgKnRvdGFscGFnZXMsIGRvdWJsZSAqdG90YWxyb3dzKQor IHsKKyAJaW50CQkJbnVtcm93cyA9IDA7CisgCWRvdWJsZQkJc2FtcGxlcm93cyA9IDA7ICAv KiB0b3RhbCAjIHJvd3MgY29sbGVjdGVkICovCisgCWRvdWJsZQkJcm93c3Rvc2tpcCA9IC0x OyAvKiAtMSBtZWFucyBub3Qgc2V0IHlldCAqLworIAlkb3VibGUJCXJzdGF0ZTsKKyAJSGVh cFR1cGxlCXR1cGxlOworIAlUdXBsZURlc2MJdHVwRGVzYzsKKyAJVHVwbGVDb25zdHIgKmNv bnN0cjsKKyAJaW50CQkJbmF0dHM7CisgCWludAkJCWF0dHJDaGs7CisgCURhdHVtCSAgICp2 YWx1ZXM7CisgCWJvb2wJICAgKm51bGxzOworIAlib29sCQlmb3VuZDsKKyAJYm9vbAkJc2Ft cGxlX2l0ID0gZmFsc2U7CisgCUJsb2NrTnVtYmVyCWJsa251bTsKKyAJT2Zmc2V0TnVtYmVy IG9mZm51bTsKKyAJY2hhcgkgICAqZmlsZW5hbWU7CisgCXN0cnVjdCBzdGF0CXN0YXRfYnVm OworIAlMaXN0CSAgICpvcHRpb25zOworIAlDb3B5U3RhdGUJY3N0YXRlOworIAlFcnJvckNv bnRleHRDYWxsYmFjayBlcnJjb250ZXh0OworIAorIAlBc3NlcnQob25lcmVsKTsKKyAJQXNz ZXJ0KHRhcmdyb3dzID4gMCk7CisgCisgCXR1cERlc2MgPSBSZWxhdGlvbkdldERlc2NyKG9u ZXJlbCk7CisgCWNvbnN0ciA9IHR1cERlc2MtPmNvbnN0cjsKKyAJbmF0dHMgPSB0dXBEZXNj LT5uYXR0czsKKyAJdmFsdWVzID0gKERhdHVtICopIHBhbGxvYyh0dXBEZXNjLT5uYXR0cyAq IHNpemVvZihEYXR1bSkpOworIAludWxscyA9IChib29sICopIHBhbGxvYyh0dXBEZXNjLT5u YXR0cyAqIHNpemVvZihib29sKSk7CisgCisgCS8qIEZldGNoIG9wdGlvbnMgb2YgZm9yZWln biB0YWJsZSAqLworIAlmaWxlR2V0T3B0aW9ucyhSZWxhdGlvbkdldFJlbGlkKG9uZXJlbCks ICZmaWxlbmFtZSwgJm9wdGlvbnMpOworIAorIAkvKgorIAkgKiBHZXQgc2l6ZSBvZiB0aGUg ZmlsZS4KKyAJICovCisgCWlmIChzdGF0KGZpbGVuYW1lLCAmc3RhdF9idWYpIDwgMCkKKyAJ CWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorIAkJ CQkgZXJybXNnKCJjb3VsZCBub3Qgc3RhdCBmaWxlIFwiJXNcIjogJW0iLAorIAkJCQkJCWZp bGVuYW1lKSkpOworIAorIAkvKgorIAkgKiBDb252ZXJ0IHNpemUgdG8gcGFnZXMgZm9yIHVz ZSBpbiBJL08gY29zdCBlc3RpbWF0ZS4KKyAJICovCisgCSp0b3RhbHBhZ2VzID0gKHN0YXRf YnVmLnN0X3NpemUgKyAoQkxDS1NaIC0gMSkpIC8gQkxDS1NaOworIAlpZiAoKnRvdGFscGFn ZXMgPCAxKQorIAkJKnRvdGFscGFnZXMgPSAxOworIAorIAkvKgorIAkgKiBDcmVhdGUgQ29w eVN0YXRlIGZyb20gRkRXIG9wdGlvbnMuICBXZSBhbHdheXMgYWNxdWlyZSBhbGwgY29sdW1u cywgc28KKyAJICogYXMgdG8gbWF0Y2ggdGhlIGV4cGVjdGVkIFNjYW5UdXBsZVNsb3Qgc2ln bmF0dXJlLgorIAkgKi8KKyAJY3N0YXRlID0gQmVnaW5Db3B5RnJvbShvbmVyZWwsIGZpbGVu YW1lLCBOSUwsIG9wdGlvbnMpOworIAorIAkvKiBQcmVwYXJlIGZvciBzYW1wbGluZyByb3dz ICovCisgCXJzdGF0ZSA9IGluaXRfc2VsZWN0aW9uX3N0YXRlKHRhcmdyb3dzKTsKKyAKKyAJ LyogU2V0IHVwIGNhbGxiYWNrIHRvIGlkZW50aWZ5IGVycm9yIGxpbmUgbnVtYmVyLiAqLwor IAllcnJjb250ZXh0LmNhbGxiYWNrID0gQ29weUZyb21FcnJvckNhbGxiYWNrOworIAllcnJj b250ZXh0LmFyZyA9ICh2b2lkICopIGNzdGF0ZTsKKyAJZXJyY29udGV4dC5wcmV2aW91cyA9 IGVycm9yX2NvbnRleHRfc3RhY2s7CisgCWVycm9yX2NvbnRleHRfc3RhY2sgPSAmZXJyY29u dGV4dDsKKyAKKyAJZm9yICg7OykKKyAJeworIAkJc2FtcGxlX2l0ID0gdHJ1ZTsKKyAKKyAJ CUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisgCisgCQlmb3VuZCA9IE5leHRDb3B5RnJvbShj c3RhdGUsIE5VTEwsIHZhbHVlcywgbnVsbHMsIE5VTEwpOworIAorIAkJaWYgKCFmb3VuZCkK KyAJCQlicmVhazsKKyAKKyAJCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1cERlc2MsIHZh bHVlcywgbnVsbHMpOworIAorIAkJaWYgKGNvbnN0ciAmJiBjb25zdHItPmhhc19ub3RfbnVs bCkKKyAJCXsKKyAJCQlmb3IgKGF0dHJDaGsgPSAxOyBhdHRyQ2hrIDw9IG5hdHRzOyBhdHRy Q2hrKyspCisgCQkJeworIAkJCQlpZiAob25lcmVsLT5yZF9hdHQtPmF0dHJzW2F0dHJDaGsg LSAxXS0+YXR0bm90bnVsbCAmJgorIAkJCQkJIShjc3RhdGUtPmZvcmNlX25vdG51bGxfZmxh Z3NbYXR0ckNoayAtIDFdKSAmJgorIAkJCQkJaGVhcF9hdHRpc251bGwodHVwbGUsIGF0dHJD aGspKQorIAkJCQl7CisgCQkJCQlzYW1wbGVfaXQgPSBmYWxzZTsKKyAJCQkJCWJyZWFrOwor IAkJCQl9CisgCQkJfQorIAkJfQorIAorIAkJaWYgKCFzYW1wbGVfaXQpCisgCQl7CisgCQkJ aGVhcF9mcmVldHVwbGUodHVwbGUpOworIAkJCWNvbnRpbnVlOworIAkJfQorIAorIAkJLyoK KyAJCSAqIFRoZSBmaXJzdCB0YXJncm93cyBzYW1wbGUgcm93cyBhcmUgc2ltcGx5IGNvcGll ZCBpbnRvIHRoZQorIAkJICogcmVzZXJ2b2lyLiBUaGVuIHdlIHN0YXJ0IHJlcGxhY2luZyB0 dXBsZXMgaW4gdGhlIHNhbXBsZQorIAkJICogdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZiB0 aGUgcmVsYXRpb24uCVRoaXMgYWxnb3JpdGhtIGlzCisgCQkgKiBmcm9tIEplZmYgVml0dGVy J3MgcGFwZXIgKHNlZSBmdWxsIGNpdGF0aW9uIGJlbG93KS4gSXQKKyAJCSAqIHdvcmtzIGJ5 IHJlcGVhdGVkbHkgY29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdHVwbGVzIHRvIHNraXAKKyAJ CSAqIGJlZm9yZSBzZWxlY3RpbmcgYSB0dXBsZSwgd2hpY2ggcmVwbGFjZXMgYSByYW5kb21s eSBjaG9zZW4KKyAJCSAqIGVsZW1lbnQgb2YgdGhlIHJlc2Vydm9pciAoY3VycmVudCBzZXQg b2YgdHVwbGVzKS4gIEF0IGFsbAorIAkJICogdGltZXMgdGhlIHJlc2Vydm9pciBpcyBhIHRy dWUgcmFuZG9tIHNhbXBsZSBvZiB0aGUgdHVwbGVzCisgCQkgKiB3ZSd2ZSBwYXNzZWQgb3Zl ciBzbyBmYXIsIHNvIHdoZW4gd2UgZmFsbCBvZmYgdGhlIGVuZCBvZgorIAkJICogdGhlIHJl bGF0aW9uIHdlJ3JlIGRvbmUuCisgCQkgKi8KKyAJCWlmIChudW1yb3dzIDwgdGFyZ3Jvd3Mp CisgCQl7CisgCQkJYmxrbnVtID0gKEJsb2NrTnVtYmVyKSBzYW1wbGVyb3dzIC8gTWF4T2Zm c2V0TnVtYmVyOworIAkJCW9mZm51bSA9IChPZmZzZXROdW1iZXIpIHNhbXBsZXJvd3MgJSBN YXhPZmZzZXROdW1iZXIgKyAxOworIAkJCUl0ZW1Qb2ludGVyU2V0KCZ0dXBsZS0+dF9zZWxm LCBibGtudW0sIG9mZm51bSk7CisgCQkJcm93c1tudW1yb3dzKytdID0gaGVhcF9jb3B5dHVw bGUodHVwbGUpOworIAkJfQorIAkJZWxzZQorIAkJeworIAkJCS8qCisgCQkJICogdCBpbiBW aXR0ZXIncyBwYXBlciBpcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgYWxyZWFkeQorIAkJCSAq IHByb2Nlc3NlZC4gIElmIHdlIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBTIHZhbHVlLCB3ZQor IAkJCSAqIG11c3QgdXNlIHRoZSBub3QteWV0LWluY3JlbWVudGVkIHZhbHVlIG9mIHNhbXBs ZXJvd3MgYXMKKyAJCQkgKiB0LgorIAkJCSAqLworIAkJCWlmIChyb3dzdG9za2lwIDwgMCkK KyAJCQkJcm93c3Rvc2tpcCA9IGdldF9uZXh0X1Moc2FtcGxlcm93cywgdGFyZ3Jvd3MsICZy c3RhdGUpOworIAorIAkJCWlmIChyb3dzdG9za2lwIDw9IDApCisgCQkJeworIAkJCQkvKgor IAkJCQkgKiBGb3VuZCBhIHN1aXRhYmxlIHR1cGxlLCBzbyBzYXZlIGl0LCByZXBsYWNpbmcg b25lCisgCQkJCSAqIG9sZCB0dXBsZSBhdCByYW5kb20KKyAJCQkJICovCisgCQkJCWludCBr ID0gKGludCkgKHRhcmdyb3dzICogcmFuZG9tX2ZyYWN0KCkpOworIAorIAkJCQlBc3NlcnQo ayA+PSAwICYmIGsgPCB0YXJncm93cyk7CisgCQkJCWhlYXBfZnJlZXR1cGxlKHJvd3Nba10p OworIAorIAkJCQlibGtudW0gPSAoQmxvY2tOdW1iZXIpIHNhbXBsZXJvd3MgLyBNYXhPZmZz ZXROdW1iZXI7CisgCQkJCW9mZm51bSA9IChPZmZzZXROdW1iZXIpIHNhbXBsZXJvd3MgJSBN YXhPZmZzZXROdW1iZXIgKyAxOworIAkJCQlJdGVtUG9pbnRlclNldCgmdHVwbGUtPnRfc2Vs ZiwgYmxrbnVtLCBvZmZudW0pOworIAkJCQlyb3dzW2tdID0gaGVhcF9jb3B5dHVwbGUodHVw bGUpOworIAkJCX0KKyAKKyAJCQlyb3dzdG9za2lwIC09IDE7CisgCQl9CisgCisgCQlzYW1w bGVyb3dzICs9IDE7CisgCQloZWFwX2ZyZWV0dXBsZSh0dXBsZSk7CisgCX0KKyAKKyAJLyog UmVtb3ZlIGVycm9yIGNhbGxiYWNrLiAqLworIAllcnJvcl9jb250ZXh0X3N0YWNrID0gZXJy Y29udGV4dC5wcmV2aW91czsKKyAKKyAJLyoKKyAJICogSWYgd2UgZGlkbid0IGZpbmQgYXMg bWFueSB0dXBsZXMgYXMgd2Ugd2FudGVkIHRoZW4gd2UncmUgZG9uZS4gTm8gc29ydAorIAkg KiBpcyBuZWVkZWQsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBpbiBvcmRlci4KKyAJICoKKyAJ ICogT3RoZXJ3aXNlIHdlIG5lZWQgdG8gc29ydCB0aGUgY29sbGVjdGVkIHR1cGxlcyBieSBw b3NpdGlvbgorIAkgKiAoaXRlbXBvaW50ZXIpLiBJdCdzIG5vdCB3b3J0aCB3b3JyeWluZyBh Ym91dCBjb3JuZXIgY2FzZXMgd2hlcmUgdGhlCisgCSAqIHR1cGxlcyBhcmUgYWxyZWFkeSBz b3J0ZWQuCisgCSAqLworIAlpZiAobnVtcm93cyA9PSB0YXJncm93cykKKyAJCXFzb3J0KCh2 b2lkICopIHJvd3MsIG51bXJvd3MsIHNpemVvZihIZWFwVHVwbGUpLCBjb21wYXJlX3Jvd3Mp OworIAorIAkqdG90YWxyb3dzID0gc2FtcGxlcm93czsKKyAKKyAJRW5kQ29weUZyb20oY3N0 YXRlKTsKKyAKKyAJcGZyZWUodmFsdWVzKTsKKyAJcGZyZWUobnVsbHMpOworIAorIAkvKgor IAkgKiBFbWl0IHNvbWUgaW50ZXJlc3RpbmcgcmVsYXRpb24gaW5mbworIAkgKi8KKyAJZXJl cG9ydChlbGV2ZWwsCisgCQkJKGVycm1zZygiXCIlc1wiOiBzY2FubmVkLCAiCisgCQkJCQki JWQgcm93cyBpbiBzYW1wbGUsICVkIHRvdGFsIHJvd3MiLAorIAkJCQkJUmVsYXRpb25HZXRS ZWxhdGlvbk5hbWUob25lcmVsKSwgbnVtcm93cywgKGludCkgKnRvdGFscm93cykpKTsKKyAK KyAJcmV0dXJuIG51bXJvd3M7CisgfQoqKiogYS9jb250cmliL2ZpbGVfZmR3L2lucHV0L2Zp bGVfZmR3LnNvdXJjZQotLS0gYi9jb250cmliL2ZpbGVfZmR3L2lucHV0L2ZpbGVfZmR3LnNv dXJjZQoqKioqKioqKioqKioqKioKKioqIDExMSwxMTYgKioqKiBFWEVDVVRFIHN0KDEwMCk7 Ci0tLSAxMTEsMTIxIC0tLS0KICBFWEVDVVRFIHN0KDEwMCk7CiAgREVBTExPQ0FURSBzdDsK ICAKKyAtLSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gdGVzdHMKKyBBTkFMWVpFIGFnZ19jc3Y7 CisgU0VMRUNUIHJlbHBhZ2VzLCByZWx0dXBsZXMgRlJPTSBwZ19jbGFzcyBXSEVSRSByZWxu YW1lID0gJ2FnZ19jc3YnOworIFNFTEVDVCAqIEZST00gcGdfc3RhdHMgV0hFUkUgdGFibGVu YW1lID0gJ2FnZ19jc3YnOworIAogIC0tIHRhYmxlb2lkCiAgU0VMRUNUIHRhYmxlb2lkOjpy ZWdjbGFzcywgYiBGUk9NIGFnZ19jc3Y7CiAgCioqKiBhL2NvbnRyaWIvZmlsZV9mZHcvb3V0 cHV0L2ZpbGVfZmR3LnNvdXJjZQotLS0gYi9jb250cmliL2ZpbGVfZmR3L291dHB1dC9maWxl X2Zkdy5zb3VyY2UKKioqKioqKioqKioqKioqCioqKiAxNzQsMTc5ICoqKiogRVhFQ1VURSBz dCgxMDApOwotLS0gMTc0LDE5NCAtLS0tCiAgKDEgcm93KQogIAogIERFQUxMT0NBVEUgc3Q7 CisgLS0gc3RhdGlzdGljcyBjb2xsZWN0aW9uIHRlc3RzCisgQU5BTFlaRSBhZ2dfY3N2Owor IFNFTEVDVCByZWxwYWdlcywgcmVsdHVwbGVzIEZST00gcGdfY2xhc3MgV0hFUkUgcmVsbmFt ZSA9ICdhZ2dfY3N2JzsKKyAgcmVscGFnZXMgfCByZWx0dXBsZXMgCisgLS0tLS0tLS0tLSst LS0tLS0tLS0tLQorICAgICAgICAgMSB8ICAgICAgICAgMworICgxIHJvdykKKyAKKyBTRUxF Q1QgKiBGUk9NIHBnX3N0YXRzIFdIRVJFIHRhYmxlbmFtZSA9ICdhZ2dfY3N2JzsKKyAgc2No ZW1hbmFtZSB8IHRhYmxlbmFtZSB8IGF0dG5hbWUgfCBpbmhlcml0ZWQgfCBudWxsX2ZyYWMg fCBhdmdfd2lkdGggfCBuX2Rpc3RpbmN0IHwgbW9zdF9jb21tb25fdmFscyB8IG1vc3RfY29t bW9uX2ZyZXFzIHwgICAgaGlzdG9ncmFtX2JvdW5kcyAgICAgfCBjb3JyZWxhdGlvbiAKKyAt LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0K KyAgcHVibGljICAgICB8IGFnZ19jc3YgICB8IGEgICAgICAgfCBmICAgICAgICAgfCAgICAg ICAgIDAgfCAgICAgICAgIDIgfCAgICAgICAgIC0xIHwgICAgICAgICAgICAgICAgICB8ICAg ICAgICAgICAgICAgICAgIHwgezAsNDIsMTAwfSAgICAgICAgICAgICAgfCAgICAgICAgLTAu NQorICBwdWJsaWMgICAgIHwgYWdnX2NzdiAgIHwgYiAgICAgICB8IGYgICAgICAgICB8ICAg ICAgICAgMCB8ICAgICAgICAgNCB8ICAgICAgICAgLTEgfCAgICAgICAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgICAgfCB7MC4wOTU2MSw5OS4wOTcsMzI0Ljc4fSB8ICAgICAgICAg MC41CisgKDIgcm93cykKKyAKICAtLSB0YWJsZW9pZAogIFNFTEVDVCB0YWJsZW9pZDo6cmVn Y2xhc3MsIGIgRlJPTSBhZ2dfY3N2OwogICB0YWJsZW9pZCB8ICAgIGIgICAgCioqKiBhL2Rv Yy9zcmMvc2dtbC9mZHdoYW5kbGVyLnNnbWwKLS0tIGIvZG9jL3NyYy9zZ21sL2Zkd2hhbmRs ZXIuc2dtbAoqKioqKioqKioqKioqKioKKioqIDIyOCwyMzMgKioqKiBFbmRGb3JlaWduU2Nh biAoRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSk7Ci0tLSAyMjgsMjQ2IC0tLS0KICAgICAgPC9w YXJhPgogIAogICAgICA8cGFyYT4KKyA8cHJvZ3JhbWxpc3Rpbmc+Cisgdm9pZAorIEFuYWx5 emVGb3JlaWduVGFibGUgKFJlbGF0aW9uIG9uZXJlbCwKKyAgICAgICAgICAgICAgICAgICAg ICBWYWN1dW1TdG10ICp2YWNzdG10LCAKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxl dmVsKTsKKyA8L3Byb2dyYW1saXN0aW5nPgorIAorICAgICAgQ29sbGVjdCBzdGF0aXN0aWNz IG9uIGEgZm9yZWlnbiB0YWJsZSBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlCisgICAg ICBwZ19jbGFzcyBhbmQgcGdfc3RhdGlzdGljcyBzeXN0ZW0gY2F0YWxvZ3MuCisgICAgICBU aGlzIGlzIGNhbGxlZCB3aGVuIDxjb21tYW5kPkFOQUxZWkU8Lz4gY29tbWFuZCBpcyBydW4u CisgICAgIDwvcGFyYT4KKyAKKyAgICAgPHBhcmE+CiAgICAgICBUaGUgPHN0cnVjdG5hbWU+ RmR3Um91dGluZTwvPiBhbmQgPHN0cnVjdG5hbWU+RmR3UGxhbjwvPiBzdHJ1Y3QgdHlwZXMK ICAgICAgIGFyZSBkZWNsYXJlZCBpbiA8ZmlsZW5hbWU+c3JjL2luY2x1ZGUvZm9yZWlnbi9m ZHdhcGkuaDwvPiwgd2hpY2ggc2VlCiAgICAgICBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgoq KiogYS9kb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbAotLS0gYi9kb2Mvc3JjL3NnbWwv bWFpbnRlbmFuY2Uuc2dtbAoqKioqKioqKioqKioqKioKKioqIDI3OSwyODQgKioqKgotLS0g Mjc5LDI4OCAtLS0tCiAgICAgIDxjb21tYW5kPkFOQUxZWkU8Lz4gc3RyaWN0bHkgYXMgYSBm dW5jdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHJvd3MKICAgICAgaW5zZXJ0ZWQgb3IgdXBkYXRl ZDsgaXQgaGFzIG5vIGtub3dsZWRnZSBvZiB3aGV0aGVyIHRoYXQgd2lsbCBsZWFkCiAgICAg IHRvIG1lYW5pbmdmdWwgc3RhdGlzdGljYWwgY2hhbmdlcy4KKyAgICAgTm90ZSB0aGF0IHRo ZSBhdXRvdmFjdXVtIGRhZW1vbiBkb2VzIG5vdCBpc3N1ZSA8Y29tbWFuZD5BTkFMWVpFPC8+ CisgICAgIGNvbW1hbmRzIG9uIGZvcmVpZ24gdGFibGVzLiAgSXQgaXMgcmVjb21tZW5kZWQg dG8gcnVuIG1hbnVhbGx5LW1hbmFnZWQKKyAgICAgPGNvbW1hbmQ+QU5BTFlaRTwvPiBjb21t YW5kcyBhcyBuZWVkZWQsIHdoaWNoIHR5cGljYWxseSBhcmUgZXhlY3V0ZWQKKyAgICAgYWNj b3JkaW5nIHRvIGEgc2NoZWR1bGUgYnkgY3JvbiBvciBUYXNrIFNjaGVkdWxlciBzY3JpcHRz LgogICAgIDwvcGFyYT4KICAKICAgICA8cGFyYT4KKioqIGEvZG9jL3NyYy9zZ21sL3JlZi9h bHRlcl9mb3JlaWduX3RhYmxlLnNnbWwKLS0tIGIvZG9jL3NyYy9zZ21sL3JlZi9hbHRlcl9m b3JlaWduX3RhYmxlLnNnbWwKKioqKioqKioqKioqKioqCioqKiAzNiw0MSAqKioqIEFMVEVS IEZPUkVJR04gVEFCTEUgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPm5hbWU8L3Jl cGxhY2VhYmxlPgotLS0gMzYsNDQgLS0tLQogICAgICBEUk9QIFsgQ09MVU1OIF0gWyBJRiBF WElTVFMgXSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNl YWJsZT4gWyBSRVNUUklDVCB8IENBU0NBREUgXQogICAgICBBTFRFUiBbIENPTFVNTiBdIDxy ZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5jb2x1bW48L3JlcGxhY2VhYmxlPiBbIFNF VCBEQVRBIF0gVFlQRSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+dHlwZTwvcmVw bGFjZWFibGU+CiAgICAgIEFMVEVSIFsgQ09MVU1OIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQ QVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+IHsgU0VUIHwgRFJPUCB9IE5PVCBOVUxM CisgICAgIEFMVEVSIFsgQ09MVU1OIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIi PmNvbHVtbjwvcmVwbGFjZWFibGU+IFNFVCBTVEFUSVNUSUNTIDxyZXBsYWNlYWJsZSBjbGFz cz0iUEFSQU1FVEVSIj5pbnRlZ2VyPC9yZXBsYWNlYWJsZT4KKyAgICAgQUxURVIgWyBDT0xV TU4gXSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJs ZT4gU0VUICggPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmF0dHJpYnV0ZV9vcHRp b248L3JlcGxhY2VhYmxlPiA9IDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj52YWx1 ZTwvcmVwbGFjZWFibGU+IFssIC4uLiBdICkKKyAgICAgQUxURVIgWyBDT0xVTU4gXSA8cmVw bGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJsZT4gUkVTRVQg KCA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+YXR0cmlidXRlX29wdGlvbjwvcmVw bGFjZWFibGU+IFssIC4uLiBdICkKICAgICAgQUxURVIgWyBDT0xVTU4gXSA8cmVwbGFjZWFi bGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJsZT4gT1BUSU9OUyAoIFsg QUREIHwgU0VUIHwgRFJPUCBdIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5vcHRp b248L3JlcGxhY2VhYmxlPiBbJzxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj52YWx1 ZTwvcmVwbGFjZWFibGU+J10gWywgLi4uIF0pCiAgICAgIE9XTkVSIFRPIDxyZXBsYWNlYWJs ZSBjbGFzcz0iUEFSQU1FVEVSIj5uZXdfb3duZXI8L3JlcGxhY2VhYmxlPgogICAgICBPUFRJ T05TICggWyBBREQgfCBTRVQgfCBEUk9QIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVU RVIiPm9wdGlvbjwvcmVwbGFjZWFibGU+IFsnPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVU RVIiPnZhbHVlPC9yZXBsYWNlYWJsZT4nXSBbLCAuLi4gXSkKKioqKioqKioqKioqKioqCioq KiA5NCw5OSAqKioqIEFMVEVSIEZPUkVJR04gVEFCTEUgPHJlcGxhY2VhYmxlIGNsYXNzPSJQ QVJBTUVURVIiPm5hbWU8L3JlcGxhY2VhYmxlPgotLS0gOTcsMTQ2IC0tLS0KICAgICA8L3Zh cmxpc3RlbnRyeT4KICAKICAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVybT48bGl0ZXJh bD5TRVQgU1RBVElTVElDUzwvbGl0ZXJhbD48L3Rlcm0+CisgICAgIDxsaXN0aXRlbT4KKyAg ICAgIDxwYXJhPgorICAgICAgIFRoaXMgZm9ybQorICAgICAgIHNldHMgdGhlIHBlci1jb2x1 bW4gc3RhdGlzdGljcy1nYXRoZXJpbmcgdGFyZ2V0IGZvciBzdWJzZXF1ZW50CisgICAgICAg PHhyZWYgbGlua2VuZD0ic3FsLWFuYWx5emUiPiBvcGVyYXRpb25zLgorICAgICAgIFRoZSB0 YXJnZXQgY2FuIGJlIHNldCBpbiB0aGUgcmFuZ2UgMCB0byAxMDAwMDsgYWx0ZXJuYXRpdmVs eSwgc2V0IGl0CisgICAgICAgdG8gLTEgdG8gcmV2ZXJ0IHRvIHVzaW5nIHRoZSBzeXN0ZW0g ZGVmYXVsdCBzdGF0aXN0aWNzCisgICAgICAgdGFyZ2V0ICg8eHJlZiBsaW5rZW5kPSJndWMt ZGVmYXVsdC1zdGF0aXN0aWNzLXRhcmdldCI+KS4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9s aXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4KKyAKKyAgICA8dmFybGlzdGVudHJ5Pgor ICAgICA8dGVybT48bGl0ZXJhbD5TRVQgKCA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRF UiI+YXR0cmlidXRlX29wdGlvbjwvcmVwbGFjZWFibGU+ID0gPHJlcGxhY2VhYmxlIGNsYXNz PSJQQVJBTUVURVIiPnZhbHVlPC9yZXBsYWNlYWJsZT4gWywgLi4uIF0gKTwvbGl0ZXJhbD48 L3Rlcm0+CisgICAgIDx0ZXJtPjxsaXRlcmFsPlJFU0VUICggPHJlcGxhY2VhYmxlIGNsYXNz PSJQQVJBTUVURVIiPmF0dHJpYnV0ZV9vcHRpb248L3JlcGxhY2VhYmxlPiBbLCAuLi4gXSAp PC9saXRlcmFsPjwvdGVybT4KKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAg ICAgVGhpcyBmb3JtCisgICAgICAgc2V0cyBvciByZXNldHMgYSBwZXItYXR0cmlidXRlIG9w dGlvbi4gIEN1cnJlbnRseSwgdGhlIG9ubHkgZGVmaW5lZAorICAgICAgIHBlci1hdHRyaWJ1 dGUgb3B0aW9uIGlzIDxsaXRlcmFsPm5fZGlzdGluY3Q8Lz4sIHdoaWNoIG92ZXJyaWRlcwor ICAgICAgIHRoZSBudW1iZXItb2YtZGlzdGluY3QtdmFsdWVzIGVzdGltYXRlcyBtYWRlIGJ5 IHN1YnNlcXVlbnQKKyAgICAgICA8eHJlZiBsaW5rZW5kPSJzcWwtYW5hbHl6ZSI+IG9wZXJh dGlvbnMuIAorICAgICAgIFdoZW4gc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUsIDxjb21tYW5k PkFOQUxZWkU8Lz4gd2lsbCBhc3N1bWUgdGhhdAorICAgICAgIHRoZSBjb2x1bW4gY29udGFp bnMgZXhhY3RseSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkaXN0aW5jdCBub25udWxsCisg ICAgICAgdmFsdWVzLgorICAgICAgIFdoZW4gc2V0IHRvIGEgbmVnYXRpdmUgdmFsdWUsIHdo aWNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgICAgdG8gLTEsIDxjb21t YW5kPkFOQUxZWkU8Lz4gd2lsbCBhc3N1bWUgdGhhdCB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0 CisgICAgICAgbm9ubnVsbCB2YWx1ZXMgaW4gdGhlIGNvbHVtbiBpcyBsaW5lYXIgaW4gdGhl IHNpemUgb2YgdGhlIGZvcmVpZ24KKyAgICAgICB0YWJsZTsgdGhlIGV4YWN0IGNvdW50IGlz IHRvIGJlIGNvbXB1dGVkIGJ5IG11bHRpcGx5aW5nIHRoZSBlc3RpbWF0ZWQKKyAgICAgICBm b3JlaWduIHRhYmxlIHNpemUgYnkgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBnaXZlbiBu dW1iZXIuCisgICAgICAgRm9yIGV4YW1wbGUsCisgICAgICAgYSB2YWx1ZSBvZiAtMSBpbXBs aWVzIHRoYXQgYWxsIHZhbHVlcyBpbiB0aGUgY29sdW1uIGFyZSBkaXN0aW5jdCwKKyAgICAg ICB3aGlsZSBhIHZhbHVlIG9mIC0wLjUgaW1wbGllcyB0aGF0IGVhY2ggdmFsdWUgYXBwZWFy cyB0d2ljZSBvbiB0aGUKKyAgICAgICBhdmVyYWdlLgorICAgICAgIFRoaXMgY2FuIGJlIHVz ZWZ1bCB3aGVuIHRoZSBzaXplIG9mIHRoZSBmb3JlaWduIHRhYmxlIGNoYW5nZXMgb3Zlcgor ICAgICAgIHRpbWUsIHNpbmNlIHRoZSBtdWx0aXBsaWNhdGlvbiBieSB0aGUgbnVtYmVyIG9m IHJvd3MgaW4gdGhlIGZvcmVpZ24KKyAgICAgICB0YWJsZSBpcyBub3QgcGVyZm9ybWVkIHVu dGlsIHF1ZXJ5IHBsYW5uaW5nIHRpbWUuICBTcGVjaWZ5IGEgdmFsdWUKKyAgICAgICBvZiAw IHRvIHJldmVydCB0byBlc3RpbWF0aW5nIHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVz IG5vcm1hbGx5LgorICAgICAgPC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgorICAgIDwvdmFy bGlzdGVudHJ5PgorIAorICAgIDx2YXJsaXN0ZW50cnk+CiAgICAgIDx0ZXJtPjxsaXRlcmFs Pk9XTkVSPC9saXRlcmFsPjwvdGVybT4KICAgICAgPGxpc3RpdGVtPgogICAgICAgPHBhcmE+ CioqKiBhL2RvYy9zcmMvc2dtbC9yZWYvYW5hbHl6ZS5zZ21sCi0tLSBiL2RvYy9zcmMvc2dt bC9yZWYvYW5hbHl6ZS5zZ21sCioqKioqKioqKioqKioqKgoqKiogMzksNDcgKioqKiBBTkFM WVpFIFsgVkVSQk9TRSBdIFsgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPnRhYmxl PC9yZXBsYWNlYWJsZT4gWyAoIDxyZQogIAogICAgPHBhcmE+CiAgICAgV2l0aCBubyBwYXJh bWV0ZXIsIDxjb21tYW5kPkFOQUxZWkU8L2NvbW1hbmQ+IGV4YW1pbmVzIGV2ZXJ5IHRhYmxl IGluIHRoZQohICAgIGN1cnJlbnQgZGF0YWJhc2UuICBXaXRoIGEgcGFyYW1ldGVyLCA8Y29t bWFuZD5BTkFMWVpFPC9jb21tYW5kPiBleGFtaW5lcwohICAgIG9ubHkgdGhhdCB0YWJsZS4g IEl0IGlzIGZ1cnRoZXIgcG9zc2libGUgdG8gZ2l2ZSBhIGxpc3Qgb2YgY29sdW1uIG5hbWVz LAohICAgIGluIHdoaWNoIGNhc2Ugb25seSB0aGUgc3RhdGlzdGljcyBmb3IgdGhvc2UgY29s dW1ucyBhcmUgY29sbGVjdGVkLgogICAgPC9wYXJhPgogICA8L3JlZnNlY3QxPgogIAotLS0g MzksNDggLS0tLQogIAogICAgPHBhcmE+CiAgICAgV2l0aCBubyBwYXJhbWV0ZXIsIDxjb21t YW5kPkFOQUxZWkU8L2NvbW1hbmQ+IGV4YW1pbmVzIGV2ZXJ5IHRhYmxlIGluIHRoZQohICAg IGN1cnJlbnQgZGF0YWJhc2UgZXhjZXB0IGZvciBmb3JlaWduIHRhYmxlcy4gIFdpdGggYSBw YXJhbWV0ZXIsIDxjb21tYW5kPgohICAgIEFOQUxZWkU8L2NvbW1hbmQ+IGV4YW1pbmVzIG9u bHkgdGhhdCB0YWJsZS4gIEl0IGlzIGZ1cnRoZXIgcG9zc2libGUgdG8gCiEgICAgZ2l2ZSBh IGxpc3Qgb2YgY29sdW1uIG5hbWVzLCBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIHN0YXRpc3Rp Y3MgZm9yIHRob3NlCiEgICAgY29sdW1ucyBhcmUgY29sbGVjdGVkLgogICAgPC9wYXJhPgog ICA8L3JlZnNlY3QxPgogIAoqKioqKioqKioqKioqKioKKioqIDYzLDY5ICoqKiogQU5BTFla RSBbIFZFUkJPU0UgXSBbIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj50YWJsZTwv cmVwbGFjZWFibGU+IFsgKCA8cmUKICAgICAgPGxpc3RpdGVtPgogICAgICAgPHBhcmE+CiAg ICAgICAgVGhlIG5hbWUgKHBvc3NpYmx5IHNjaGVtYS1xdWFsaWZpZWQpIG9mIGEgc3BlY2lm aWMgdGFibGUgdG8KISAgICAgICBhbmFseXplLiBEZWZhdWx0cyB0byBhbGwgdGFibGVzIGlu IHRoZSBjdXJyZW50IGRhdGFiYXNlLgogICAgICAgPC9wYXJhPgogICAgICA8L2xpc3RpdGVt PgogICAgIDwvdmFybGlzdGVudHJ5PgotLS0gNjQsNzEgLS0tLQogICAgICA8bGlzdGl0ZW0+ CiAgICAgICA8cGFyYT4KICAgICAgICBUaGUgbmFtZSAocG9zc2libHkgc2NoZW1hLXF1YWxp ZmllZCkgb2YgYSBzcGVjaWZpYyB0YWJsZSB0bwohICAgICAgIGFuYWx5emUuIERlZmF1bHRz IHRvIGFsbCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UgZXhjZXB0CiEgICAgICAg Zm9yIGZvcmVpZ24gdGFibGVzLgogICAgICAgPC9wYXJhPgogICAgICA8L2xpc3RpdGVtPgog ICAgIDwvdmFybGlzdGVudHJ5PgoqKioqKioqKioqKioqKioKKioqIDEzNywxNDMgKioqKiBB TkFMWVpFIFsgVkVSQk9TRSBdIFsgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPnRh YmxlPC9yZXBsYWNlYWJsZT4gWyAoIDxyZQogICAgIEluIHJhcmUgc2l0dWF0aW9ucywgdGhp cyBub24tZGV0ZXJtaW5pc20gd2lsbCBjYXVzZSB0aGUgcGxhbm5lcidzCiAgICAgY2hvaWNl cyBvZiBxdWVyeSBwbGFucyB0byBjaGFuZ2UgYWZ0ZXIgPGNvbW1hbmQ+QU5BTFlaRTwvY29t bWFuZD4gaXMgcnVuLgogICAgIFRvIGF2b2lkIHRoaXMsIHJhaXNlIHRoZSBhbW91bnQgb2Yg c3RhdGlzdGljcyBjb2xsZWN0ZWQgYnkKISAgICA8Y29tbWFuZD5BTkFMWVpFPC9jb21tYW5k PiwgYXMgZGVzY3JpYmVkIGJlbG93LgogICAgPC9wYXJhPgogIAogICAgPHBhcmE+Ci0tLSAx MzksMTQ3IC0tLS0KICAgICBJbiByYXJlIHNpdHVhdGlvbnMsIHRoaXMgbm9uLWRldGVybWlu aXNtIHdpbGwgY2F1c2UgdGhlIHBsYW5uZXIncwogICAgIGNob2ljZXMgb2YgcXVlcnkgcGxh bnMgdG8gY2hhbmdlIGFmdGVyIDxjb21tYW5kPkFOQUxZWkU8L2NvbW1hbmQ+IGlzIHJ1bi4K ICAgICBUbyBhdm9pZCB0aGlzLCByYWlzZSB0aGUgYW1vdW50IG9mIHN0YXRpc3RpY3MgY29s bGVjdGVkIGJ5CiEgICAgPGNvbW1hbmQ+QU5BTFlaRTwvY29tbWFuZD4sIGFzIGRlc2NyaWJl ZCBiZWxvdy4gIE5vdGUgdGhhdCB0aGUgdGltZQohICAgIG5lZWRlZCB0byBhbmFseXplIG9u IGZvcmVpZ24gdGFibGVzIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mCiEgICAg dGhlIGZvcmVpZ24gZGF0YSB3cmFwcGVyIHZpYSB3aGljaCBzdWNoIHRhYmxlcyBhcmUgYXR0 YWNoZWQuCiAgICA8L3BhcmE+CiAgCiAgICA8cGFyYT4KKioqIGEvc3JjL2JhY2tlbmQvY29t bWFuZHMvYW5hbHl6ZS5jCi0tLSBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FuYWx5emUuYwoq KioqKioqKioqKioqKioKKioqIDIzLDI4ICoqKioKLS0tIDIzLDI5IC0tLS0KICAjaW5jbHVk ZSAiYWNjZXNzL3hhY3QuaCIKICAjaW5jbHVkZSAiY2F0YWxvZy9pbmRleC5oIgogICNpbmNs dWRlICJjYXRhbG9nL2luZGV4aW5nLmgiCisgI2luY2x1ZGUgImNhdGFsb2cvcGdfY2xhc3Mu aCIKICAjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb2xsYXRpb24uaCIKICAjaW5jbHVkZSAiY2F0 YWxvZy9wZ19pbmhlcml0c19mbi5oIgogICNpbmNsdWRlICJjYXRhbG9nL3BnX25hbWVzcGFj ZS5oIgoqKioqKioqKioqKioqKioKKioqIDMwLDM1ICoqKioKLS0tIDMxLDM4IC0tLS0KICAj aW5jbHVkZSAiY29tbWFuZHMvdGFibGVjbWRzLmgiCiAgI2luY2x1ZGUgImNvbW1hbmRzL3Zh Y3V1bS5oIgogICNpbmNsdWRlICJleGVjdXRvci9leGVjdXRvci5oIgorICNpbmNsdWRlICJm b3JlaWduL2ZvcmVpZ24uaCIKKyAjaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKICAjaW5j bHVkZSAibWlzY2FkbWluLmgiCiAgI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgogICNp bmNsdWRlICJwYXJzZXIvcGFyc2Vfb3Blci5oIgoqKioqKioqKioqKioqKioKKioqIDk0LDEx MyAqKioqIHN0YXRpYyB2b2lkIGNvbXB1dGVfaW5kZXhfc3RhdHMoUmVsYXRpb24gb25lcmVs LCBkb3VibGUgdG90YWxyb3dzLAogIAkJCQkJQW5sSW5kZXhEYXRhICppbmRleGRhdGEsIGlu dCBuaW5kZXhlcywKICAJCQkJCUhlYXBUdXBsZSAqcm93cywgaW50IG51bXJvd3MsCiAgCQkJ CQlNZW1vcnlDb250ZXh0IGNvbF9jb250ZXh0KTsKLSBzdGF0aWMgVmFjQXR0clN0YXRzICpl eGFtaW5lX2F0dHJpYnV0ZShSZWxhdGlvbiBvbmVyZWwsIGludCBhdHRudW0sCi0gCQkJCSAg Tm9kZSAqaW5kZXhfZXhwcik7CiAgc3RhdGljIGludCBhY3F1aXJlX3NhbXBsZV9yb3dzKFJl bGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLAogIAkJCQkJaW50IHRhcmdyb3dzLCBk b3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzKTsKLSBzdGF0aWMgZG91 YmxlIHJhbmRvbV9mcmFjdCh2b2lkKTsKLSBzdGF0aWMgZG91YmxlIGluaXRfc2VsZWN0aW9u X3N0YXRlKGludCBuKTsKLSBzdGF0aWMgZG91YmxlIGdldF9uZXh0X1MoZG91YmxlIHQsIGlu dCBuLCBkb3VibGUgKnN0YXRlcHRyKTsKLSBzdGF0aWMgaW50CWNvbXBhcmVfcm93cyhjb25z dCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKICBzdGF0aWMgaW50IGFjcXVpcmVfaW5oZXJp dGVkX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwKICAJCQkJCQkJICBIZWFwVHVwbGUg KnJvd3MsIGludCB0YXJncm93cywKICAJCQkJCQkJICBkb3VibGUgKnRvdGFscm93cywgZG91 YmxlICp0b3RhbGRlYWRyb3dzKTsKLSBzdGF0aWMgdm9pZCB1cGRhdGVfYXR0c3RhdHMoT2lk IHJlbGlkLCBib29sIGluaCwKLSAJCQkJaW50IG5hdHRzLCBWYWNBdHRyU3RhdHMgKip2YWNh dHRyc3RhdHMpOwotIHN0YXRpYyBEYXR1bSBzdGRfZmV0Y2hfZnVuYyhWYWNBdHRyU3RhdHNQ IHN0YXRzLCBpbnQgcm93bnVtLCBib29sICppc051bGwpOwogIHN0YXRpYyBEYXR1bSBpbmRf ZmV0Y2hfZnVuYyhWYWNBdHRyU3RhdHNQIHN0YXRzLCBpbnQgcm93bnVtLCBib29sICppc051 bGwpOwogIAogIHN0YXRpYyBib29sIHN0ZF90eXBhbmFseXplKFZhY0F0dHJTdGF0cyAqc3Rh dHMpOwotLS0gOTcsMTA3IC0tLS0KKioqKioqKioqKioqKioqCioqKiAxODQsMTkzICoqKiog YW5hbHl6ZV9yZWwoT2lkIHJlbGlkLCBWYWN1dW1TdG10ICp2YWNzdG10LCBCdWZmZXJBY2Nl c3NTdHJhdGVneSBic3RyYXRlZ3kpCiAgCX0KICAKICAJLyoKISAJICogQ2hlY2sgdGhhdCBp dCdzIGEgcGxhaW4gdGFibGU7IHdlIHVzZWQgdG8gZG8gdGhpcyBpbiBnZXRfcmVsX29pZHMo KSBidXQKISAJICogc2VlbXMgc2FmZXIgdG8gY2hlY2sgYWZ0ZXIgd2UndmUgbG9ja2VkIHRo ZSByZWxhdGlvbi4KICAJICovCiEgCWlmIChvbmVyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBS RUxLSU5EX1JFTEFUSU9OKQogIAl7CiAgCQkvKiBObyBuZWVkIGZvciBhIFdBUk5JTkcgaWYg d2UgYWxyZWFkeSBjb21wbGFpbmVkIGR1cmluZyBWQUNVVU0gKi8KICAJCWlmICghKHZhY3N0 bXQtPm9wdGlvbnMgJiBWQUNPUFRfVkFDVVVNKSkKLS0tIDE3OCwxODggLS0tLQogIAl9CiAg CiAgCS8qCiEgCSAqIENoZWNrIHRoYXQgaXQncyBhIHBsYWluIHRhYmxlIG9yIGZvcmVpZ24g dGFibGU7IHdlIHVzZWQgdG8gZG8gdGhpcyBpbgohIAkgKiBnZXRfcmVsX29pZHMoKSBidXQg c2VlbXMgc2FmZXIgdG8gY2hlY2sgYWZ0ZXIgd2UndmUgbG9ja2VkIHRoZSByZWxhdGlvbi4K ICAJICovCiEgCWlmICghKG9uZXJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfUkVM QVRJT04gfHwKISAJCW9uZXJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfRk9SRUlH Tl9UQUJMRSkpCiAgCXsKICAJCS8qIE5vIG5lZWQgZm9yIGEgV0FSTklORyBpZiB3ZSBhbHJl YWR5IGNvbXBsYWluZWQgZHVyaW5nIFZBQ1VVTSAqLwogIAkJaWYgKCEodmFjc3RtdC0+b3B0 aW9ucyAmIFZBQ09QVF9WQUNVVU0pKQoqKioqKioqKioqKioqKioKKioqIDIyNiwyNDEgKioq KiBhbmFseXplX3JlbChPaWQgcmVsaWQsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIEJ1ZmZlckFj Y2Vzc1N0cmF0ZWd5IGJzdHJhdGVneSkKICAJTXlQcm9jLT52YWN1dW1GbGFncyB8PSBQUk9D X0lOX0FOQUxZWkU7CiAgCUxXTG9ja1JlbGVhc2UoUHJvY0FycmF5TG9jayk7CiAgCiEgCS8q CiEgCSAqIERvIHRoZSBub3JtYWwgbm9uLXJlY3Vyc2l2ZSBBTkFMWVpFLgohIAkgKi8KISAJ ZG9fYW5hbHl6ZV9yZWwob25lcmVsLCB2YWNzdG10LCBmYWxzZSk7CiAgCiEgCS8qCiEgCSAq IElmIHRoZXJlIGFyZSBjaGlsZCB0YWJsZXMsIGRvIHJlY3Vyc2l2ZSBBTkFMWVpFLgohIAkg Ki8KISAJaWYgKG9uZXJlbC0+cmRfcmVsLT5yZWxoYXNzdWJjbGFzcykKISAJCWRvX2FuYWx5 emVfcmVsKG9uZXJlbCwgdmFjc3RtdCwgdHJ1ZSk7CiAgCiAgCS8qCiAgCSAqIENsb3NlIHNv dXJjZSByZWxhdGlvbiBub3csIGJ1dCBrZWVwIGxvY2sgc28gdGhhdCBubyBvbmUgZGVsZXRl cyBpdAotLS0gMjIxLDI1MSAtLS0tCiAgCU15UHJvYy0+dmFjdXVtRmxhZ3MgfD0gUFJPQ19J Tl9BTkFMWVpFOwogIAlMV0xvY2tSZWxlYXNlKFByb2NBcnJheUxvY2spOwogIAohIAlpZiAo b25lcmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9GT1JFSUdOX1RBQkxFKQohIAl7 CiEgCQlGZHdSb3V0aW5lCQkgICAqZmR3cm91dGluZTsKICAKISAJCWVyZXBvcnQoZWxldmVs LAohIAkJCQkoZXJybXNnKCJhbmFseXppbmcgXCIlcy4lc1wiIiwKISAJCQkJCQlnZXRfbmFt ZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2Uob25lcmVsKSksCiEgCQkJCQkJUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsKISAKISAJCWZkd3JvdXRpbmUgPSBH ZXRGZHdSb3V0aW5lQnlSZWxJZChSZWxhdGlvbkdldFJlbGlkKG9uZXJlbCkpOwohIAkJZmR3 cm91dGluZS0+QW5hbHl6ZUZvcmVpZ25UYWJsZShvbmVyZWwsIHZhY3N0bXQsIGVsZXZlbCk7 CiEgCX0KISAJZWxzZQohIAl7CiEgCQkvKgohIAkJICogRG8gdGhlIG5vcm1hbCBub24tcmVj dXJzaXZlIEFOQUxZWkUuCiEgCQkgKi8KISAJCWRvX2FuYWx5emVfcmVsKG9uZXJlbCwgdmFj c3RtdCwgZmFsc2UpOwohIAohIAkJLyoKISAJCSAqIElmIHRoZXJlIGFyZSBjaGlsZCB0YWJs ZXMsIGRvIHJlY3Vyc2l2ZSBBTkFMWVpFLgohIAkJICovCiEgCQlpZiAob25lcmVsLT5yZF9y ZWwtPnJlbGhhc3N1YmNsYXNzKQohIAkJCWRvX2FuYWx5emVfcmVsKG9uZXJlbCwgdmFjc3Rt dCwgdHJ1ZSk7CiEgCX0KICAKICAJLyoKICAJICogQ2xvc2Ugc291cmNlIHJlbGF0aW9uIG5v dywgYnV0IGtlZXAgbG9jayBzbyB0aGF0IG5vIG9uZSBkZWxldGVzIGl0CioqKioqKioqKioq KioqKgoqKiogMzQzLDM0OSAqKioqIGRvX2FuYWx5emVfcmVsKFJlbGF0aW9uIG9uZXJlbCwg VmFjdXVtU3RtdCAqdmFjc3RtdCwgYm9vbCBpbmgpCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09E RV9VTkRFRklORURfQ09MVU1OKSwKICAJCQkJCWVycm1zZygiY29sdW1uIFwiJXNcIiBvZiBy ZWxhdGlvbiBcIiVzXCIgZG9lcyBub3QgZXhpc3QiLAogIAkJCQkJCSAgIGNvbCwgUmVsYXRp b25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsKISAJCQl2YWNhdHRyc3RhdHNbdGNudF0g PSBleGFtaW5lX2F0dHJpYnV0ZShvbmVyZWwsIGksIE5VTEwpOwogIAkJCWlmICh2YWNhdHRy c3RhdHNbdGNudF0gIT0gTlVMTCkKICAJCQkJdGNudCsrOwogIAkJfQotLS0gMzUzLDM1OSAt LS0tCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfQ09MVU1OKSwKICAJCQkJ CWVycm1zZygiY29sdW1uIFwiJXNcIiBvZiByZWxhdGlvbiBcIiVzXCIgZG9lcyBub3QgZXhp c3QiLAogIAkJCQkJCSAgIGNvbCwgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkp KTsKISAJCQl2YWNhdHRyc3RhdHNbdGNudF0gPSBleGFtaW5lX2F0dHJpYnV0ZShvbmVyZWws IGksIE5VTEwsIGFubF9jb250ZXh0KTsKICAJCQlpZiAodmFjYXR0cnN0YXRzW3RjbnRdICE9 IE5VTEwpCiAgCQkJCXRjbnQrKzsKICAJCX0KKioqKioqKioqKioqKioqCioqKiAzNTcsMzYz ICoqKiogZG9fYW5hbHl6ZV9yZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNz dG10LCBib29sIGluaCkKICAJCXRjbnQgPSAwOwogIAkJZm9yIChpID0gMTsgaSA8PSBhdHRy X2NudDsgaSsrKQogIAkJewohIAkJCXZhY2F0dHJzdGF0c1t0Y250XSA9IGV4YW1pbmVfYXR0 cmlidXRlKG9uZXJlbCwgaSwgTlVMTCk7CiAgCQkJaWYgKHZhY2F0dHJzdGF0c1t0Y250XSAh PSBOVUxMKQogIAkJCQl0Y250Kys7CiAgCQl9Ci0tLSAzNjcsMzczIC0tLS0KICAJCXRjbnQg PSAwOwogIAkJZm9yIChpID0gMTsgaSA8PSBhdHRyX2NudDsgaSsrKQogIAkJewohIAkJCXZh Y2F0dHJzdGF0c1t0Y250XSA9IGV4YW1pbmVfYXR0cmlidXRlKG9uZXJlbCwgaSwgTlVMTCwg YW5sX2NvbnRleHQpOwogIAkJCWlmICh2YWNhdHRyc3RhdHNbdGNudF0gIT0gTlVMTCkKICAJ CQkJdGNudCsrOwogIAkJfQoqKioqKioqKioqKioqKioKKioqIDQxMSw0MTcgKioqKiBkb19h bmFseXplX3JlbChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIGJvb2wg aW5oKQogIAkJCQkJCWluZGV4a2V5ID0gKE5vZGUgKikgbGZpcnN0KGluZGV4cHJfaXRlbSk7 CiAgCQkJCQkJaW5kZXhwcl9pdGVtID0gbG5leHQoaW5kZXhwcl9pdGVtKTsKICAJCQkJCQl0 aGlzZGF0YS0+dmFjYXR0cnN0YXRzW3RjbnRdID0KISAJCQkJCQkJZXhhbWluZV9hdHRyaWJ1 dGUoSXJlbFtpbmRdLCBpICsgMSwgaW5kZXhrZXkpOwogIAkJCQkJCWlmICh0aGlzZGF0YS0+ dmFjYXR0cnN0YXRzW3RjbnRdICE9IE5VTEwpCiAgCQkJCQkJCXRjbnQrKzsKICAJCQkJCX0K LS0tIDQyMSw0MjcgLS0tLQogIAkJCQkJCWluZGV4a2V5ID0gKE5vZGUgKikgbGZpcnN0KGlu ZGV4cHJfaXRlbSk7CiAgCQkJCQkJaW5kZXhwcl9pdGVtID0gbG5leHQoaW5kZXhwcl9pdGVt KTsKICAJCQkJCQl0aGlzZGF0YS0+dmFjYXR0cnN0YXRzW3RjbnRdID0KISAJCQkJCQkJZXhh bWluZV9hdHRyaWJ1dGUoSXJlbFtpbmRdLCBpICsgMSwgaW5kZXhrZXksIGFubF9jb250ZXh0 KTsKICAJCQkJCQlpZiAodGhpc2RhdGEtPnZhY2F0dHJzdGF0c1t0Y250XSAhPSBOVUxMKQog IAkJCQkJCQl0Y250Kys7CiAgCQkJCQl9CioqKioqKioqKioqKioqKgoqKiogODA3LDgxNCAq KioqIGNvbXB1dGVfaW5kZXhfc3RhdHMoUmVsYXRpb24gb25lcmVsLCBkb3VibGUgdG90YWxy b3dzLAogICAqIElmIGluZGV4X2V4cHIgaXNuJ3QgTlVMTCwgdGhlbiB3ZSdyZSB0cnlpbmcg dG8gYW5hbHl6ZSBhbiBleHByZXNzaW9uIGluZGV4LAogICAqIGFuZCBpbmRleF9leHByIGlz IHRoZSBleHByZXNzaW9uIHRyZWUgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4ncyBkYXRhLgog ICAqLwohIHN0YXRpYyBWYWNBdHRyU3RhdHMgKgohIGV4YW1pbmVfYXR0cmlidXRlKFJlbGF0 aW9uIG9uZXJlbCwgaW50IGF0dG51bSwgTm9kZSAqaW5kZXhfZXhwcikKICB7CiAgCUZvcm1f cGdfYXR0cmlidXRlIGF0dHIgPSBvbmVyZWwtPnJkX2F0dC0+YXR0cnNbYXR0bnVtIC0gMV07 CiAgCUhlYXBUdXBsZQl0eXB0dXBsZTsKLS0tIDgxNyw4MjQgLS0tLQogICAqIElmIGluZGV4 X2V4cHIgaXNuJ3QgTlVMTCwgdGhlbiB3ZSdyZSB0cnlpbmcgdG8gYW5hbHl6ZSBhbiBleHBy ZXNzaW9uIGluZGV4LAogICAqIGFuZCBpbmRleF9leHByIGlzIHRoZSBleHByZXNzaW9uIHRy ZWUgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4ncyBkYXRhLgogICAqLwohIFZhY0F0dHJTdGF0 cyAqCiEgZXhhbWluZV9hdHRyaWJ1dGUoUmVsYXRpb24gb25lcmVsLCBpbnQgYXR0bnVtLCBO b2RlICppbmRleF9leHByLCBNZW1vcnlDb250ZXh0IGFubF9jb250ZXh0KQogIHsKICAJRm9y bV9wZ19hdHRyaWJ1dGUgYXR0ciA9IG9uZXJlbC0+cmRfYXR0LT5hdHRyc1thdHRudW0gLSAx XTsKICAJSGVhcFR1cGxlCXR5cHR1cGxlOwoqKioqKioqKioqKioqKioKKioqIDEyNTQsMTI2 MCAqKioqIGFjcXVpcmVfc2FtcGxlX3Jvd3MoUmVsYXRpb24gb25lcmVsLCBIZWFwVHVwbGUg KnJvd3MsIGludCB0YXJncm93cywKICB9CiAgCiAgLyogU2VsZWN0IGEgcmFuZG9tIHZhbHVl IFIgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGluICgwIC0gMSkgKi8KISBzdGF0aWMgZG91Ymxl CiAgcmFuZG9tX2ZyYWN0KHZvaWQpCiAgewogIAlyZXR1cm4gKChkb3VibGUpIHJhbmRvbSgp ICsgMSkgLyAoKGRvdWJsZSkgTUFYX1JBTkRPTV9WQUxVRSArIDIpOwotLS0gMTI2NCwxMjcw IC0tLS0KICB9CiAgCiAgLyogU2VsZWN0IGEgcmFuZG9tIHZhbHVlIFIgdW5pZm9ybWx5IGRp c3RyaWJ1dGVkIGluICgwIC0gMSkgKi8KISBkb3VibGUKICByYW5kb21fZnJhY3Qodm9pZCkK ICB7CiAgCXJldHVybiAoKGRvdWJsZSkgcmFuZG9tKCkgKyAxKSAvICgoZG91YmxlKSBNQVhf UkFORE9NX1ZBTFVFICsgMik7CioqKioqKioqKioqKioqKgoqKiogMTI3NCwxMjg3ICoqKiog cmFuZG9tX2ZyYWN0KHZvaWQpCiAgICogZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJlY29y ZHMgdG8gc2tpcCBiZWZvcmUgdGhlIG5leHQgcmVjb3JkIGlzCiAgICogcHJvY2Vzc2VkLgog ICAqLwohIHN0YXRpYyBkb3VibGUKICBpbml0X3NlbGVjdGlvbl9zdGF0ZShpbnQgbikKICB7 CiAgCS8qIEluaXRpYWwgdmFsdWUgb2YgVyAoZm9yIHVzZSB3aGVuIEFsZ29yaXRobSBaIGlz IGZpcnN0IGFwcGxpZWQpICovCiAgCXJldHVybiBleHAoLWxvZyhyYW5kb21fZnJhY3QoKSkg LyBuKTsKICB9CiAgCiEgc3RhdGljIGRvdWJsZQogIGdldF9uZXh0X1MoZG91YmxlIHQsIGlu dCBuLCBkb3VibGUgKnN0YXRlcHRyKQogIHsKICAJZG91YmxlCQlTOwotLS0gMTI4NCwxMjk3 IC0tLS0KICAgKiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcmVjb3JkcyB0byBza2lwIGJl Zm9yZSB0aGUgbmV4dCByZWNvcmQgaXMKICAgKiBwcm9jZXNzZWQuCiAgICovCiEgZG91Ymxl CiAgaW5pdF9zZWxlY3Rpb25fc3RhdGUoaW50IG4pCiAgewogIAkvKiBJbml0aWFsIHZhbHVl IG9mIFcgKGZvciB1c2Ugd2hlbiBBbGdvcml0aG0gWiBpcyBmaXJzdCBhcHBsaWVkKSAqLwog IAlyZXR1cm4gZXhwKC1sb2cocmFuZG9tX2ZyYWN0KCkpIC8gbik7CiAgfQogIAohIGRvdWJs ZQogIGdldF9uZXh0X1MoZG91YmxlIHQsIGludCBuLCBkb3VibGUgKnN0YXRlcHRyKQogIHsK ICAJZG91YmxlCQlTOwoqKioqKioqKioqKioqKioKKioqIDEzNjYsMTM3MiAqKioqIGdldF9u ZXh0X1MoZG91YmxlIHQsIGludCBuLCBkb3VibGUgKnN0YXRlcHRyKQogIC8qCiAgICogcXNv cnQgY29tcGFyYXRvciBmb3Igc29ydGluZyByb3dzW10gYXJyYXkKICAgKi8KISBzdGF0aWMg aW50CiAgY29tcGFyZV9yb3dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCiAgewog IAlIZWFwVHVwbGUJaGEgPSAqKGNvbnN0IEhlYXBUdXBsZSAqKSBhOwotLS0gMTM3NiwxMzgy IC0tLS0KICAvKgogICAqIHFzb3J0IGNvbXBhcmF0b3IgZm9yIHNvcnRpbmcgcm93c1tdIGFy cmF5CiAgICovCiEgaW50CiAgY29tcGFyZV9yb3dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZv aWQgKmIpCiAgewogIAlIZWFwVHVwbGUJaGEgPSAqKGNvbnN0IEhlYXBUdXBsZSAqKSBhOwoq KioqKioqKioqKioqKioKKioqIDE1NjEsMTU2NyAqKioqIGFjcXVpcmVfaW5oZXJpdGVkX3Nh bXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jv d3MsCiAgICoJCUFOQUxZWkUgdGhlIHNhbWUgdGFibGUgY29uY3VycmVudGx5LiAgUHJlc2Vu dGx5LCB3ZSBsb2NrIHRoYXQgb3V0CiAgICoJCWJ5IHRha2luZyBhIHNlbGYtZXhjbHVzaXZl IGxvY2sgb24gdGhlIHJlbGF0aW9uIGluIGFuYWx5emVfcmVsKCkuCiAgICovCiEgc3RhdGlj IHZvaWQKICB1cGRhdGVfYXR0c3RhdHMoT2lkIHJlbGlkLCBib29sIGluaCwgaW50IG5hdHRz LCBWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHMpCiAgewogIAlSZWxhdGlvbglzZDsKLS0t IDE1NzEsMTU3NyAtLS0tCiAgICoJCUFOQUxZWkUgdGhlIHNhbWUgdGFibGUgY29uY3VycmVu dGx5LiAgUHJlc2VudGx5LCB3ZSBsb2NrIHRoYXQgb3V0CiAgICoJCWJ5IHRha2luZyBhIHNl bGYtZXhjbHVzaXZlIGxvY2sgb24gdGhlIHJlbGF0aW9uIGluIGFuYWx5emVfcmVsKCkuCiAg ICovCiEgdm9pZAogIHVwZGF0ZV9hdHRzdGF0cyhPaWQgcmVsaWQsIGJvb2wgaW5oLCBpbnQg bmF0dHMsIFZhY0F0dHJTdGF0cyAqKnZhY2F0dHJzdGF0cykKICB7CiAgCVJlbGF0aW9uCXNk OwoqKioqKioqKioqKioqKioKKioqIDE2OTgsMTcwNCAqKioqIHVwZGF0ZV9hdHRzdGF0cyhP aWQgcmVsaWQsIGJvb2wgaW5oLCBpbnQgbmF0dHMsIFZhY0F0dHJTdGF0cyAqKnZhY2F0dHJz dGF0cykKICAgKiBUaGlzIGV4aXN0cyB0byBwcm92aWRlIHNvbWUgaW5zdWxhdGlvbiBiZXR3 ZWVuIGNvbXB1dGVfc3RhdHMgcm91dGluZXMKICAgKiBhbmQgdGhlIGFjdHVhbCBzdG9yYWdl IG9mIHRoZSBzYW1wbGUgZGF0YS4KICAgKi8KISBzdGF0aWMgRGF0dW0KICBzdGRfZmV0Y2hf ZnVuYyhWYWNBdHRyU3RhdHNQIHN0YXRzLCBpbnQgcm93bnVtLCBib29sICppc051bGwpCiAg ewogIAlpbnQJCQlhdHRudW0gPSBzdGF0cy0+dHVwYXR0bnVtOwotLS0gMTcwOCwxNzE0IC0t LS0KICAgKiBUaGlzIGV4aXN0cyB0byBwcm92aWRlIHNvbWUgaW5zdWxhdGlvbiBiZXR3ZWVu IGNvbXB1dGVfc3RhdHMgcm91dGluZXMKICAgKiBhbmQgdGhlIGFjdHVhbCBzdG9yYWdlIG9m IHRoZSBzYW1wbGUgZGF0YS4KICAgKi8KISBEYXR1bQogIHN0ZF9mZXRjaF9mdW5jKFZhY0F0 dHJTdGF0c1Agc3RhdHMsIGludCByb3dudW0sIGJvb2wgKmlzTnVsbCkKICB7CiAgCWludAkJ CWF0dG51bSA9IHN0YXRzLT50dXBhdHRudW07CioqKiBhL3NyYy9iYWNrZW5kL2NvbW1hbmRz L2NvcHkuYwotLS0gYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5LmMKKioqKioqKioqKioq KioqCioqKiA0MiwxOTIgKioqKgogICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogICNp bmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKICAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMu aCIKLSAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAgI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3Iu aCIKICAKICAKICAjZGVmaW5lIElTT0NUQUwoYykgKCgoYykgPj0gJzAnKSAmJiAoKGMpIDw9 ICc3JykpCiAgI2RlZmluZSBPQ1RWQUxVRShjKSAoKGMpIC0gJzAnKQogIAotIC8qCi0gICog UmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHNvdXJjZS9kZXN0IGNhc2VzIHdlIG5lZWQgdG8g d29ycnkgYWJvdXQgYXQKLSAgKiB0aGUgYm90dG9tIGxldmVsCi0gICovCi0gdHlwZWRlZiBl bnVtIENvcHlEZXN0Ci0gewotIAlDT1BZX0ZJTEUsCQkJCQkvKiB0by9mcm9tIGZpbGUgKi8K LSAJQ09QWV9PTERfRkUsCQkJCS8qIHRvL2Zyb20gZnJvbnRlbmQgKDIuMCBwcm90b2NvbCkg Ki8KLSAJQ09QWV9ORVdfRkUJCQkJCS8qIHRvL2Zyb20gZnJvbnRlbmQgKDMuMCBwcm90b2Nv bCkgKi8KLSB9IENvcHlEZXN0OwotIAotIC8qCi0gICoJUmVwcmVzZW50cyB0aGUgZW5kLW9m LWxpbmUgdGVybWluYXRvciB0eXBlIG9mIHRoZSBpbnB1dAotICAqLwotIHR5cGVkZWYgZW51 bSBFb2xUeXBlCi0gewotIAlFT0xfVU5LTk9XTiwKLSAJRU9MX05MLAotIAlFT0xfQ1IsCi0g CUVPTF9DUk5MCi0gfSBFb2xUeXBlOwotIAotIC8qCi0gICogVGhpcyBzdHJ1Y3QgY29udGFp bnMgYWxsIHRoZSBzdGF0ZSB2YXJpYWJsZXMgdXNlZCB0aHJvdWdob3V0IGEgQ09QWQotICAq IG9wZXJhdGlvbi4gRm9yIHNpbXBsaWNpdHksIHdlIHVzZSB0aGUgc2FtZSBzdHJ1Y3QgZm9y IGFsbCB2YXJpYW50cyBvZiBDT1BZLAotICAqIGV2ZW4gdGhvdWdoIHNvbWUgZmllbGRzIGFy ZSB1c2VkIGluIG9ubHkgc29tZSBjYXNlcy4KLSAgKgotICAqIE11bHRpLWJ5dGUgZW5jb2Rp bmdzOiBhbGwgc3VwcG9ydGVkIGNsaWVudC1zaWRlIGVuY29kaW5ncyBlbmNvZGUgbXVsdGkt Ynl0ZQotICAqIGNoYXJhY3RlcnMgYnkgaGF2aW5nIHRoZSBmaXJzdCBieXRlJ3MgaGlnaCBi aXQgc2V0LiBTdWJzZXF1ZW50IGJ5dGVzIG9mIHRoZQotICAqIGNoYXJhY3RlciBjYW4gaGF2 ZSB0aGUgaGlnaCBiaXQgbm90IHNldC4gV2hlbiBzY2FubmluZyBkYXRhIGluIHN1Y2ggYW4K LSAgKiBlbmNvZGluZyB0byBsb29rIGZvciBhIG1hdGNoIHRvIGEgc2luZ2xlLWJ5dGUgKGll IEFTQ0lJKSBjaGFyYWN0ZXIsIHdlIG11c3QKLSAgKiB1c2UgdGhlIGZ1bGwgcGdfZW5jb2Rp bmdfbWJsZW4oKSBtYWNoaW5lcnkgdG8gc2tpcCBvdmVyIG11bHRpYnl0ZQotICAqIGNoYXJh Y3RlcnMsIGVsc2Ugd2UgbWlnaHQgZmluZCBhIGZhbHNlIG1hdGNoIHRvIGEgdHJhaWxpbmcg Ynl0ZS4gSW4KLSAgKiBzdXBwb3J0ZWQgc2VydmVyIGVuY29kaW5ncywgdGhlcmUgaXMgbm8g cG9zc2liaWxpdHkgb2YgYSBmYWxzZSBtYXRjaCwgYW5kCi0gICogaXQncyBmYXN0ZXIgdG8g bWFrZSB1c2VsZXNzIGNvbXBhcmlzb25zIHRvIHRyYWlsaW5nIGJ5dGVzIHRoYW4gaXQgaXMg dG8KLSAgKiBpbnZva2UgcGdfZW5jb2RpbmdfbWJsZW4oKSB0byBza2lwIG92ZXIgdGhlbS4g ZW5jb2RpbmdfZW1iZWRzX2FzY2lpIGlzIFRSVUUKLSAgKiB3aGVuIHdlIGhhdmUgdG8gZG8g aXQgdGhlIGhhcmQgd2F5LgotICAqLwotIHR5cGVkZWYgc3RydWN0IENvcHlTdGF0ZURhdGEK LSB7Ci0gCS8qIGxvdy1sZXZlbCBzdGF0ZSBkYXRhICovCi0gCUNvcHlEZXN0CWNvcHlfZGVz dDsJCS8qIHR5cGUgb2YgY29weSBzb3VyY2UvZGVzdGluYXRpb24gKi8KLSAJRklMRQkgICAq Y29weV9maWxlOwkJLyogdXNlZCBpZiBjb3B5X2Rlc3QgPT0gQ09QWV9GSUxFICovCi0gCVN0 cmluZ0luZm8JZmVfbXNnYnVmOwkJLyogdXNlZCBmb3IgYWxsIGRlc3RzIGR1cmluZyBDT1BZ IFRPLCBvbmx5IGZvcgotIAkJCQkJCQkJICogZGVzdCA9PSBDT1BZX05FV19GRSBpbiBDT1BZ IEZST00gKi8KLSAJYm9vbAkJZmVfZW9mOwkJCS8qIHRydWUgaWYgZGV0ZWN0ZWQgZW5kIG9m IGNvcHkgZGF0YSAqLwotIAlFb2xUeXBlCQllb2xfdHlwZTsJCS8qIEVPTCB0eXBlIG9mIGlu cHV0ICovCi0gCWludAkJCWZpbGVfZW5jb2Rpbmc7CS8qIGZpbGUgb3IgcmVtb3RlIHNpZGUn cyBjaGFyYWN0ZXIgZW5jb2RpbmcgKi8KLSAJYm9vbAkJbmVlZF90cmFuc2NvZGluZzsJCS8q IGZpbGUgZW5jb2RpbmcgZGlmZiBmcm9tIHNlcnZlcj8gKi8KLSAJYm9vbAkJZW5jb2Rpbmdf ZW1iZWRzX2FzY2lpOwkvKiBBU0NJSSBjYW4gYmUgbm9uLWZpcnN0IGJ5dGU/ICovCi0gCi0g CS8qIHBhcmFtZXRlcnMgZnJvbSB0aGUgQ09QWSBjb21tYW5kICovCi0gCVJlbGF0aW9uCXJl bDsJCQkvKiByZWxhdGlvbiB0byBjb3B5IHRvIG9yIGZyb20gKi8KLSAJUXVlcnlEZXNjICAq cXVlcnlEZXNjOwkJLyogZXhlY3V0YWJsZSBxdWVyeSB0byBjb3B5IGZyb20gKi8KLSAJTGlz dAkgICAqYXR0bnVtbGlzdDsJCS8qIGludGVnZXIgbGlzdCBvZiBhdHRudW1zIHRvIGNvcHkg Ki8KLSAJY2hhcgkgICAqZmlsZW5hbWU7CQkvKiBmaWxlbmFtZSwgb3IgTlVMTCBmb3IgU1RE SU4vU1RET1VUICovCi0gCWJvb2wJCWJpbmFyeTsJCQkvKiBiaW5hcnkgZm9ybWF0PyAqLwot IAlib29sCQlvaWRzOwkJCS8qIGluY2x1ZGUgT0lEcz8gKi8KLSAJYm9vbAkJY3N2X21vZGU7 CQkvKiBDb21tYSBTZXBhcmF0ZWQgVmFsdWUgZm9ybWF0PyAqLwotIAlib29sCQloZWFkZXJf bGluZTsJLyogQ1NWIGhlYWRlciBsaW5lPyAqLwotIAljaGFyCSAgICpudWxsX3ByaW50OwkJ LyogTlVMTCBtYXJrZXIgc3RyaW5nIChzZXJ2ZXIgZW5jb2RpbmchKSAqLwotIAlpbnQJCQlu dWxsX3ByaW50X2xlbjsgLyogbGVuZ3RoIG9mIHNhbWUgKi8KLSAJY2hhcgkgICAqbnVsbF9w cmludF9jbGllbnQ7CQkvKiBzYW1lIGNvbnZlcnRlZCB0byBmaWxlIGVuY29kaW5nICovCi0g CWNoYXIJICAgKmRlbGltOwkJCS8qIGNvbHVtbiBkZWxpbWl0ZXIgKG11c3QgYmUgMSBieXRl KSAqLwotIAljaGFyCSAgICpxdW90ZTsJCQkvKiBDU1YgcXVvdGUgY2hhciAobXVzdCBiZSAx IGJ5dGUpICovCi0gCWNoYXIJICAgKmVzY2FwZTsJCQkvKiBDU1YgZXNjYXBlIGNoYXIgKG11 c3QgYmUgMSBieXRlKSAqLwotIAlMaXN0CSAgICpmb3JjZV9xdW90ZTsJLyogbGlzdCBvZiBj b2x1bW4gbmFtZXMgKi8KLSAJYm9vbAkJZm9yY2VfcXVvdGVfYWxsOwkvKiBGT1JDRSBRVU9U RSAqPyAqLwotIAlib29sCSAgICpmb3JjZV9xdW90ZV9mbGFnczsJCS8qIHBlci1jb2x1bW4g Q1NWIEZRIGZsYWdzICovCi0gCUxpc3QJICAgKmZvcmNlX25vdG51bGw7CS8qIGxpc3Qgb2Yg Y29sdW1uIG5hbWVzICovCi0gCWJvb2wJICAgKmZvcmNlX25vdG51bGxfZmxhZ3M7CS8qIHBl ci1jb2x1bW4gQ1NWIEZOTiBmbGFncyAqLwotIAotIAkvKiB0aGVzZSBhcmUganVzdCBmb3Ig ZXJyb3IgbWVzc2FnZXMsIHNlZSBDb3B5RnJvbUVycm9yQ2FsbGJhY2sgKi8KLSAJY29uc3Qg Y2hhciAqY3VyX3JlbG5hbWU7CS8qIHRhYmxlIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICov Ci0gCWludAkJCWN1cl9saW5lbm87CQkvKiBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2Fn ZXMgKi8KLSAJY29uc3QgY2hhciAqY3VyX2F0dG5hbWU7CS8qIGN1cnJlbnQgYXR0IGZvciBl cnJvciBtZXNzYWdlcyAqLwotIAljb25zdCBjaGFyICpjdXJfYXR0dmFsOwkJLyogY3VycmVu dCBhdHQgdmFsdWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi0gCi0gCS8qCi0gCSAqIFdvcmtp bmcgc3RhdGUgZm9yIENPUFkgVE8vRlJPTQotIAkgKi8KLSAJTWVtb3J5Q29udGV4dCBjb3B5 Y29udGV4dDsJLyogcGVyLWNvcHkgZXhlY3V0aW9uIGNvbnRleHQgKi8KLSAKLSAJLyoKLSAJ ICogV29ya2luZyBzdGF0ZSBmb3IgQ09QWSBUTwotIAkgKi8KLSAJRm1nckluZm8gICAqb3V0 X2Z1bmN0aW9uczsJLyogbG9va3VwIGluZm8gZm9yIG91dHB1dCBmdW5jdGlvbnMgKi8KLSAJ TWVtb3J5Q29udGV4dCByb3djb250ZXh0OwkvKiBwZXItcm93IGV2YWx1YXRpb24gY29udGV4 dCAqLwotIAotIAkvKgotIAkgKiBXb3JraW5nIHN0YXRlIGZvciBDT1BZIEZST00KLSAJICov Ci0gCUF0dHJOdW1iZXIJbnVtX2RlZmF1bHRzOwotIAlib29sCQlmaWxlX2hhc19vaWRzOwot IAlGbWdySW5mbwlvaWRfaW5fZnVuY3Rpb247Ci0gCU9pZAkJCW9pZF90eXBpb3BhcmFtOwot IAlGbWdySW5mbyAgICppbl9mdW5jdGlvbnM7CS8qIGFycmF5IG9mIGlucHV0IGZ1bmN0aW9u cyBmb3IgZWFjaCBhdHRycyAqLwotIAlPaWQJCSAgICp0eXBpb3BhcmFtczsJLyogYXJyYXkg b2YgZWxlbWVudCB0eXBlcyBmb3IgaW5fZnVuY3Rpb25zICovCi0gCWludAkJICAgKmRlZm1h cDsJCQkvKiBhcnJheSBvZiBkZWZhdWx0IGF0dCBudW1iZXJzICovCi0gCUV4cHJTdGF0ZSAq KmRlZmV4cHJzOwkJLyogYXJyYXkgb2YgZGVmYXVsdCBhdHQgZXhwcmVzc2lvbnMgKi8KLSAK LSAJLyoKLSAJICogVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHJlZHVjZSBvdmVyaGVh ZCBpbiB0ZXh0dWFsIENPUFkgRlJPTS4KLSAJICoKLSAJICogYXR0cmlidXRlX2J1ZiBob2xk cyB0aGUgc2VwYXJhdGVkLCBkZS1lc2NhcGVkIHRleHQgZm9yIGVhY2ggZmllbGQgb2YKLSAJ ICogdGhlIGN1cnJlbnQgbGluZS4gIFRoZSBDb3B5UmVhZEF0dHJpYnV0ZXMgZnVuY3Rpb25z IHJldHVybiBhcnJheXMgb2YKLSAJICogcG9pbnRlcnMgaW50byB0aGlzIGJ1ZmZlci4gIFdl IGF2b2lkIHBhbGxvYy9wZnJlZSBvdmVyaGVhZCBieSByZS11c2luZwotIAkgKiB0aGUgYnVm ZmVyIG9uIGVhY2ggY3ljbGUuCi0gCSAqLwotIAlTdHJpbmdJbmZvRGF0YSBhdHRyaWJ1dGVf YnVmOwotIAotIAkvKiBmaWVsZCByYXcgZGF0YSBwb2ludGVycyBmb3VuZCBieSBDT1BZIEZS T00gKi8KLSAKLSAJaW50CQkJbWF4X2ZpZWxkczsKLSAJY2hhcgkgICoqcmF3X2ZpZWxkczsK LSAKLSAJLyoKLSAJICogU2ltaWxhcmx5LCBsaW5lX2J1ZiBob2xkcyB0aGUgd2hvbGUgaW5w dXQgbGluZSBiZWluZyBwcm9jZXNzZWQuIFRoZQotIAkgKiBpbnB1dCBjeWNsZSBpcyBmaXJz dCB0byByZWFkIHRoZSB3aG9sZSBsaW5lIGludG8gbGluZV9idWYsIGNvbnZlcnQgaXQKLSAJ ICogdG8gc2VydmVyIGVuY29kaW5nIHRoZXJlLCBhbmQgdGhlbiBleHRyYWN0IHRoZSBpbmRp dmlkdWFsIGF0dHJpYnV0ZQotIAkgKiBmaWVsZHMgaW50byBhdHRyaWJ1dGVfYnVmLiAgbGlu ZV9idWYgaXMgcHJlc2VydmVkIHVubW9kaWZpZWQgc28gdGhhdCB3ZQotIAkgKiBjYW4gZGlz cGxheSBpdCBpbiBlcnJvciBtZXNzYWdlcyBpZiBhcHByb3ByaWF0ZS4KLSAJICovCi0gCVN0 cmluZ0luZm9EYXRhIGxpbmVfYnVmOwotIAlib29sCQlsaW5lX2J1Zl9jb252ZXJ0ZWQ7CQkv KiBjb252ZXJ0ZWQgdG8gc2VydmVyIGVuY29kaW5nPyAqLwotIAotIAkvKgotIAkgKiBGaW5h bGx5LCByYXdfYnVmIGhvbGRzIHJhdyBkYXRhIHJlYWQgZnJvbSB0aGUgZGF0YSBzb3VyY2Ug KGZpbGUgb3IKLSAJICogY2xpZW50IGNvbm5lY3Rpb24pLglDb3B5UmVhZExpbmUgcGFyc2Vz IHRoaXMgZGF0YSBzdWZmaWNpZW50bHkgdG8KLSAJICogbG9jYXRlIGxpbmUgYm91bmRhcmll cywgdGhlbiB0cmFuc2ZlcnMgdGhlIGRhdGEgdG8gbGluZV9idWYgYW5kCi0gCSAqIGNvbnZl cnRzIGl0LiAgTm90ZTogd2UgZ3VhcmFudGVlIHRoYXQgdGhlcmUgaXMgYSBcMCBhdAotIAkg KiByYXdfYnVmW3Jhd19idWZfbGVuXS4KLSAJICovCi0gI2RlZmluZSBSQVdfQlVGX1NJWkUg NjU1MzYJCS8qIHdlIHBhbGxvYyBSQVdfQlVGX1NJWkUrMSBieXRlcyAqLwotIAljaGFyCSAg ICpyYXdfYnVmOwotIAlpbnQJCQlyYXdfYnVmX2luZGV4OwkvKiBuZXh0IGJ5dGUgdG8gcHJv Y2VzcyAqLwotIAlpbnQJCQlyYXdfYnVmX2xlbjsJLyogdG90YWwgIyBvZiBieXRlcyBzdG9y ZWQgKi8KLSB9IENvcHlTdGF0ZURhdGE7CiAgCiAgLyogRGVzdFJlY2VpdmVyIGZvciBDT1BZ IChTRUxFQ1QpIFRPICovCiAgdHlwZWRlZiBzdHJ1Y3QKLS0tIDQyLDUzIC0tLS0KKioqIGEv c3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKLS0tIGIvc3JjL2JhY2tlbmQvY29t bWFuZHMvdGFibGVjbWRzLmMKKioqKioqKioqKioqKioqCioqKiAzMTEsMzE2ICoqKiogc3Rh dGljIHZvaWQgQVRQcmVwU2V0U3RhdGlzdGljcyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIg KmNvbE5hbWUsCi0tLSAzMTEsMzE4IC0tLS0KICAJCQkJCU5vZGUgKm5ld1ZhbHVlLCBMT0NL TU9ERSBsb2NrbW9kZSk7CiAgc3RhdGljIHZvaWQgQVRFeGVjU2V0U3RhdGlzdGljcyhSZWxh dGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsCiAgCQkJCQlOb2RlICpuZXdWYWx1ZSwg TE9DS01PREUgbG9ja21vZGUpOworIHN0YXRpYyB2b2lkIEFUUHJlcFNldE9wdGlvbnMoUmVs YXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLAorIAkJCQkgTm9kZSAqb3B0aW9ucywg TE9DS01PREUgbG9ja21vZGUpOwogIHN0YXRpYyB2b2lkIEFURXhlY1NldE9wdGlvbnMoUmVs YXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLAogIAkJCQkgTm9kZSAqb3B0aW9ucywg Ym9vbCBpc1Jlc2V0LCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAgc3RhdGljIHZvaWQgQVRFeGVj U2V0U3RvcmFnZShSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsCioqKioqKioq KioqKioqKgoqKiogMjg4NiwyODkyICoqKiogQVRQcmVwQ21kKExpc3QgKip3cXVldWUsIFJl bGF0aW9uIHJlbCwgQWx0ZXJUYWJsZUNtZCAqY21kLAogIAkJCWJyZWFrOwogIAkJY2FzZSBB VF9TZXRPcHRpb25zOgkJLyogQUxURVIgQ09MVU1OIFNFVCAoIG9wdGlvbnMgKSAqLwogIAkJ Y2FzZSBBVF9SZXNldE9wdGlvbnM6CS8qIEFMVEVSIENPTFVNTiBSRVNFVCAoIG9wdGlvbnMg KSAqLwohIAkJCUFUU2ltcGxlUGVybWlzc2lvbnMocmVsLCBBVFRfVEFCTEUgfCBBVFRfSU5E RVgpOwogIAkJCS8qIFRoaXMgY29tbWFuZCBuZXZlciByZWN1cnNlcyAqLwogIAkJCXBhc3Mg PSBBVF9QQVNTX01JU0M7CiAgCQkJYnJlYWs7Ci0tLSAyODg4LDI4OTUgLS0tLQogIAkJCWJy ZWFrOwogIAkJY2FzZSBBVF9TZXRPcHRpb25zOgkJLyogQUxURVIgQ09MVU1OIFNFVCAoIG9w dGlvbnMgKSAqLwogIAkJY2FzZSBBVF9SZXNldE9wdGlvbnM6CS8qIEFMVEVSIENPTFVNTiBS RVNFVCAoIG9wdGlvbnMgKSAqLwohIAkJCUFUU2ltcGxlUGVybWlzc2lvbnMocmVsLCBBVFRf VEFCTEUgfCBBVFRfSU5ERVggfCBBVFRfRk9SRUlHTl9UQUJMRSk7CiEgCQkJQVRQcmVwU2V0 T3B0aW9ucyhyZWwsIGNtZC0+bmFtZSwgY21kLT5kZWYsIGxvY2ttb2RlKTsKICAJCQkvKiBU aGlzIGNvbW1hbmQgbmV2ZXIgcmVjdXJzZXMgKi8KICAJCQlwYXNzID0gQVRfUEFTU19NSVND OwogIAkJCWJyZWFrOwoqKioqKioqKioqKioqKioKKioqIDQ4MjIsNDgzMSAqKioqIEFUUHJl cFNldFN0YXRpc3RpY3MoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLCBOb2Rl ICpuZXdWYWx1ZSwgTE9DS01PREUKICAJICogYWxsb3dTeXN0ZW1UYWJsZU1vZHMgdG8gYmUg dHVybmVkIG9uLgogIAkgKi8KICAJaWYgKHJlbC0+cmRfcmVsLT5yZWxraW5kICE9IFJFTEtJ TkRfUkVMQVRJT04gJiYKISAJCXJlbC0+cmRfcmVsLT5yZWxraW5kICE9IFJFTEtJTkRfSU5E RVgpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09C SkVDVF9UWVBFKSwKISAJCQkJIGVycm1zZygiXCIlc1wiIGlzIG5vdCBhIHRhYmxlIG9yIGlu ZGV4IiwKICAJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkpOwogIAogIAkv KiBQZXJtaXNzaW9ucyBjaGVja3MgKi8KLS0tIDQ4MjUsNDgzNSAtLS0tCiAgCSAqIGFsbG93 U3lzdGVtVGFibGVNb2RzIHRvIGJlIHR1cm5lZCBvbi4KICAJICovCiAgCWlmIChyZWwtPnJk X3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1JFTEFUSU9OICYmCiEgCQlyZWwtPnJkX3JlbC0+ cmVsa2luZCAhPSBSRUxLSU5EX0lOREVYICYmCiEgCQlyZWwtPnJkX3JlbC0+cmVsa2luZCAh PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJy Y29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKISAJCQkJIGVycm1zZygiXCIlc1wi IGlzIG5vdCBhIHRhYmxlLCBpbmRleCwgb3IgZm9yZWlnbiB0YWJsZSIsCiAgCQkJCQkJUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKICAKICAJLyogUGVybWlzc2lvbnMgY2hl Y2tzICovCioqKioqKioqKioqKioqKgoqKiogNDg5Myw0ODk4ICoqKiogQVRFeGVjU2V0U3Rh dGlzdGljcyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsIE5vZGUgKm5ld1Zh bHVlLCBMT0NLTU9ERQotLS0gNDg5Nyw0OTIzIC0tLS0KICAJaGVhcF9jbG9zZShhdHRyZWxh dGlvbiwgUm93RXhjbHVzaXZlTG9jayk7CiAgfQogIAorIAorIHN0YXRpYyB2b2lkCisgQVRQ cmVwU2V0T3B0aW9ucyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsIE5vZGUg Km9wdGlvbnMsCisgCQkJCSBMT0NLTU9ERSBsb2NrbW9kZSkKKyB7CisgCWlmIChyZWwtPnJk X3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUpCisgCXsKKyAJCUxpc3RD ZWxsICAgKmNlbGw7CisgCisgCQlmb3JlYWNoKGNlbGwsIChMaXN0ICopIG9wdGlvbnMpCisg CQl7CisgCQkJRGVmRWxlbSAgICAqZGVmID0gKERlZkVsZW0gKikgbGZpcnN0KGNlbGwpOwor IAorIAkJCWlmIChwZ19zdHJuY2FzZWNtcChkZWYtPmRlZm5hbWUsICJuX2Rpc3RpbmN0X2lu aGVyaXRlZCIsIHN0cmxlbigibl9kaXN0aW5jdF9pbmhlcml0ZWQiKSkgPT0gMCkKKyAJCQkJ ZXJlcG9ydChFUlJPUiwKKyAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NV UFBPUlRFRCksCisgCQkJCQkJIGVycm1zZygiY2Fubm90IHN1cHBvcnQgb3B0aW9uIFwibl9k aXN0aW5jdF9pbmhlcml0ZWRcIiBmb3IgZm9yZWlnbiB0YWJsZXMiKSkpOworIAkJfQorIAl9 CisgfQorIAogIHN0YXRpYyB2b2lkCiAgQVRFeGVjU2V0T3B0aW9ucyhSZWxhdGlvbiByZWws IGNvbnN0IGNoYXIgKmNvbE5hbWUsIE5vZGUgKm9wdGlvbnMsCiAgCQkJCSBib29sIGlzUmVz ZXQsIExPQ0tNT0RFIGxvY2ttb2RlKQoqKiogYS9zcmMvYmluL3BzcWwvdGFiLWNvbXBsZXRl LmMKLS0tIGIvc3JjL2Jpbi9wc3FsL3RhYi1jb21wbGV0ZS5jCioqKioqKioqKioqKioqKgoq KiogMzk5LDQwNCAqKioqIHN0YXRpYyBjb25zdCBTY2hlbWFRdWVyeSBRdWVyeV9mb3JfbGlz dF9vZl90c3ZmID0gewotLS0gMzk5LDQxOSAtLS0tCiAgCU5VTEwKICB9OwogIAorIHN0YXRp YyBjb25zdCBTY2hlbWFRdWVyeSBRdWVyeV9mb3JfbGlzdF9vZl90ZiA9IHsKKyAJLyogY2F0 bmFtZSAqLworIAkicGdfY2F0YWxvZy5wZ19jbGFzcyBjIiwKKyAJLyogc2VsY29uZGl0aW9u ICovCisgCSJjLnJlbGtpbmQgSU4gKCdyJywgJ2YnKSIsCisgCS8qIHZpc2NvbmRpdGlvbiAq LworIAkicGdfY2F0YWxvZy5wZ190YWJsZV9pc192aXNpYmxlKGMub2lkKSIsCisgCS8qIG5h bWVzcGFjZSAqLworIAkiYy5yZWxuYW1lc3BhY2UiLAorIAkvKiByZXN1bHQgKi8KKyAJInBn X2NhdGFsb2cucXVvdGVfaWRlbnQoYy5yZWxuYW1lKSIsCisgCS8qIHF1YWxyZXN1bHQgKi8K KyAJTlVMTAorIH07CisgCiAgc3RhdGljIGNvbnN0IFNjaGVtYVF1ZXJ5IFF1ZXJ5X2Zvcl9s aXN0X29mX3ZpZXdzID0gewogIAkvKiBjYXRuYW1lICovCiAgCSJwZ19jYXRhbG9nLnBnX2Ns YXNzIGMiLAoqKioqKioqKioqKioqKioKKioqIDI3NTUsMjc2MSAqKioqIHBzcWxfY29tcGxl dGlvbihjaGFyICp0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpCiAgLyogQU5BTFlaRSAqLwog IAkvKiBJZiB0aGUgcHJldmlvdXMgd29yZCBpcyBBTkFMWVpFLCBwcm9kdWNlIGxpc3Qgb2Yg dGFibGVzICovCiAgCWVsc2UgaWYgKHBnX3N0cmNhc2VjbXAocHJldl93ZCwgIkFOQUxZWkUi KSA9PSAwKQohIAkJQ09NUExFVEVfV0lUSF9TQ0hFTUFfUVVFUlkoUXVlcnlfZm9yX2xpc3Rf b2ZfdGFibGVzLCBOVUxMKTsKICAKICAvKiBXSEVSRSAqLwogIAkvKiBTaW1wbGUgY2FzZSBv ZiB0aGUgd29yZCBiZWZvcmUgdGhlIHdoZXJlIGJlaW5nIHRoZSB0YWJsZSBuYW1lICovCi0t LSAyNzcwLDI3NzYgLS0tLQogIC8qIEFOQUxZWkUgKi8KICAJLyogSWYgdGhlIHByZXZpb3Vz IHdvcmQgaXMgQU5BTFlaRSwgcHJvZHVjZSBsaXN0IG9mIHRhYmxlcyAqLwogIAllbHNlIGlm IChwZ19zdHJjYXNlY21wKHByZXZfd2QsICJBTkFMWVpFIikgPT0gMCkKISAJCUNPTVBMRVRF X1dJVEhfU0NIRU1BX1FVRVJZKFF1ZXJ5X2Zvcl9saXN0X29mX3RmLCBOVUxMKTsKICAKICAv KiBXSEVSRSAqLwogIAkvKiBTaW1wbGUgY2FzZSBvZiB0aGUgd29yZCBiZWZvcmUgdGhlIHdo ZXJlIGJlaW5nIHRoZSB0YWJsZSBuYW1lICovCioqKiBhL3NyYy9pbmNsdWRlL2NvbW1hbmRz L2NvcHkuaAotLS0gYi9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5LmgKKioqKioqKioqKioq KioqCioqKiAxNCwyMiAqKioqCi0tLSAxNCwxNjggLS0tLQogICNpZm5kZWYgQ09QWV9ICiAg I2RlZmluZSBDT1BZX0gKICAKKyAjaW5jbHVkZSAiYWNjZXNzL2F0dG51bS5oIgorICNpbmNs dWRlICJleGVjdXRvci9leGVjZGVzYy5oIgorICNpbmNsdWRlICJmbWdyLmgiCisgI2luY2x1 ZGUgImxpYi9zdHJpbmdpbmZvLmgiCiAgI2luY2x1ZGUgIm5vZGVzL2V4ZWNub2Rlcy5oIgog ICNpbmNsdWRlICJub2Rlcy9wYXJzZW5vZGVzLmgiCisgI2luY2x1ZGUgIm5vZGVzL3BnX2xp c3QuaCIKICAjaW5jbHVkZSAidGNvcC9kZXN0LmgiCisgI2luY2x1ZGUgInV0aWxzL3BhbGxv Yy5oIgorICNpbmNsdWRlICJ1dGlscy9yZWwuaCIKKyAKKyAvKgorICAqIFJlcHJlc2VudHMg dGhlIGRpZmZlcmVudCBzb3VyY2UvZGVzdCBjYXNlcyB3ZSBuZWVkIHRvIHdvcnJ5IGFib3V0 IGF0CisgICogdGhlIGJvdHRvbSBsZXZlbAorICAqLworIHR5cGVkZWYgZW51bSBDb3B5RGVz dAorIHsKKyAJQ09QWV9GSUxFLAkJCQkJLyogdG8vZnJvbSBmaWxlICovCisgCUNPUFlfT0xE X0ZFLAkJCQkvKiB0by9mcm9tIGZyb250ZW5kICgyLjAgcHJvdG9jb2wpICovCisgCUNPUFlf TkVXX0ZFCQkJCQkvKiB0by9mcm9tIGZyb250ZW5kICgzLjAgcHJvdG9jb2wpICovCisgfSBD b3B5RGVzdDsKKyAKKyAvKgorICAqCVJlcHJlc2VudHMgdGhlIGVuZC1vZi1saW5lIHRlcm1p bmF0b3IgdHlwZSBvZiB0aGUgaW5wdXQKKyAgKi8KKyB0eXBlZGVmIGVudW0gRW9sVHlwZQor IHsKKyAJRU9MX1VOS05PV04sCisgCUVPTF9OTCwKKyAJRU9MX0NSLAorIAlFT0xfQ1JOTAor IH0gRW9sVHlwZTsKKyAKKyAvKgorICAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGFsbCB0aGUg c3RhdGUgdmFyaWFibGVzIHVzZWQgdGhyb3VnaG91dCBhIENPUFkKKyAgKiBvcGVyYXRpb24u IEZvciBzaW1wbGljaXR5LCB3ZSB1c2UgdGhlIHNhbWUgc3RydWN0IGZvciBhbGwgdmFyaWFu dHMgb2YgQ09QWSwKKyAgKiBldmVuIHRob3VnaCBzb21lIGZpZWxkcyBhcmUgdXNlZCBpbiBv bmx5IHNvbWUgY2FzZXMuCisgICoKKyAgKiBNdWx0aS1ieXRlIGVuY29kaW5nczogYWxsIHN1 cHBvcnRlZCBjbGllbnQtc2lkZSBlbmNvZGluZ3MgZW5jb2RlIG11bHRpLWJ5dGUKKyAgKiBj aGFyYWN0ZXJzIGJ5IGhhdmluZyB0aGUgZmlyc3QgYnl0ZSdzIGhpZ2ggYml0IHNldC4gU3Vi c2VxdWVudCBieXRlcyBvZiB0aGUKKyAgKiBjaGFyYWN0ZXIgY2FuIGhhdmUgdGhlIGhpZ2gg Yml0IG5vdCBzZXQuIFdoZW4gc2Nhbm5pbmcgZGF0YSBpbiBzdWNoIGFuCisgICogZW5jb2Rp bmcgdG8gbG9vayBmb3IgYSBtYXRjaCB0byBhIHNpbmdsZS1ieXRlIChpZSBBU0NJSSkgY2hh cmFjdGVyLCB3ZSBtdXN0CisgICogdXNlIHRoZSBmdWxsIHBnX2VuY29kaW5nX21ibGVuKCkg bWFjaGluZXJ5IHRvIHNraXAgb3ZlciBtdWx0aWJ5dGUKKyAgKiBjaGFyYWN0ZXJzLCBlbHNl IHdlIG1pZ2h0IGZpbmQgYSBmYWxzZSBtYXRjaCB0byBhIHRyYWlsaW5nIGJ5dGUuIEluCisg ICogc3VwcG9ydGVkIHNlcnZlciBlbmNvZGluZ3MsIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5 IG9mIGEgZmFsc2UgbWF0Y2gsIGFuZAorICAqIGl0J3MgZmFzdGVyIHRvIG1ha2UgdXNlbGVz cyBjb21wYXJpc29ucyB0byB0cmFpbGluZyBieXRlcyB0aGFuIGl0IGlzIHRvCisgICogaW52 b2tlIHBnX2VuY29kaW5nX21ibGVuKCkgdG8gc2tpcCBvdmVyIHRoZW0uIGVuY29kaW5nX2Vt YmVkc19hc2NpaSBpcyBUUlVFCisgICogd2hlbiB3ZSBoYXZlIHRvIGRvIGl0IHRoZSBoYXJk IHdheS4KKyAgKi8KKyB0eXBlZGVmIHN0cnVjdCBDb3B5U3RhdGVEYXRhCisgeworIAkvKiBs b3ctbGV2ZWwgc3RhdGUgZGF0YSAqLworIAlDb3B5RGVzdAljb3B5X2Rlc3Q7CQkvKiB0eXBl IG9mIGNvcHkgc291cmNlL2Rlc3RpbmF0aW9uICovCisgCUZJTEUJICAgKmNvcHlfZmlsZTsJ CS8qIHVzZWQgaWYgY29weV9kZXN0ID09IENPUFlfRklMRSAqLworIAlTdHJpbmdJbmZvCWZl X21zZ2J1ZjsJCS8qIHVzZWQgZm9yIGFsbCBkZXN0cyBkdXJpbmcgQ09QWSBUTywgb25seSBm b3IKKyAJCQkJCQkJCSAqIGRlc3QgPT0gQ09QWV9ORVdfRkUgaW4gQ09QWSBGUk9NICovCisg CWJvb2wJCWZlX2VvZjsJCQkvKiB0cnVlIGlmIGRldGVjdGVkIGVuZCBvZiBjb3B5IGRhdGEg Ki8KKyAJRW9sVHlwZQkJZW9sX3R5cGU7CQkvKiBFT0wgdHlwZSBvZiBpbnB1dCAqLworIAlp bnQJCQlmaWxlX2VuY29kaW5nOwkvKiBmaWxlIG9yIHJlbW90ZSBzaWRlJ3MgY2hhcmFjdGVy IGVuY29kaW5nICovCisgCWJvb2wJCW5lZWRfdHJhbnNjb2Rpbmc7CQkvKiBmaWxlIGVuY29k aW5nIGRpZmYgZnJvbSBzZXJ2ZXI/ICovCisgCWJvb2wJCWVuY29kaW5nX2VtYmVkc19hc2Np aTsJLyogQVNDSUkgY2FuIGJlIG5vbi1maXJzdCBieXRlPyAqLworIAorIAkvKiBwYXJhbWV0 ZXJzIGZyb20gdGhlIENPUFkgY29tbWFuZCAqLworIAlSZWxhdGlvbglyZWw7CQkJLyogcmVs YXRpb24gdG8gY29weSB0byBvciBmcm9tICovCisgCVF1ZXJ5RGVzYyAgKnF1ZXJ5RGVzYzsJ CS8qIGV4ZWN1dGFibGUgcXVlcnkgdG8gY29weSBmcm9tICovCisgCUxpc3QJICAgKmF0dG51 bWxpc3Q7CQkvKiBpbnRlZ2VyIGxpc3Qgb2YgYXR0bnVtcyB0byBjb3B5ICovCisgCWNoYXIJ ICAgKmZpbGVuYW1lOwkJLyogZmlsZW5hbWUsIG9yIE5VTEwgZm9yIFNURElOL1NURE9VVCAq LworIAlib29sCQliaW5hcnk7CQkJLyogYmluYXJ5IGZvcm1hdD8gKi8KKyAJYm9vbAkJb2lk czsJCQkvKiBpbmNsdWRlIE9JRHM/ICovCisgCWJvb2wJCWNzdl9tb2RlOwkJLyogQ29tbWEg U2VwYXJhdGVkIFZhbHVlIGZvcm1hdD8gKi8KKyAJYm9vbAkJaGVhZGVyX2xpbmU7CS8qIENT ViBoZWFkZXIgbGluZT8gKi8KKyAJY2hhcgkgICAqbnVsbF9wcmludDsJCS8qIE5VTEwgbWFy a2VyIHN0cmluZyAoc2VydmVyIGVuY29kaW5nISkgKi8KKyAJaW50CQkJbnVsbF9wcmludF9s ZW47IC8qIGxlbmd0aCBvZiBzYW1lICovCisgCWNoYXIJICAgKm51bGxfcHJpbnRfY2xpZW50 OwkJLyogc2FtZSBjb252ZXJ0ZWQgdG8gZmlsZSBlbmNvZGluZyAqLworIAljaGFyCSAgICpk ZWxpbTsJCQkvKiBjb2x1bW4gZGVsaW1pdGVyIChtdXN0IGJlIDEgYnl0ZSkgKi8KKyAJY2hh cgkgICAqcXVvdGU7CQkJLyogQ1NWIHF1b3RlIGNoYXIgKG11c3QgYmUgMSBieXRlKSAqLwor IAljaGFyCSAgICplc2NhcGU7CQkJLyogQ1NWIGVzY2FwZSBjaGFyIChtdXN0IGJlIDEgYnl0 ZSkgKi8KKyAJTGlzdAkgICAqZm9yY2VfcXVvdGU7CS8qIGxpc3Qgb2YgY29sdW1uIG5hbWVz ICovCisgCWJvb2wJCWZvcmNlX3F1b3RlX2FsbDsJLyogRk9SQ0UgUVVPVEUgKj8gKi8KKyAJ Ym9vbAkgICAqZm9yY2VfcXVvdGVfZmxhZ3M7CQkvKiBwZXItY29sdW1uIENTViBGUSBmbGFn cyAqLworIAlMaXN0CSAgICpmb3JjZV9ub3RudWxsOwkvKiBsaXN0IG9mIGNvbHVtbiBuYW1l cyAqLworIAlib29sCSAgICpmb3JjZV9ub3RudWxsX2ZsYWdzOwkvKiBwZXItY29sdW1uIENT ViBGTk4gZmxhZ3MgKi8KKyAKKyAJLyogdGhlc2UgYXJlIGp1c3QgZm9yIGVycm9yIG1lc3Nh Z2VzLCBzZWUgQ29weUZyb21FcnJvckNhbGxiYWNrICovCisgCWNvbnN0IGNoYXIgKmN1cl9y ZWxuYW1lOwkvKiB0YWJsZSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLworIAlpbnQJCQlj dXJfbGluZW5vOwkJLyogbGluZSBudW1iZXIgZm9yIGVycm9yIG1lc3NhZ2VzICovCisgCWNv bnN0IGNoYXIgKmN1cl9hdHRuYW1lOwkvKiBjdXJyZW50IGF0dCBmb3IgZXJyb3IgbWVzc2Fn ZXMgKi8KKyAJY29uc3QgY2hhciAqY3VyX2F0dHZhbDsJCS8qIGN1cnJlbnQgYXR0IHZhbHVl IGZvciBlcnJvciBtZXNzYWdlcyAqLworIAorIAkvKgorIAkgKiBXb3JraW5nIHN0YXRlIGZv ciBDT1BZIFRPL0ZST00KKyAJICovCisgCU1lbW9yeUNvbnRleHQgY29weWNvbnRleHQ7CS8q IHBlci1jb3B5IGV4ZWN1dGlvbiBjb250ZXh0ICovCisgCisgCS8qCisgCSAqIFdvcmtpbmcg c3RhdGUgZm9yIENPUFkgVE8KKyAJICovCisgCUZtZ3JJbmZvICAgKm91dF9mdW5jdGlvbnM7 CS8qIGxvb2t1cCBpbmZvIGZvciBvdXRwdXQgZnVuY3Rpb25zICovCisgCU1lbW9yeUNvbnRl eHQgcm93Y29udGV4dDsJLyogcGVyLXJvdyBldmFsdWF0aW9uIGNvbnRleHQgKi8KKyAKKyAJ LyoKKyAJICogV29ya2luZyBzdGF0ZSBmb3IgQ09QWSBGUk9NCisgCSAqLworIAlBdHRyTnVt YmVyCW51bV9kZWZhdWx0czsKKyAJYm9vbAkJZmlsZV9oYXNfb2lkczsKKyAJRm1nckluZm8J b2lkX2luX2Z1bmN0aW9uOworIAlPaWQJCQlvaWRfdHlwaW9wYXJhbTsKKyAJRm1nckluZm8g ICAqaW5fZnVuY3Rpb25zOwkvKiBhcnJheSBvZiBpbnB1dCBmdW5jdGlvbnMgZm9yIGVhY2gg YXR0cnMgKi8KKyAJT2lkCQkgICAqdHlwaW9wYXJhbXM7CS8qIGFycmF5IG9mIGVsZW1lbnQg dHlwZXMgZm9yIGluX2Z1bmN0aW9ucyAqLworIAlpbnQJCSAgICpkZWZtYXA7CQkJLyogYXJy YXkgb2YgZGVmYXVsdCBhdHQgbnVtYmVycyAqLworIAlFeHByU3RhdGUgKipkZWZleHByczsJ CS8qIGFycmF5IG9mIGRlZmF1bHQgYXR0IGV4cHJlc3Npb25zICovCisgCisgCS8qCisgCSAq IFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byByZWR1Y2Ugb3ZlcmhlYWQgaW4gdGV4dHVh bCBDT1BZIEZST00uCisgCSAqCisgCSAqIGF0dHJpYnV0ZV9idWYgaG9sZHMgdGhlIHNlcGFy YXRlZCwgZGUtZXNjYXBlZCB0ZXh0IGZvciBlYWNoIGZpZWxkIG9mCisgCSAqIHRoZSBjdXJy ZW50IGxpbmUuICBUaGUgQ29weVJlYWRBdHRyaWJ1dGVzIGZ1bmN0aW9ucyByZXR1cm4gYXJy YXlzIG9mCisgCSAqIHBvaW50ZXJzIGludG8gdGhpcyBidWZmZXIuICBXZSBhdm9pZCBwYWxs b2MvcGZyZWUgb3ZlcmhlYWQgYnkgcmUtdXNpbmcKKyAJICogdGhlIGJ1ZmZlciBvbiBlYWNo IGN5Y2xlLgorIAkgKi8KKyAJU3RyaW5nSW5mb0RhdGEgYXR0cmlidXRlX2J1ZjsKKyAKKyAJ LyogZmllbGQgcmF3IGRhdGEgcG9pbnRlcnMgZm91bmQgYnkgQ09QWSBGUk9NICovCisgCisg CWludAkJCW1heF9maWVsZHM7CisgCWNoYXIJICAqKnJhd19maWVsZHM7CisgCisgCS8qCisg CSAqIFNpbWlsYXJseSwgbGluZV9idWYgaG9sZHMgdGhlIHdob2xlIGlucHV0IGxpbmUgYmVp bmcgcHJvY2Vzc2VkLiBUaGUKKyAJICogaW5wdXQgY3ljbGUgaXMgZmlyc3QgdG8gcmVhZCB0 aGUgd2hvbGUgbGluZSBpbnRvIGxpbmVfYnVmLCBjb252ZXJ0IGl0CisgCSAqIHRvIHNlcnZl ciBlbmNvZGluZyB0aGVyZSwgYW5kIHRoZW4gZXh0cmFjdCB0aGUgaW5kaXZpZHVhbCBhdHRy aWJ1dGUKKyAJICogZmllbGRzIGludG8gYXR0cmlidXRlX2J1Zi4gIGxpbmVfYnVmIGlzIHBy ZXNlcnZlZCB1bm1vZGlmaWVkIHNvIHRoYXQgd2UKKyAJICogY2FuIGRpc3BsYXkgaXQgaW4g ZXJyb3IgbWVzc2FnZXMgaWYgYXBwcm9wcmlhdGUuCisgCSAqLworIAlTdHJpbmdJbmZvRGF0 YSBsaW5lX2J1ZjsKKyAJYm9vbAkJbGluZV9idWZfY29udmVydGVkOwkJLyogY29udmVydGVk IHRvIHNlcnZlciBlbmNvZGluZz8gKi8KKyAKKyAJLyoKKyAJICogRmluYWxseSwgcmF3X2J1 ZiBob2xkcyByYXcgZGF0YSByZWFkIGZyb20gdGhlIGRhdGEgc291cmNlIChmaWxlIG9yCisg CSAqIGNsaWVudCBjb25uZWN0aW9uKS4JQ29weVJlYWRMaW5lIHBhcnNlcyB0aGlzIGRhdGEg c3VmZmljaWVudGx5IHRvCisgCSAqIGxvY2F0ZSBsaW5lIGJvdW5kYXJpZXMsIHRoZW4gdHJh bnNmZXJzIHRoZSBkYXRhIHRvIGxpbmVfYnVmIGFuZAorIAkgKiBjb252ZXJ0cyBpdC4gIE5v dGU6IHdlIGd1YXJhbnRlZSB0aGF0IHRoZXJlIGlzIGEgXDAgYXQKKyAJICogcmF3X2J1Zlty YXdfYnVmX2xlbl0uCisgCSAqLworICNkZWZpbmUgUkFXX0JVRl9TSVpFIDY1NTM2CQkvKiB3 ZSBwYWxsb2MgUkFXX0JVRl9TSVpFKzEgYnl0ZXMgKi8KKyAJY2hhcgkgICAqcmF3X2J1ZjsK KyAJaW50CQkJcmF3X2J1Zl9pbmRleDsJLyogbmV4dCBieXRlIHRvIHByb2Nlc3MgKi8KKyAJ aW50CQkJcmF3X2J1Zl9sZW47CS8qIHRvdGFsICMgb2YgYnl0ZXMgc3RvcmVkICovCisgfSBD b3B5U3RhdGVEYXRhOwogIAogIC8qIENvcHlTdGF0ZURhdGEgaXMgcHJpdmF0ZSBpbiBjb21t YW5kcy9jb3B5LmMgKi8KICB0eXBlZGVmIHN0cnVjdCBDb3B5U3RhdGVEYXRhICpDb3B5U3Rh dGU7CioqKiBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3ZhY3V1bS5oCi0tLSBiL3NyYy9pbmNs dWRlL2NvbW1hbmRzL3ZhY3V1bS5oCioqKioqKioqKioqKioqKgoqKiogMTY3LDE3MSAqKioq IGV4dGVybiB2b2lkIGxhenlfdmFjdXVtX3JlbChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0 bXQgKnZhY3N0bXQsCi0tLSAxNjcsMTc5IC0tLS0KICAvKiBpbiBjb21tYW5kcy9hbmFseXpl LmMgKi8KICBleHRlcm4gdm9pZCBhbmFseXplX3JlbChPaWQgcmVsaWQsIFZhY3V1bVN0bXQg KnZhY3N0bXQsCiAgCQkJQnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5KTsKKyBleHRl cm4gVmFjQXR0clN0YXRzICogZXhhbWluZV9hdHRyaWJ1dGUoUmVsYXRpb24gb25lcmVsLCBp bnQgYXR0bnVtLCBOb2RlICppbmRleF9leHByLAorIAkJCU1lbW9yeUNvbnRleHQgYW5sX2Nv bnRleHQpOworIGV4dGVybiBkb3VibGUgcmFuZG9tX2ZyYWN0KHZvaWQpOworIGV4dGVybiBk b3VibGUgaW5pdF9zZWxlY3Rpb25fc3RhdGUoaW50IG4pOworIGV4dGVybiBkb3VibGUgZ2V0 X25leHRfUyhkb3VibGUgdCwgaW50IG4sIGRvdWJsZSAqc3RhdGVwdHIpOworIGV4dGVybiBp bnQJY29tcGFyZV9yb3dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOworIGV4dGVy biB2b2lkCXVwZGF0ZV9hdHRzdGF0cyhPaWQgcmVsaWQsIGJvb2wgaW5oLCBpbnQgbmF0dHMs IFZhY0F0dHJTdGF0cyAqKnZhY2F0dHJzdGF0cyk7CisgZXh0ZXJuIERhdHVtIHN0ZF9mZXRj aF9mdW5jKFZhY0F0dHJTdGF0c1Agc3RhdHMsIGludCByb3dudW0sIGJvb2wgKmlzTnVsbCk7 CiAgCiAgI2VuZGlmICAgLyogVkFDVVVNX0ggKi8KKioqIGEvc3JjL2luY2x1ZGUvZm9yZWln bi9mZHdhcGkuaAotLS0gYi9zcmMvaW5jbHVkZS9mb3JlaWduL2Zkd2FwaS5oCioqKioqKioq KioqKioqKgoqKiogMTIsMTkgKioqKgotLS0gMTIsMjEgLS0tLQogICNpZm5kZWYgRkRXQVBJ X0gKICAjZGVmaW5lIEZEV0FQSV9ICiAgCisgI2luY2x1ZGUgImZvcmVpZ24vZm9yZWlnbi5o IgogICNpbmNsdWRlICJub2Rlcy9leGVjbm9kZXMuaCIKICAjaW5jbHVkZSAibm9kZXMvcmVs YXRpb24uaCIKKyAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAgCiAgLyogVG8gYXZvaWQgaW5j bHVkaW5nIGV4cGxhaW4uaCBoZXJlLCByZWZlcmVuY2UgRXhwbGFpblN0YXRlIHRodXM6ICov CiAgc3RydWN0IEV4cGxhaW5TdGF0ZTsKKioqKioqKioqKioqKioqCioqKiA2OCw3MyAqKioq IHR5cGVkZWYgdm9pZCAoKlJlU2NhbkZvcmVpZ25TY2FuX2Z1bmN0aW9uKSAoRm9yZWlnblNj YW5TdGF0ZSAqbm9kZSk7Ci0tLSA3MCw3OCAtLS0tCiAgCiAgdHlwZWRlZiB2b2lkICgqRW5k Rm9yZWlnblNjYW5fZnVuY3Rpb24pIChGb3JlaWduU2NhblN0YXRlICpub2RlKTsKICAKKyB0 eXBlZGVmIHZvaWQgKCpBbmFseXplRm9yZWlnblRhYmxlX2Z1bmN0aW9uKSAoUmVsYXRpb24g cmVsYXRpb24sCisgCQkJCQkJCQkJCQkgIFZhY3V1bVN0bXQgKnZhY3N0bXQsCisgCQkJCQkJ CQkJCQkgIGludCBlbGV2ZWwpOwogIAogIC8qCiAgICogRmR3Um91dGluZSBpcyB0aGUgc3Ry dWN0IHJldHVybmVkIGJ5IGEgZm9yZWlnbi1kYXRhIHdyYXBwZXIncyBoYW5kbGVyCioqKioq KioqKioqKioqKgoqKiogODgsOTMgKioqKiB0eXBlZGVmIHN0cnVjdCBGZHdSb3V0aW5lCi0t LSA5Myw5OSAtLS0tCiAgCUl0ZXJhdGVGb3JlaWduU2Nhbl9mdW5jdGlvbiBJdGVyYXRlRm9y ZWlnblNjYW47CiAgCVJlU2NhbkZvcmVpZ25TY2FuX2Z1bmN0aW9uIFJlU2NhbkZvcmVpZ25T Y2FuOwogIAlFbmRGb3JlaWduU2Nhbl9mdW5jdGlvbiBFbmRGb3JlaWduU2NhbjsKKyAJQW5h bHl6ZUZvcmVpZ25UYWJsZV9mdW5jdGlvbiBBbmFseXplRm9yZWlnblRhYmxlOwogIH0gRmR3 Um91dGluZTsKICAKICAK --------------090606060704000703020708--