Received: from magus.postgresql.org (magus.postgresql.org [87.238.57.229]) by mail.postgresql.org (Postfix) with ESMTP id C3C771F6070A for ; Fri, 9 Dec 2011 08:08:08 -0400 (AST) Received: from tama500.ecl.ntt.co.jp ([129.60.39.148]) by magus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1RYzFA-00080a-Sl for pgsql-hackers@postgresql.org; Fri, 09 Dec 2011 12:08:07 +0000 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 pB9C7fAI024600; Fri, 9 Dec 2011 21:07:41 +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 B944365F1; Fri, 9 Dec 2011 21:07:41 +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 9F1BD65EB; Fri, 9 Dec 2011 21:07:41 +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 pB9C7fDT009992; Fri, 9 Dec 2011 21:07:41 +0900 (JST) Received: from localhost by mailsv01.y.ecl.ntt.co.jp (8.14.5/Lab-1.9) with ESMTP id pB9C7fCD026574; Fri, 9 Dec 2011 21:07:41 +0900 (JST) Message-ID: <4EE1FC38.5080707@lab.ntt.co.jp> Date: Fri, 09 Dec 2011 21:16:56 +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> <4E9FF04B.3050504@lab.ntt.co.jp> <4EB7C07A.5030205@gmail.com> <4EC60883.2050905@lab.ntt.co.jp> <4EC648CA.5050904@gmail.com> <4EC9CBC5.3070500@lab.ntt.co.jp> In-Reply-To: <4EC9CBC5.3070500@lab.ntt.co.jp> Content-Type: multipart/mixed; boundary="------------070903080301060501080200" X-Pg-Spam-Score: -3.1 (---) X-Archive-Number: 201112/367 X-Sequence-Number: 199619 This is a multi-part message in MIME format. --------------070903080301060501080200 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Hi Hanada-san, I updated the patch. Please find attached a patch. Best regards, Etsuro Fujita > (2011/11/18 21:00), Shigeru Hanada wrote: >> (2011/11/18 16:25), Etsuro Fujita wrote: >>> Thank you for your testing. I updated the patch according to your >>> comments. Attached is the updated version of the patch. >> >> I'd like to share result of my review even though it's not fully >> finished. So far I looked from viewpoint of API design, code >> formatting, and documentation. I'll examine effectiveness of the patch >> and details of implementation next week, and hopefully try writing >> ANALYZE handler for pgsql_fdw :) >> >> New patch has correct format, and it could be applied to HEAD of master >> branch cleanly. All regression tests including those of contrib modules >> have passed. It contains changes of codes and regression tests related >> to the issue, and they have enough comments. IMO the document in this >> patch is not enough to show how to write analyze handler to FDW authors, >> but it can be enhanced afterward. With this patch, FDW author can >> provide optional ANALYZE handler which updates statistics of foreign >> tables. Planner would be able to generate better plan by using statistics. >> >>> Yes. But in the updated version, I've refactored analyze.c a little bit >>> to allow FDW authors to simply call do_analyze_rel(). >> >>> The updated version enables FDW authors to just write their own >>> acquire_sample_rows(). On the other hand, by retaining to hook >>> AnalyzeForeignTable routine at analyze_rel(), higher level than >>> acquire_sample_rows() as before, it allows FDW authors to write >>> AnalyzeForeignTable routine for foreign tables on a remote server to ask >>> the server for its current stats instead, as pointed out earlier by Tom >>> Lane. >> >> IIUC, this patch offers three options to FDWs: a) set >> AnalyzeForeignTable to NULL to indicate lack of capability, b) provide >> AnalyzeForeignTable which calls do_analyze_rel with custom >> sample_row_acquirer, and c) create statistics data from scratch by FDW >> itself by doing similar things to do_analyze_rel with given argument or >> copying statistics from remote PostgreSQL server. >> >> ISTM that this design is well-balanced between simplicity and >> flexibility. Maybe these three options would suit web-based wrappers, >> file-based or RDBMS wrappers, and pgsql_fdw respectively. I think that >> adding more details of FdwRoutine, such as purpose of new callback >> function and difference from required ones, would help FDW authors, >> including me :) >> >> I have some random comments: >> >> - I think separated typedef of sample_acquire_rows would make codes more >> readable. In addition, parameters of the function should be described >> explicitly. >> - I couldn't see the reason why file_fdw sets ctid of sample tuples, >> though I guess it's for Vitter's random sampling algorithm. If every >> FDW must set valid ctid to sample tuples, it should be mentioned in >> document of AnalyzeForeignTable. Exporting some functions from >> analyze.c relates this issue? >> - Why file_fdw skips sample tuples which have NULL value? AFAIS >> original acquire_sample_rows doesn't do so. >> - Some comment lines go past 80 columns. >> - Some headers included in file_fdw.c seems unnecessary. >> >> Regards, > > --------------070903080301060501080200 Content-Type: text/plain; name="postgresql-analyze-v5.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="postgresql-analyze-v5.patch" KioqIGEvY29udHJpYi9maWxlX2Zkdy9maWxlX2Zkdy5jCi0tLSBiL2NvbnRyaWIvZmlsZV9m ZHcvZmlsZV9mZHcuYwoqKioqKioqKioqKioqKioKKioqIDIwLDI1ICoqKioKLS0tIDIwLDI2 IC0tLS0KICAjaW5jbHVkZSAiY29tbWFuZHMvY29weS5oIgogICNpbmNsdWRlICJjb21tYW5k cy9kZWZyZW0uaCIKICAjaW5jbHVkZSAiY29tbWFuZHMvZXhwbGFpbi5oIgorICNpbmNsdWRl ICJjb21tYW5kcy92YWN1dW0uaCIKICAjaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKICAj aW5jbHVkZSAiZm9yZWlnbi9mb3JlaWduLmgiCiAgI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgoq KioqKioqKioqKioqKioKKioqIDEwMSwxMDYgKioqKiBzdGF0aWMgdm9pZCBmaWxlQmVnaW5G b3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlLCBpbnQgZWZsYWdzKTsKLS0tIDEw MiwxMDggLS0tLQogIHN0YXRpYyBUdXBsZVRhYmxlU2xvdCAqZmlsZUl0ZXJhdGVGb3JlaWdu U2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlKTsKICBzdGF0aWMgdm9pZCBmaWxlUmVTY2Fu Rm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSk7CiAgc3RhdGljIHZvaWQgZmls ZUVuZEZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUpOworIHN0YXRpYyB2b2lk IGZpbGVBbmFseXplRm9yZWlnblRhYmxlKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAq dmFjc3RtdCwgaW50IGVsZXZlbCk7CiAgCiAgLyoKICAgKiBIZWxwZXIgZnVuY3Rpb25zCioq KioqKioqKioqKioqKgoqKiogMTEyLDExOCAqKioqIHN0YXRpYyBMaXN0ICpnZXRfZmlsZV9m ZHdfYXR0cmlidXRlX29wdGlvbnMoT2lkIHJlbGlkKTsKICBzdGF0aWMgdm9pZCBlc3RpbWF0 ZV9jb3N0cyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqYmFzZXJlbCwKICAJCQkg ICBjb25zdCBjaGFyICpmaWxlbmFtZSwKICAJCQkgICBDb3N0ICpzdGFydHVwX2Nvc3QsIENv c3QgKnRvdGFsX2Nvc3QpOwohIAogIAogIC8qCiAgICogRm9yZWlnbi1kYXRhIHdyYXBwZXIg aGFuZGxlciBmdW5jdGlvbjogcmV0dXJuIGEgc3RydWN0IHdpdGggcG9pbnRlcnMKLS0tIDEx NCwxMjMgLS0tLQogIHN0YXRpYyB2b2lkIGVzdGltYXRlX2Nvc3RzKFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICpiYXNlcmVsLAogIAkJCSAgIGNvbnN0IGNoYXIgKmZpbGVuYW1l LAogIAkJCSAgIENvc3QgKnN0YXJ0dXBfY29zdCwgQ29zdCAqdG90YWxfY29zdCk7CiEgc3Rh dGljIGludAlhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwKISAJCQkgICBI ZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKISAJCQkgICBkb3VibGUgKnRvdGFscm93 cywgZG91YmxlICp0b3RhbGRlYWRyb3dzLAohIAkJCSAgIEJsb2NrTnVtYmVyICp0b3RhbHBh Z2VzLCBpbnQgZWxldmVsKTsKICAKICAvKgogICAqIEZvcmVpZ24tZGF0YSB3cmFwcGVyIGhh bmRsZXIgZnVuY3Rpb246IHJldHVybiBhIHN0cnVjdCB3aXRoIHBvaW50ZXJzCioqKioqKioq KioqKioqKgoqKiogMTI5LDEzNCAqKioqIGZpbGVfZmR3X2hhbmRsZXIoUEdfRlVOQ1RJT05f QVJHUykKLS0tIDEzNCwxNDAgLS0tLQogIAlmZHdyb3V0aW5lLT5JdGVyYXRlRm9yZWlnblNj YW4gPSBmaWxlSXRlcmF0ZUZvcmVpZ25TY2FuOwogIAlmZHdyb3V0aW5lLT5SZVNjYW5Gb3Jl aWduU2NhbiA9IGZpbGVSZVNjYW5Gb3JlaWduU2NhbjsKICAJZmR3cm91dGluZS0+RW5kRm9y ZWlnblNjYW4gPSBmaWxlRW5kRm9yZWlnblNjYW47CisgCWZkd3JvdXRpbmUtPkFuYWx5emVG b3JlaWduVGFibGUgPSBmaWxlQW5hbHl6ZUZvcmVpZ25UYWJsZTsKICAKICAJUEdfUkVUVVJO X1BPSU5URVIoZmR3cm91dGluZSk7CiAgfQoqKioqKioqKioqKioqKioKKioqIDU3NSw1ODAg KioqKiBmaWxlUmVTY2FuRm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSkKLS0t IDU4MSw1OTggLS0tLQogIH0KICAKICAvKgorICAqIGZpbGVBbmFseXplRm9yZWlnblRhYmxl CisgICoJCUFuYWx5emUgdGFibGUKKyAgKi8KKyBzdGF0aWMgdm9pZAorIGZpbGVBbmFseXpl Rm9yZWlnblRhYmxlKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgaW50 IGVsZXZlbCkKKyB7CisgCWRvX2FuYWx5emVfcmVsKG9uZXJlbCwgdmFjc3RtdCwKKyAJCQkJ ICAgZWxldmVsLCBmYWxzZSwKKyAJCQkJICAgYWNxdWlyZV9zYW1wbGVfcm93cyk7CisgfQor IAorIC8qCiAgICogRXN0aW1hdGUgY29zdHMgb2Ygc2Nhbm5pbmcgYSBmb3JlaWduIHRhYmxl LgogICAqLwogIHN0YXRpYyB2b2lkCioqKioqKioqKioqKioqKgoqKiogNTg0LDU5MCAqKioq IGVzdGltYXRlX2Nvc3RzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpiYXNlcmVs LAogIHsKICAJc3RydWN0IHN0YXQgc3RhdF9idWY7CiAgCUJsb2NrTnVtYmVyIHBhZ2VzOwoh IAlpbnQJCQl0dXBsZV93aWR0aDsKICAJZG91YmxlCQludHVwbGVzOwogIAlkb3VibGUJCW5y b3dzOwogIAlDb3N0CQlydW5fY29zdCA9IDA7Ci0tLSA2MDIsNjA5IC0tLS0KICB7CiAgCXN0 cnVjdCBzdGF0IHN0YXRfYnVmOwogIAlCbG9ja051bWJlciBwYWdlczsKISAJQmxvY2tOdW1i ZXIJcmVscGFnZXM7CiEgCWRvdWJsZQkJcmVsdHVwbGVzOwogIAlkb3VibGUJCW50dXBsZXM7 CiAgCWRvdWJsZQkJbnJvd3M7CiAgCUNvc3QJCXJ1bl9jb3N0ID0gMDsKKioqKioqKioqKioq KioqCioqKiA2MDQsNjE5ICoqKiogZXN0aW1hdGVfY29zdHMoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKmJhc2VyZWwsCiAgCWlmIChwYWdlcyA8IDEpCiAgCQlwYWdlcyA9IDE7 CiAgCiEgCS8qCiEgCSAqIEVzdGltYXRlIHRoZSBudW1iZXIgb2YgdHVwbGVzIGluIHRoZSBm aWxlLiAgV2UgYmFjayBpbnRvIHRoaXMgZXN0aW1hdGUKISAJICogdXNpbmcgdGhlIHBsYW5u ZXIncyBpZGVhIG9mIHRoZSByZWxhdGlvbiB3aWR0aDsgd2hpY2ggaXMgYm9ndXMgaWYgbm90 CiEgCSAqIGFsbCBjb2x1bW5zIGFyZSBiZWluZyByZWFkLCBub3QgdG8gbWVudGlvbiB0aGF0 IHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uCiEgCSAqIG9mIGEgcm93IHByb2JhYmx5IGlzbid0 IHRoZSBzYW1lIHNpemUgYXMgaXRzIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgohIAkgKiBG SVhNRSBsYXRlci4KISAJICovCiEgCXR1cGxlX3dpZHRoID0gTUFYQUxJR04oYmFzZXJlbC0+ d2lkdGgpICsgTUFYQUxJR04oc2l6ZW9mKEhlYXBUdXBsZUhlYWRlckRhdGEpKTsKICAKISAJ bnR1cGxlcyA9IGNsYW1wX3Jvd19lc3QoKGRvdWJsZSkgc3RhdF9idWYuc3Rfc2l6ZSAvIChk b3VibGUpIHR1cGxlX3dpZHRoKTsKICAKICAJLyoKICAJICogTm93IGVzdGltYXRlIHRoZSBu dW1iZXIgb2Ygcm93cyByZXR1cm5lZCBieSB0aGUgc2NhbiBhZnRlciBhcHBseWluZyB0aGUK LS0tIDYyMyw2NTQgLS0tLQogIAlpZiAocGFnZXMgPCAxKQogIAkJcGFnZXMgPSAxOwogIAoh IAlyZWxwYWdlcyA9IGJhc2VyZWwtPnBhZ2VzOwohIAlyZWx0dXBsZXMgPSBiYXNlcmVsLT50 dXBsZXM7CiEgCiEgCWlmIChyZWxwYWdlcyA+IDApCiEgCXsKISAJCWRvdWJsZQkJZGVuc2l0 eTsKICAKISAJCWRlbnNpdHkgPSByZWx0dXBsZXMgLyAoZG91YmxlKSByZWxwYWdlczsKISAK ISAJCW50dXBsZXMgPSBjbGFtcF9yb3dfZXN0KGRlbnNpdHkgKiAoZG91YmxlKSBwYWdlcyk7 CiEgCX0KISAJZWxzZQohIAl7CiEgCQlpbnQJCQl0dXBsZV93aWR0aDsKISAKISAJCS8qCiEg CQkgKiBFc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHR1cGxlcyBpbiB0aGUgZmlsZS4gIFdlIGJh Y2sgaW50byB0aGlzIGVzdGltYXRlCiEgCQkgKiB1c2luZyB0aGUgcGxhbm5lcidzIGlkZWEg b2YgdGhlIHJlbGF0aW9uIHdpZHRoOyB3aGljaCBpcyBib2d1cyBpZiBub3QKISAJCSAqIGFs bCBjb2x1bW5zIGFyZSBiZWluZyByZWFkLCBub3QgdG8gbWVudGlvbiB0aGF0IHRoZSB0ZXh0 IHJlcHJlc2VudGF0aW9uCiEgCQkgKiBvZiBhIHJvdyBwcm9iYWJseSBpc24ndCB0aGUgc2Ft ZSBzaXplIGFzIGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KISAJCSAqIEZJWE1FIGxh dGVyLgohIAkJICovCiEgCQl0dXBsZV93aWR0aCA9IE1BWEFMSUdOKGJhc2VyZWwtPndpZHRo KSArIE1BWEFMSUdOKHNpemVvZihIZWFwVHVwbGVIZWFkZXJEYXRhKSk7CiEgCiEgCQludHVw bGVzID0gY2xhbXBfcm93X2VzdCgoZG91YmxlKSBzdGF0X2J1Zi5zdF9zaXplIC8gKGRvdWJs ZSkgdHVwbGVfd2lkdGgpOwohIAl9CiAgCiAgCS8qCiAgCSAqIE5vdyBlc3RpbWF0ZSB0aGUg bnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgYnkgdGhlIHNjYW4gYWZ0ZXIgYXBwbHlpbmcgdGhl CioqKioqKioqKioqKioqKgoqKiogNjQ1LDY0NyAqKioqIGVzdGltYXRlX2Nvc3RzKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpiYXNlcmVsLAotLS0gNjgwLDg2NyAtLS0tCiAg CXJ1bl9jb3N0ICs9IGNwdV9wZXJfdHVwbGUgKiBudHVwbGVzOwogIAkqdG90YWxfY29zdCA9 ICpzdGFydHVwX2Nvc3QgKyBydW5fY29zdDsKICB9CisgCisgLyoKKyAgKiBhY3F1aXJlX3Nh bXBsZV9yb3dzIC0tIGFjcXVpcmUgYSByYW5kb20gc2FtcGxlIG9mIHJvd3MgZnJvbSB0aGUg dGFibGUKKyAgKgorICAqIFNlbGVjdGVkIHJvd3MgYXJlIHJldHVybmVkIGluIHRoZSBjYWxs ZXItYWxsb2NhdGVkIGFycmF5IHJvd3NbXSwgd2hpY2gKKyAgKiBtdXN0IGhhdmUgYXQgbGVh c3QgdGFyZ3Jvd3MgZW50cmllcy4KKyAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiByb3dzIHNl bGVjdGVkIGlzIHJldHVybmVkIGFzIHRoZSBmdW5jdGlvbiByZXN1bHQuCisgICogV2UgYWxz byBjb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLCBhbmQgcmV0dXJuIGl0 IGludG8gKnRvdGFscm93cy4KKyAgKgorICAqIFRoZSByZXR1cm5lZCBsaXN0IG9mIHR1cGxl cyBpcyBpbiBvcmRlciBieSBwaHlzaWNhbCBwb3NpdGlvbiBpbiB0aGUgdGFibGUuCisgICog KFdlIHdpbGwgcmVseSBvbiB0aGlzIGxhdGVyIHRvIGRlcml2ZSBjb3JyZWxhdGlvbiBlc3Rp bWF0ZXMuKQorICAqLworIHN0YXRpYyBpbnQKKyBhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0 aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCisgCQkJCQlkb3Vi bGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzLAorIAkJCQkJQmxvY2tOdW1i ZXIgKnRvdGFscGFnZXMsIGludCBlbGV2ZWwpCisgeworIAlpbnQJCQludW1yb3dzID0gMDsK KyAJaW50CQkJaW52YWxyb3dzID0gMDsgICAvKiB0b3RhbCAjIHJvd3MgdmlvbGF0aW5nIHRo ZSBOT1QgTlVMTCBjb25zdHJhaW50cyAqLworIAlkb3VibGUJCXZhbGlkcm93cyA9IDA7CSAv KiB0b3RhbCAjIHJvd3MgY29sbGVjdGVkICovCisgCWRvdWJsZQkJcm93c3Rvc2tpcCA9IC0x OyAvKiAtMSBtZWFucyBub3Qgc2V0IHlldCAqLworIAlkb3VibGUJCXJzdGF0ZTsKKyAJSGVh cFR1cGxlCXR1cGxlOworIAlUdXBsZURlc2MJdHVwRGVzYzsKKyAJVHVwbGVDb25zdHIgKmNv bnN0cjsKKyAJaW50CQkJbmF0dHM7CisgCWludAkJCWF0dHJDaGs7CisgCURhdHVtCSAgICp2 YWx1ZXM7CisgCWJvb2wJICAgKm51bGxzOworIAlib29sCQlmb3VuZDsKKyAJYm9vbAkJc2Ft cGxlX2l0ID0gZmFsc2U7CisgCWNoYXIJICAgKmZpbGVuYW1lOworIAlzdHJ1Y3Qgc3RhdAlz dGF0X2J1ZjsKKyAJTGlzdAkgICAqb3B0aW9uczsKKyAJQ29weVN0YXRlCWNzdGF0ZTsKKyAJ RXJyb3JDb250ZXh0Q2FsbGJhY2sgZXJyY29udGV4dDsKKyAKKyAJQXNzZXJ0KG9uZXJlbCk7 CisgCUFzc2VydCh0YXJncm93cyA+IDApOworIAorIAl0dXBEZXNjID0gUmVsYXRpb25HZXRE ZXNjcihvbmVyZWwpOworIAljb25zdHIgPSB0dXBEZXNjLT5jb25zdHI7CisgCW5hdHRzID0g dHVwRGVzYy0+bmF0dHM7CisgCXZhbHVlcyA9IChEYXR1bSAqKSBwYWxsb2ModHVwRGVzYy0+ bmF0dHMgKiBzaXplb2YoRGF0dW0pKTsKKyAJbnVsbHMgPSAoYm9vbCAqKSBwYWxsb2ModHVw RGVzYy0+bmF0dHMgKiBzaXplb2YoYm9vbCkpOworIAorIAkvKiBGZXRjaCBvcHRpb25zIG9m IGZvcmVpZ24gdGFibGUgKi8KKyAJZmlsZUdldE9wdGlvbnMoUmVsYXRpb25HZXRSZWxpZChv bmVyZWwpLCAmZmlsZW5hbWUsICZvcHRpb25zKTsKKyAKKyAJLyoKKyAJICogR2V0IHNpemUg b2YgdGhlIGZpbGUuCisgCSAqLworIAlpZiAoc3RhdChmaWxlbmFtZSwgJnN0YXRfYnVmKSA8 IDApCisgCQllcmVwb3J0KEVSUk9SLAorIAkJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3Mo KSwKKyAJCQkJIGVycm1zZygiY291bGQgbm90IHN0YXQgZmlsZSBcIiVzXCI6ICVtIiwKKyAJ CQkJCQlmaWxlbmFtZSkpKTsKKyAKKyAJLyoKKyAJICogQ29udmVydCBzaXplIHRvIHBhZ2Vz IGZvciB1c2UgaW4gSS9PIGNvc3QgZXN0aW1hdGUuCisgCSAqLworIAkqdG90YWxwYWdlcyA9 IChzdGF0X2J1Zi5zdF9zaXplICsgKEJMQ0tTWiAtIDEpKSAvIEJMQ0tTWjsKKyAJaWYgKCp0 b3RhbHBhZ2VzIDwgMSkKKyAJCSp0b3RhbHBhZ2VzID0gMTsKKyAKKyAJLyoKKyAJICogQ3Jl YXRlIENvcHlTdGF0ZSBmcm9tIEZEVyBvcHRpb25zLiAgV2UgYWx3YXlzIGFjcXVpcmUgYWxs IGNvbHVtbnMsIHNvCisgCSAqIGFzIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBTY2FuVHVwbGVT bG90IHNpZ25hdHVyZS4KKyAJICovCisgCWNzdGF0ZSA9IEJlZ2luQ29weUZyb20ob25lcmVs LCBmaWxlbmFtZSwgTklMLCBvcHRpb25zKTsKKyAKKyAJLyogUHJlcGFyZSBmb3Igc2FtcGxp bmcgcm93cyAqLworIAlyc3RhdGUgPSBpbml0X3NlbGVjdGlvbl9zdGF0ZSh0YXJncm93cyk7 CisgCisgCS8qIFNldCB1cCBjYWxsYmFjayB0byBpZGVudGlmeSBlcnJvciBsaW5lIG51bWJl ci4gKi8KKyAJZXJyY29udGV4dC5jYWxsYmFjayA9IENvcHlGcm9tRXJyb3JDYWxsYmFjazsK KyAJZXJyY29udGV4dC5hcmcgPSAodm9pZCAqKSBjc3RhdGU7CisgCWVycmNvbnRleHQucHJl dmlvdXMgPSBlcnJvcl9jb250ZXh0X3N0YWNrOworIAllcnJvcl9jb250ZXh0X3N0YWNrID0g JmVycmNvbnRleHQ7CisgCisgCWZvciAoOzspCisgCXsKKyAJCXNhbXBsZV9pdCA9IHRydWU7 CisgCisgCQkvKgorIAkJICogQ2hlY2sgZm9yIHVzZXItcmVxdWVzdGVkIGFib3J0LgorIAkJ ICovCisgCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOworIAorIAkJZm91bmQgPSBOZXh0Q29w eUZyb20oY3N0YXRlLCBOVUxMLCB2YWx1ZXMsIG51bGxzLCBOVUxMKTsKKyAKKyAJCWlmICgh Zm91bmQpCisgCQkJYnJlYWs7CisgCisgCQl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZSh0dXBE ZXNjLCB2YWx1ZXMsIG51bGxzKTsKKyAKKyAJCWlmIChjb25zdHIgJiYgY29uc3RyLT5oYXNf bm90X251bGwpCisgCQl7CisgCQkJZm9yIChhdHRyQ2hrID0gMTsgYXR0ckNoayA8PSBuYXR0 czsgYXR0ckNoaysrKQorIAkJCXsKKyAJCQkJaWYgKG9uZXJlbC0+cmRfYXR0LT5hdHRyc1th dHRyQ2hrIC0gMV0tPmF0dG5vdG51bGwgJiYKKyAJCQkJCWhlYXBfYXR0aXNudWxsKHR1cGxl LCBhdHRyQ2hrKSkKKyAJCQkJeworIAkJCQkJc2FtcGxlX2l0ID0gZmFsc2U7CisgCQkJCQli cmVhazsKKyAJCQkJfQorIAkJCX0KKyAJCX0KKyAKKyAJCWlmICghc2FtcGxlX2l0KQorIAkJ eworIAkJCWludmFscm93cyArPSAxOworIAkJCWhlYXBfZnJlZXR1cGxlKHR1cGxlKTsKKyAJ CQljb250aW51ZTsKKyAJCX0KKyAKKyAJCS8qCisgCQkgKiBUaGUgZmlyc3QgdGFyZ3Jvd3Mg c2FtcGxlIHJvd3MgYXJlIHNpbXBseSBjb3BpZWQgaW50byB0aGUKKyAJCSAqIHJlc2Vydm9p ci4gVGhlbiB3ZSBzdGFydCByZXBsYWNpbmcgdHVwbGVzIGluIHRoZSBzYW1wbGUKKyAJCSAq IHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHJlbGF0aW9uLglUaGlzIGFsZ29yaXRo bSBpcworIAkJICogZnJvbSBKZWZmIFZpdHRlcidzIHBhcGVyIChzZWUgZnVsbCBjaXRhdGlv biBiZWxvdykuIEl0CisgCQkgKiB3b3JrcyBieSByZXBlYXRlZGx5IGNvbXB1dGluZyB0aGUg bnVtYmVyIG9mIHR1cGxlcyB0byBza2lwCisgCQkgKiBiZWZvcmUgc2VsZWN0aW5nIGEgdHVw bGUsIHdoaWNoIHJlcGxhY2VzIGEgcmFuZG9tbHkgY2hvc2VuCisgCQkgKiBlbGVtZW50IG9m IHRoZSByZXNlcnZvaXIgKGN1cnJlbnQgc2V0IG9mIHR1cGxlcykuICBBdCBhbGwKKyAJCSAq IHRpbWVzIHRoZSByZXNlcnZvaXIgaXMgYSB0cnVlIHJhbmRvbSBzYW1wbGUgb2YgdGhlIHR1 cGxlcworIAkJICogd2UndmUgcGFzc2VkIG92ZXIgc28gZmFyLCBzbyB3aGVuIHdlIGZhbGwg b2ZmIHRoZSBlbmQgb2YKKyAJCSAqIHRoZSByZWxhdGlvbiB3ZSdyZSBkb25lLgorIAkJICov CisgCQlpZiAobnVtcm93cyA8IHRhcmdyb3dzKQorIAkJCXJvd3NbbnVtcm93cysrXSA9IGhl YXBfY29weXR1cGxlKHR1cGxlKTsKKyAJCWVsc2UKKyAJCXsKKyAJCQkvKgorIAkJCSAqIHQg aW4gVml0dGVyJ3MgcGFwZXIgaXMgdGhlIG51bWJlciBvZiByZWNvcmRzIGFscmVhZHkKKyAJ CQkgKiBwcm9jZXNzZWQuICBJZiB3ZSBuZWVkIHRvIGNvbXB1dGUgYSBuZXcgUyB2YWx1ZSwg d2UKKyAJCQkgKiBtdXN0IHVzZSB0aGUgbm90LXlldC1pbmNyZW1lbnRlZCB2YWx1ZSBvZiBz YW1wbGVyb3dzIGFzCisgCQkJICogdC4KKyAJCQkgKi8KKyAJCQlpZiAocm93c3Rvc2tpcCA8 IDApCisgCQkJCXJvd3N0b3NraXAgPSBnZXRfbmV4dF9TKHZhbGlkcm93cywgdGFyZ3Jvd3Ms ICZyc3RhdGUpOworIAorIAkJCWlmIChyb3dzdG9za2lwIDw9IDApCisgCQkJeworIAkJCQkv KgorIAkJCQkgKiBGb3VuZCBhIHN1aXRhYmxlIHR1cGxlLCBzbyBzYXZlIGl0LCByZXBsYWNp bmcgb25lCisgCQkJCSAqIG9sZCB0dXBsZSBhdCByYW5kb20KKyAJCQkJICovCisgCQkJCWlu dCBrID0gKGludCkgKHRhcmdyb3dzICogcmFuZG9tX2ZyYWN0KCkpOworIAorIAkJCQlBc3Nl cnQoayA+PSAwICYmIGsgPCB0YXJncm93cyk7CisgCQkJCWhlYXBfZnJlZXR1cGxlKHJvd3Nb a10pOworIAkJCQlyb3dzW2tdID0gaGVhcF9jb3B5dHVwbGUodHVwbGUpOworIAkJCX0KKyAK KyAJCQlyb3dzdG9za2lwIC09IDE7CisgCQl9CisgCisgCQl2YWxpZHJvd3MgKz0gMTsKKyAJ CWhlYXBfZnJlZXR1cGxlKHR1cGxlKTsKKyAJfQorIAorIAkvKiBSZW1vdmUgZXJyb3IgY2Fs bGJhY2suICovCisgCWVycm9yX2NvbnRleHRfc3RhY2sgPSBlcnJjb250ZXh0LnByZXZpb3Vz OworIAorIAkqdG90YWxyb3dzID0gdmFsaWRyb3dzOworIAkqdG90YWxkZWFkcm93cyA9IDA7 CisgCisgCUVuZENvcHlGcm9tKGNzdGF0ZSk7CisgCisgCXBmcmVlKHZhbHVlcyk7CisgCXBm cmVlKG51bGxzKTsKKyAKKyAJLyoKKyAJICogRW1pdCBzb21lIGludGVyZXN0aW5nIHJlbGF0 aW9uIGluZm8KKyAJICovCisgCWVyZXBvcnQoZWxldmVsLAorIAkJCShlcnJtc2coIlwiJXNc Ijogc2Nhbm5lZCwgIgorIAkJCQkJImNvbnRhaW5pbmcgJWQgdmFsaWQgcm93cyBhbmQgJWQg aW52YWxpZCByb3dzOyAiCisgCQkJCQkiJWQgcm93cyBpbiBzYW1wbGUsICVkIHRvdGFsIHJv d3MiLAorIAkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSwKKyAJCQkJCShp bnQpIHZhbGlkcm93cywgaW52YWxyb3dzLAorIAkJCQkJbnVtcm93cywgKGludCkgKnRvdGFs cm93cykpKTsKKyAKKyAJcmV0dXJuIG51bXJvd3M7CisgfQoqKiogYS9jb250cmliL2ZpbGVf ZmR3L2lucHV0L2ZpbGVfZmR3LnNvdXJjZQotLS0gYi9jb250cmliL2ZpbGVfZmR3L2lucHV0 L2ZpbGVfZmR3LnNvdXJjZQoqKioqKioqKioqKioqKioKKioqIDExMSwxMTYgKioqKiBFWEVD VVRFIHN0KDEwMCk7Ci0tLSAxMTEsMTIxIC0tLS0KICBFWEVDVVRFIHN0KDEwMCk7CiAgREVB TExPQ0FURSBzdDsKICAKKyAtLSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gdGVzdHMKKyBBTkFM WVpFIGFnZ19jc3Y7CisgU0VMRUNUIHJlbHBhZ2VzLCByZWx0dXBsZXMgRlJPTSBwZ19jbGFz cyBXSEVSRSByZWxuYW1lID0gJ2FnZ19jc3YnOworIFNFTEVDVCAqIEZST00gcGdfc3RhdHMg V0hFUkUgdGFibGVuYW1lID0gJ2FnZ19jc3YnOworIAogIC0tIHRhYmxlb2lkCiAgU0VMRUNU IHRhYmxlb2lkOjpyZWdjbGFzcywgYiBGUk9NIGFnZ19jc3Y7CiAgCioqKiBhL2NvbnRyaWIv ZmlsZV9mZHcvb3V0cHV0L2ZpbGVfZmR3LnNvdXJjZQotLS0gYi9jb250cmliL2ZpbGVfZmR3 L291dHB1dC9maWxlX2Zkdy5zb3VyY2UKKioqKioqKioqKioqKioqCioqKiAxNzQsMTc5ICoq KiogRVhFQ1VURSBzdCgxMDApOwotLS0gMTc0LDE5NCAtLS0tCiAgKDEgcm93KQogIAogIERF QUxMT0NBVEUgc3Q7CisgLS0gc3RhdGlzdGljcyBjb2xsZWN0aW9uIHRlc3RzCisgQU5BTFla RSBhZ2dfY3N2OworIFNFTEVDVCByZWxwYWdlcywgcmVsdHVwbGVzIEZST00gcGdfY2xhc3Mg V0hFUkUgcmVsbmFtZSA9ICdhZ2dfY3N2JzsKKyAgcmVscGFnZXMgfCByZWx0dXBsZXMgCisg LS0tLS0tLS0tLSstLS0tLS0tLS0tLQorICAgICAgICAgMSB8ICAgICAgICAgMworICgxIHJv dykKKyAKKyBTRUxFQ1QgKiBGUk9NIHBnX3N0YXRzIFdIRVJFIHRhYmxlbmFtZSA9ICdhZ2df Y3N2JzsKKyAgc2NoZW1hbmFtZSB8IHRhYmxlbmFtZSB8IGF0dG5hbWUgfCBpbmhlcml0ZWQg fCBudWxsX2ZyYWMgfCBhdmdfd2lkdGggfCBuX2Rpc3RpbmN0IHwgbW9zdF9jb21tb25fdmFs cyB8IG1vc3RfY29tbW9uX2ZyZXFzIHwgICAgaGlzdG9ncmFtX2JvdW5kcyAgICAgfCBjb3Jy ZWxhdGlvbiAKKyAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0KKyAgcHVibGljICAgICB8IGFnZ19jc3YgICB8IGEgICAgICAgfCBmICAg ICAgICAgfCAgICAgICAgIDAgfCAgICAgICAgIDIgfCAgICAgICAgIC0xIHwgICAgICAgICAg ICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgezAsNDIsMTAwfSAgICAgICAgICAgICAg fCAgICAgICAgLTAuNQorICBwdWJsaWMgICAgIHwgYWdnX2NzdiAgIHwgYiAgICAgICB8IGYg ICAgICAgICB8ICAgICAgICAgMCB8ICAgICAgICAgNCB8ICAgICAgICAgLTEgfCAgICAgICAg ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCB7MC4wOTU2MSw5OS4wOTcsMzI0Ljc4 fSB8ICAgICAgICAgMC41CisgKDIgcm93cykKKyAKICAtLSB0YWJsZW9pZAogIFNFTEVDVCB0 YWJsZW9pZDo6cmVnY2xhc3MsIGIgRlJPTSBhZ2dfY3N2OwogICB0YWJsZW9pZCB8ICAgIGIg ICAgCioqKiBhL2RvYy9zcmMvc2dtbC9mZHdoYW5kbGVyLnNnbWwKLS0tIGIvZG9jL3NyYy9z Z21sL2Zkd2hhbmRsZXIuc2dtbAoqKioqKioqKioqKioqKioKKioqIDIyOCwyMzMgKioqKiBF bmRGb3JlaWduU2NhbiAoRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSk7Ci0tLSAyMjgsMjU3IC0t LS0KICAgICAgPC9wYXJhPgogIAogICAgICA8cGFyYT4KKyA8cHJvZ3JhbWxpc3Rpbmc+Cisg dm9pZAorIEFuYWx5emVGb3JlaWduVGFibGUgKFJlbGF0aW9uIG9uZXJlbCwKKyAgICAgICAg ICAgICAgICAgICAgICBWYWN1dW1TdG10ICp2YWNzdG10LCAKKyAgICAgICAgICAgICAgICAg ICAgICBpbnQgZWxldmVsKTsKKyA8L3Byb2dyYW1saXN0aW5nPgorIAorICAgICAgQ29sbGVj dCBzdGF0aXN0aWNzIG9uIGEgZm9yZWlnbiB0YWJsZSBhbmQgc3RvcmUgdGhlIHJlc3VsdHMg aW4gdGhlCisgICAgICBwZ19jbGFzcyBhbmQgcGdfc3RhdGlzdGljcyBzeXN0ZW0gY2F0YWxv Z3MuCisgICAgICBUaGlzIGlzIG9wdGlvbmFsLCBhbmQgaWYgaW1wbGVtZW50ZWQsIGNhbGxl ZCB3aGVuIDxjb21tYW5kPkFOQUxZWkUKKyAgICAgIDwvPiBjb21tYW5kIGlzIHJ1bi4KKyAg ICAgIFRoZSBzdGF0aXN0aWNzIGFyZSB1c2VkIGJ5IHRoZSBxdWVyeSBwbGFubmVyIGluIG9y ZGVyIHRvIG1ha2UgZ29vZAorICAgICAgY2hvaWNlcyBvZiBxdWVyeSBwbGFucy4KKyAgICAg IFRoZSBmdW5jdGlvbiBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgd3JpdGluZyBhIHNhbXBsaW5n IGZ1bmN0aW9uIHRoYXQKKyAgICAgIGFjcXVpcmVzIGEgcmFuZG9tIHNhbXBsZSBvZiByb3dz IGZyb20gYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UgYW5kCisgICAgICB0aGVuIGJ5IGNhbGxp bmcgPGZ1bmN0aW9uPmRvX2FuYWx5emVfcmVsPC8+LCB3aGVyZSB5b3Ugc2hvdWxkIHBhc3MK KyAgICAgIHRoZSBzYW1wbGluZyBmdW5jdGlvbiBhcyBhbiBhcmd1bWVudC4KKyAgICAgIE9y IHRoZSBmdW5jdGlvbiBjYW4gYmUgZGlyZWN0bHkgaW1wbGVtZW50ZWQgdG8gZ2V0IHRoZSBz dGF0aXN0aWNzCisgICAgICBmcm9tIGFuIGV4dGVybmFsIGRhdGEgc291cmNlLCB0cmFuc2Zv cm0gaXQgaWYgbmVjY2VzYXJ5LCBhbmQgc3RvcmUKKyAgICAgIGl0IGluIHRoZSBwZ19jbGFz cyBhbmQgcGdfc3RhdGlzdGljcyBzeXN0ZW0gY2F0YWxvZ3MuCisgICAgICBUaGUgZnVuY3Rp b24gbXVzdCBiZSBzZXQgdG8gTlVMTCBpZiBpdCBkb2Vzbid0IGJlIGltcGxlbWVudGVkLgor ICAgICA8L3BhcmE+CisgCisgICAgIDxwYXJhPgogICAgICAgVGhlIDxzdHJ1Y3RuYW1lPkZk d1JvdXRpbmU8Lz4gYW5kIDxzdHJ1Y3RuYW1lPkZkd1BsYW48Lz4gc3RydWN0IHR5cGVzCiAg ICAgICBhcmUgZGVjbGFyZWQgaW4gPGZpbGVuYW1lPnNyYy9pbmNsdWRlL2ZvcmVpZ24vZmR3 YXBpLmg8Lz4sIHdoaWNoIHNlZQogICAgICAgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKioq IGEvZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwKLS0tIGIvZG9jL3NyYy9zZ21sL21h aW50ZW5hbmNlLnNnbWwKKioqKioqKioqKioqKioqCioqKiAyNzksMjg0ICoqKioKLS0tIDI3 OSwyODggLS0tLQogICAgICA8Y29tbWFuZD5BTkFMWVpFPC8+IHN0cmljdGx5IGFzIGEgZnVu Y3Rpb24gb2YgdGhlIG51bWJlciBvZiByb3dzCiAgICAgIGluc2VydGVkIG9yIHVwZGF0ZWQ7 IGl0IGhhcyBubyBrbm93bGVkZ2Ugb2Ygd2hldGhlciB0aGF0IHdpbGwgbGVhZAogICAgICB0 byBtZWFuaW5nZnVsIHN0YXRpc3RpY2FsIGNoYW5nZXMuCisgICAgIE5vdGUgdGhhdCB0aGUg YXV0b3ZhY3V1bSBkYWVtb24gZG9lcyBub3QgaXNzdWUgPGNvbW1hbmQ+QU5BTFlaRTwvPgor ICAgICBjb21tYW5kcyBvbiBmb3JlaWduIHRhYmxlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRv IHJ1biBtYW51YWxseS1tYW5hZ2VkCisgICAgIDxjb21tYW5kPkFOQUxZWkU8Lz4gY29tbWFu ZHMgYXMgbmVlZGVkLCB3aGljaCB0eXBpY2FsbHkgYXJlIGV4ZWN1dGVkCisgICAgIGFjY29y ZGluZyB0byBhIHNjaGVkdWxlIGJ5IGNyb24gb3IgVGFzayBTY2hlZHVsZXIgc2NyaXB0cy4K ICAgICA8L3BhcmE+CiAgCiAgICAgPHBhcmE+CioqKiBhL2RvYy9zcmMvc2dtbC9yZWYvYWx0 ZXJfZm9yZWlnbl90YWJsZS5zZ21sCi0tLSBiL2RvYy9zcmMvc2dtbC9yZWYvYWx0ZXJfZm9y ZWlnbl90YWJsZS5zZ21sCioqKioqKioqKioqKioqKgoqKiogMzYsNDEgKioqKiBBTFRFUiBG T1JFSUdOIFRBQkxFIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5uYW1lPC9yZXBs YWNlYWJsZT4KLS0tIDM2LDQ0IC0tLS0KICAgICAgRFJPUCBbIENPTFVNTiBdIFsgSUYgRVhJ U1RTIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFi bGU+IFsgUkVTVFJJQ1QgfCBDQVNDQURFIF0KICAgICAgQUxURVIgWyBDT0xVTU4gXSA8cmVw bGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJsZT4gWyBTRVQg REFUQSBdIFRZUEUgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPnR5cGU8L3JlcGxh Y2VhYmxlPgogICAgICBBTFRFUiBbIENPTFVNTiBdIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFS QU1FVEVSIj5jb2x1bW48L3JlcGxhY2VhYmxlPiB7IFNFVCB8IERST1AgfSBOT1QgTlVMTAor ICAgICBBTFRFUiBbIENPTFVNTiBdIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5j b2x1bW48L3JlcGxhY2VhYmxlPiBTRVQgU1RBVElTVElDUyA8cmVwbGFjZWFibGUgY2xhc3M9 IlBBUkFNRVRFUiI+aW50ZWdlcjwvcmVwbGFjZWFibGU+CisgICAgIEFMVEVSIFsgQ09MVU1O IF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+ IFNFVCAoIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5hdHRyaWJ1dGVfb3B0aW9u PC9yZXBsYWNlYWJsZT4gPSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+dmFsdWU8 L3JlcGxhY2VhYmxlPiBbLCAuLi4gXSApCisgICAgIEFMVEVSIFsgQ09MVU1OIF0gPHJlcGxh Y2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+IFJFU0VUICgg PHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmF0dHJpYnV0ZV9vcHRpb248L3JlcGxh Y2VhYmxlPiBbLCAuLi4gXSApCiAgICAgIEFMVEVSIFsgQ09MVU1OIF0gPHJlcGxhY2VhYmxl IGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+IE9QVElPTlMgKCBbIEFE RCB8IFNFVCB8IERST1AgXSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+b3B0aW9u PC9yZXBsYWNlYWJsZT4gWyc8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+dmFsdWU8 L3JlcGxhY2VhYmxlPiddIFssIC4uLiBdKQogICAgICBPV05FUiBUTyA8cmVwbGFjZWFibGUg Y2xhc3M9IlBBUkFNRVRFUiI+bmV3X293bmVyPC9yZXBsYWNlYWJsZT4KICAgICAgT1BUSU9O UyAoIFsgQUREIHwgU0VUIHwgRFJPUCBdIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVS Ij5vcHRpb248L3JlcGxhY2VhYmxlPiBbJzxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVS Ij52YWx1ZTwvcmVwbGFjZWFibGU+J10gWywgLi4uIF0pCioqKioqKioqKioqKioqKgoqKiog OTQsOTkgKioqKiBBTFRFUiBGT1JFSUdOIFRBQkxFIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFS QU1FVEVSIj5uYW1lPC9yZXBsYWNlYWJsZT4KLS0tIDk3LDE0NiAtLS0tCiAgICAgPC92YXJs aXN0ZW50cnk+CiAgCiAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgPHRlcm0+PGxpdGVyYWw+ U0VUIFNUQVRJU1RJQ1M8L2xpdGVyYWw+PC90ZXJtPgorICAgICA8bGlzdGl0ZW0+CisgICAg ICA8cGFyYT4KKyAgICAgICBUaGlzIGZvcm0KKyAgICAgICBzZXRzIHRoZSBwZXItY29sdW1u IHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHRhcmdldCBmb3Igc3Vic2VxdWVudAorICAgICAgIDx4 cmVmIGxpbmtlbmQ9InNxbC1hbmFseXplIj4gb3BlcmF0aW9ucy4KKyAgICAgICBUaGUgdGFy Z2V0IGNhbiBiZSBzZXQgaW4gdGhlIHJhbmdlIDAgdG8gMTAwMDA7IGFsdGVybmF0aXZlbHks IHNldCBpdAorICAgICAgIHRvIC0xIHRvIHJldmVydCB0byB1c2luZyB0aGUgc3lzdGVtIGRl ZmF1bHQgc3RhdGlzdGljcworICAgICAgIHRhcmdldCAoPHhyZWYgbGlua2VuZD0iZ3VjLWRl ZmF1bHQtc3RhdGlzdGljcy10YXJnZXQiPikuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlz dGl0ZW0+CisgICAgPC92YXJsaXN0ZW50cnk+CisgCisgICAgPHZhcmxpc3RlbnRyeT4KKyAg ICAgPHRlcm0+PGxpdGVyYWw+U0VUICggPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIi PmF0dHJpYnV0ZV9vcHRpb248L3JlcGxhY2VhYmxlPiA9IDxyZXBsYWNlYWJsZSBjbGFzcz0i UEFSQU1FVEVSIj52YWx1ZTwvcmVwbGFjZWFibGU+IFssIC4uLiBdICk8L2xpdGVyYWw+PC90 ZXJtPgorICAgICA8dGVybT48bGl0ZXJhbD5SRVNFVCAoIDxyZXBsYWNlYWJsZSBjbGFzcz0i UEFSQU1FVEVSIj5hdHRyaWJ1dGVfb3B0aW9uPC9yZXBsYWNlYWJsZT4gWywgLi4uIF0gKTwv bGl0ZXJhbD48L3Rlcm0+CisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAg IFRoaXMgZm9ybQorICAgICAgIHNldHMgb3IgcmVzZXRzIGEgcGVyLWF0dHJpYnV0ZSBvcHRp b24uICBDdXJyZW50bHksIHRoZSBvbmx5IGRlZmluZWQKKyAgICAgICBwZXItYXR0cmlidXRl IG9wdGlvbiBpcyA8bGl0ZXJhbD5uX2Rpc3RpbmN0PC8+LCB3aGljaCBvdmVycmlkZXMKKyAg ICAgICB0aGUgbnVtYmVyLW9mLWRpc3RpbmN0LXZhbHVlcyBlc3RpbWF0ZXMgbWFkZSBieSBz dWJzZXF1ZW50CisgICAgICAgPHhyZWYgbGlua2VuZD0ic3FsLWFuYWx5emUiPiBvcGVyYXRp b25zLiAKKyAgICAgICBXaGVuIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlLCA8Y29tbWFuZD5B TkFMWVpFPC8+IHdpbGwgYXNzdW1lIHRoYXQKKyAgICAgICB0aGUgY29sdW1uIGNvbnRhaW5z IGV4YWN0bHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGlzdGluY3Qgbm9ubnVsbAorICAg ICAgIHZhbHVlcy4KKyAgICAgICBXaGVuIHNldCB0byBhIG5lZ2F0aXZlIHZhbHVlLCB3aGlj aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAgIHRvIC0xLCA8Y29tbWFu ZD5BTkFMWVpFPC8+IHdpbGwgYXNzdW1lIHRoYXQgdGhlIG51bWJlciBvZiBkaXN0aW5jdAor ICAgICAgIG5vbm51bGwgdmFsdWVzIGluIHRoZSBjb2x1bW4gaXMgbGluZWFyIGluIHRoZSBz aXplIG9mIHRoZSBmb3JlaWduCisgICAgICAgdGFibGU7IHRoZSBleGFjdCBjb3VudCBpcyB0 byBiZSBjb21wdXRlZCBieSBtdWx0aXBseWluZyB0aGUgZXN0aW1hdGVkCisgICAgICAgZm9y ZWlnbiB0YWJsZSBzaXplIGJ5IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbnVt YmVyLgorICAgICAgIEZvciBleGFtcGxlLAorICAgICAgIGEgdmFsdWUgb2YgLTEgaW1wbGll cyB0aGF0IGFsbCB2YWx1ZXMgaW4gdGhlIGNvbHVtbiBhcmUgZGlzdGluY3QsCisgICAgICAg d2hpbGUgYSB2YWx1ZSBvZiAtMC41IGltcGxpZXMgdGhhdCBlYWNoIHZhbHVlIGFwcGVhcnMg dHdpY2Ugb24gdGhlCisgICAgICAgYXZlcmFnZS4KKyAgICAgICBUaGlzIGNhbiBiZSB1c2Vm dWwgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgZm9yZWlnbiB0YWJsZSBjaGFuZ2VzIG92ZXIKKyAg ICAgICB0aW1lLCBzaW5jZSB0aGUgbXVsdGlwbGljYXRpb24gYnkgdGhlIG51bWJlciBvZiBy b3dzIGluIHRoZSBmb3JlaWduCisgICAgICAgdGFibGUgaXMgbm90IHBlcmZvcm1lZCB1bnRp bCBxdWVyeSBwbGFubmluZyB0aW1lLiAgU3BlY2lmeSBhIHZhbHVlCisgICAgICAgb2YgMCB0 byByZXZlcnQgdG8gZXN0aW1hdGluZyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHZhbHVlcyBu b3JtYWxseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L3Zhcmxp c3RlbnRyeT4KKyAKKyAgICA8dmFybGlzdGVudHJ5PgogICAgICA8dGVybT48bGl0ZXJhbD5P V05FUjwvbGl0ZXJhbD48L3Rlcm0+CiAgICAgIDxsaXN0aXRlbT4KICAgICAgIDxwYXJhPgoq KiogYS9kb2Mvc3JjL3NnbWwvcmVmL2FuYWx5emUuc2dtbAotLS0gYi9kb2Mvc3JjL3NnbWwv cmVmL2FuYWx5emUuc2dtbAoqKioqKioqKioqKioqKioKKioqIDM5LDQ3ICoqKiogQU5BTFla RSBbIFZFUkJPU0UgXSBbIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj50YWJsZTwv cmVwbGFjZWFibGU+IFsgKCA8cmUKICAKICAgIDxwYXJhPgogICAgIFdpdGggbm8gcGFyYW1l dGVyLCA8Y29tbWFuZD5BTkFMWVpFPC9jb21tYW5kPiBleGFtaW5lcyBldmVyeSB0YWJsZSBp biB0aGUKISAgICBjdXJyZW50IGRhdGFiYXNlLiAgV2l0aCBhIHBhcmFtZXRlciwgPGNvbW1h bmQ+QU5BTFlaRTwvY29tbWFuZD4gZXhhbWluZXMKISAgICBvbmx5IHRoYXQgdGFibGUuICBJ dCBpcyBmdXJ0aGVyIHBvc3NpYmxlIHRvIGdpdmUgYSBsaXN0IG9mIGNvbHVtbiBuYW1lcywK ISAgICBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIHN0YXRpc3RpY3MgZm9yIHRob3NlIGNvbHVt bnMgYXJlIGNvbGxlY3RlZC4KICAgIDwvcGFyYT4KICAgPC9yZWZzZWN0MT4KICAKLS0tIDM5 LDQ5IC0tLS0KICAKICAgIDxwYXJhPgogICAgIFdpdGggbm8gcGFyYW1ldGVyLCA8Y29tbWFu ZD5BTkFMWVpFPC9jb21tYW5kPiBleGFtaW5lcyBldmVyeSB0YWJsZSBpbiB0aGUKISAgICBj dXJyZW50IGRhdGFiYXNlIGV4Y2VwdCBmb3IgZm9yZWlnbiB0YWJsZXMuICBXaXRoIGEgcGFy YW1ldGVyLCA8Y29tbWFuZD4KISAgICBBTkFMWVpFPC9jb21tYW5kPiBleGFtaW5lcyBvbmx5 IHRoYXQgdGFibGUuICBGb3IgYSBmb3JlaWduIHRhYmxlLCBpdCBpcwohICAgIG5lY2Vzc2Fy eSB0byBzcGNpZnkgdGhlIG5hbWUgb2YgdGhhdCB0YWJsZS4gIEl0IGlzIGZ1cnRoZXIgcG9z c2libGUgdG8gCiEgICAgZ2l2ZSBhIGxpc3Qgb2YgY29sdW1uIG5hbWVzLCBpbiB3aGljaCBj YXNlIG9ubHkgdGhlIHN0YXRpc3RpY3MgZm9yIHRob3NlCiEgICAgY29sdW1ucyBhcmUgY29s bGVjdGVkLgogICAgPC9wYXJhPgogICA8L3JlZnNlY3QxPgogIAoqKioqKioqKioqKioqKioK KioqIDYzLDY5ICoqKiogQU5BTFlaRSBbIFZFUkJPU0UgXSBbIDxyZXBsYWNlYWJsZSBjbGFz cz0iUEFSQU1FVEVSIj50YWJsZTwvcmVwbGFjZWFibGU+IFsgKCA8cmUKICAgICAgPGxpc3Rp dGVtPgogICAgICAgPHBhcmE+CiAgICAgICAgVGhlIG5hbWUgKHBvc3NpYmx5IHNjaGVtYS1x dWFsaWZpZWQpIG9mIGEgc3BlY2lmaWMgdGFibGUgdG8KISAgICAgICBhbmFseXplLiBEZWZh dWx0cyB0byBhbGwgdGFibGVzIGluIHRoZSBjdXJyZW50IGRhdGFiYXNlLgogICAgICAgPC9w YXJhPgogICAgICA8L2xpc3RpdGVtPgogICAgIDwvdmFybGlzdGVudHJ5PgotLS0gNjUsNzIg LS0tLQogICAgICA8bGlzdGl0ZW0+CiAgICAgICA8cGFyYT4KICAgICAgICBUaGUgbmFtZSAo cG9zc2libHkgc2NoZW1hLXF1YWxpZmllZCkgb2YgYSBzcGVjaWZpYyB0YWJsZSB0bwohICAg ICAgIGFuYWx5emUuIERlZmF1bHRzIHRvIGFsbCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQgZGF0 YWJhc2UgZXhjZXB0CiEgICAgICAgZm9yIGZvcmVpZ24gdGFibGVzLgogICAgICAgPC9wYXJh PgogICAgICA8L2xpc3RpdGVtPgogICAgIDwvdmFybGlzdGVudHJ5PgoqKioqKioqKioqKioq KioKKioqIDEzNywxNDMgKioqKiBBTkFMWVpFIFsgVkVSQk9TRSBdIFsgPHJlcGxhY2VhYmxl IGNsYXNzPSJQQVJBTUVURVIiPnRhYmxlPC9yZXBsYWNlYWJsZT4gWyAoIDxyZQogICAgIElu IHJhcmUgc2l0dWF0aW9ucywgdGhpcyBub24tZGV0ZXJtaW5pc20gd2lsbCBjYXVzZSB0aGUg cGxhbm5lcidzCiAgICAgY2hvaWNlcyBvZiBxdWVyeSBwbGFucyB0byBjaGFuZ2UgYWZ0ZXIg PGNvbW1hbmQ+QU5BTFlaRTwvY29tbWFuZD4gaXMgcnVuLgogICAgIFRvIGF2b2lkIHRoaXMs IHJhaXNlIHRoZSBhbW91bnQgb2Ygc3RhdGlzdGljcyBjb2xsZWN0ZWQgYnkKISAgICA8Y29t bWFuZD5BTkFMWVpFPC9jb21tYW5kPiwgYXMgZGVzY3JpYmVkIGJlbG93LgogICAgPC9wYXJh PgogIAogICAgPHBhcmE+Ci0tLSAxNDAsMTQ4IC0tLS0KICAgICBJbiByYXJlIHNpdHVhdGlv bnMsIHRoaXMgbm9uLWRldGVybWluaXNtIHdpbGwgY2F1c2UgdGhlIHBsYW5uZXIncwogICAg IGNob2ljZXMgb2YgcXVlcnkgcGxhbnMgdG8gY2hhbmdlIGFmdGVyIDxjb21tYW5kPkFOQUxZ WkU8L2NvbW1hbmQ+IGlzIHJ1bi4KICAgICBUbyBhdm9pZCB0aGlzLCByYWlzZSB0aGUgYW1v dW50IG9mIHN0YXRpc3RpY3MgY29sbGVjdGVkIGJ5CiEgICAgPGNvbW1hbmQ+QU5BTFlaRTwv Y29tbWFuZD4sIGFzIGRlc2NyaWJlZCBiZWxvdy4gIE5vdGUgdGhhdCB0aGUgdGltZQohICAg IG5lZWRlZCB0byBhbmFseXplIG9uIGZvcmVpZ24gdGFibGVzIGRlcGVuZHMgb24gdGhlIGlt cGxlbWVudGF0aW9uIG9mCiEgICAgdGhlIGZvcmVpZ24gZGF0YSB3cmFwcGVyIHZpYSB3aGlj aCBzdWNoIHRhYmxlcyBhcmUgYXR0YWNoZWQuCiAgICA8L3BhcmE+CiAgCiAgICA8cGFyYT4K KioqIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6ZS5jCi0tLSBiL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2FuYWx5emUuYwoqKioqKioqKioqKioqKioKKioqIDIzLDI4ICoqKioKLS0t IDIzLDI5IC0tLS0KICAjaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIKICAjaW5jbHVkZSAiY2F0 YWxvZy9pbmRleC5oIgogICNpbmNsdWRlICJjYXRhbG9nL2luZGV4aW5nLmgiCisgI2luY2x1 ZGUgImNhdGFsb2cvcGdfY2xhc3MuaCIKICAjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb2xsYXRp b24uaCIKICAjaW5jbHVkZSAiY2F0YWxvZy9wZ19pbmhlcml0c19mbi5oIgogICNpbmNsdWRl ICJjYXRhbG9nL3BnX25hbWVzcGFjZS5oIgoqKioqKioqKioqKioqKioKKioqIDMwLDM1ICoq KioKLS0tIDMxLDM4IC0tLS0KICAjaW5jbHVkZSAiY29tbWFuZHMvdGFibGVjbWRzLmgiCiAg I2luY2x1ZGUgImNvbW1hbmRzL3ZhY3V1bS5oIgogICNpbmNsdWRlICJleGVjdXRvci9leGVj dXRvci5oIgorICNpbmNsdWRlICJmb3JlaWduL2ZvcmVpZ24uaCIKKyAjaW5jbHVkZSAiZm9y ZWlnbi9mZHdhcGkuaCIKICAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAgI2luY2x1ZGUgIm5v ZGVzL25vZGVGdW5jcy5oIgogICNpbmNsdWRlICJwYXJzZXIvcGFyc2Vfb3Blci5oIgoqKioq KioqKioqKioqKioKKioqIDc4LDkxICoqKiogdHlwZWRlZiBzdHJ1Y3QgQW5sSW5kZXhEYXRh CiAgaW50CQkJZGVmYXVsdF9zdGF0aXN0aWNzX3RhcmdldCA9IDEwMDsKICAKICAvKiBBIGZl dyB2YXJpYWJsZXMgdGhhdCBkb24ndCBzZWVtIHdvcnRoIHBhc3NpbmcgYXJvdW5kIGFzIHBh cmFtZXRlcnMgKi8KLSBzdGF0aWMgaW50CWVsZXZlbCA9IC0xOwotIAogIHN0YXRpYyBNZW1v cnlDb250ZXh0IGFubF9jb250ZXh0ID0gTlVMTDsKICAKICBzdGF0aWMgQnVmZmVyQWNjZXNz U3RyYXRlZ3kgdmFjX3N0cmF0ZWd5OwogIAogIAotIHN0YXRpYyB2b2lkIGRvX2FuYWx5emVf cmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgYm9vbCBpbmgpOwog IHN0YXRpYyB2b2lkIEJsb2NrU2FtcGxlcl9Jbml0KEJsb2NrU2FtcGxlciBicywgQmxvY2tO dW1iZXIgbmJsb2NrcywKICAJCQkJICBpbnQgc2FtcGxlc2l6ZSk7CiAgc3RhdGljIGJvb2wg QmxvY2tTYW1wbGVyX0hhc01vcmUoQmxvY2tTYW1wbGVyIGJzKTsKLS0tIDgxLDkxIC0tLS0K KioqKioqKioqKioqKioqCioqKiA5NiwxMTAgKioqKiBzdGF0aWMgdm9pZCBjb21wdXRlX2lu ZGV4X3N0YXRzKFJlbGF0aW9uIG9uZXJlbCwgZG91YmxlIHRvdGFscm93cywKICAJCQkJCU1l bW9yeUNvbnRleHQgY29sX2NvbnRleHQpOwogIHN0YXRpYyBWYWNBdHRyU3RhdHMgKmV4YW1p bmVfYXR0cmlidXRlKFJlbGF0aW9uIG9uZXJlbCwgaW50IGF0dG51bSwKICAJCQkJICBOb2Rl ICppbmRleF9leHByKTsKISBzdGF0aWMgaW50IGFjcXVpcmVfc2FtcGxlX3Jvd3MoUmVsYXRp b24gb25lcmVsLCBIZWFwVHVwbGUgKnJvd3MsCiEgCQkJCQlpbnQgdGFyZ3Jvd3MsIGRvdWJs ZSAqdG90YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJvd3MpOwohIHN0YXRpYyBkb3VibGUg cmFuZG9tX2ZyYWN0KHZvaWQpOwohIHN0YXRpYyBkb3VibGUgaW5pdF9zZWxlY3Rpb25fc3Rh dGUoaW50IG4pOwohIHN0YXRpYyBkb3VibGUgZ2V0X25leHRfUyhkb3VibGUgdCwgaW50IG4s IGRvdWJsZSAqc3RhdGVwdHIpOwohIHN0YXRpYyBpbnQJY29tcGFyZV9yb3dzKGNvbnN0IHZv aWQgKmEsIGNvbnN0IHZvaWQgKmIpOwogIHN0YXRpYyBpbnQgYWNxdWlyZV9pbmhlcml0ZWRf c2FtcGxlX3Jvd3MoUmVsYXRpb24gb25lcmVsLAogIAkJCQkJCQkgIEhlYXBUdXBsZSAqcm93 cywgaW50IHRhcmdyb3dzLAohIAkJCQkJCQkgIGRvdWJsZSAqdG90YWxyb3dzLCBkb3VibGUg KnRvdGFsZGVhZHJvd3MpOwogIHN0YXRpYyB2b2lkIHVwZGF0ZV9hdHRzdGF0cyhPaWQgcmVs aWQsIGJvb2wgaW5oLAogIAkJCQlpbnQgbmF0dHMsIFZhY0F0dHJTdGF0cyAqKnZhY2F0dHJz dGF0cyk7CiAgc3RhdGljIERhdHVtIHN0ZF9mZXRjaF9mdW5jKFZhY0F0dHJTdGF0c1Agc3Rh dHMsIGludCByb3dudW0sIGJvb2wgKmlzTnVsbCk7Ci0tLSA5NiwxMTAgLS0tLQogIAkJCQkJ TWVtb3J5Q29udGV4dCBjb2xfY29udGV4dCk7CiAgc3RhdGljIFZhY0F0dHJTdGF0cyAqZXhh bWluZV9hdHRyaWJ1dGUoUmVsYXRpb24gb25lcmVsLCBpbnQgYXR0bnVtLAogIAkJCQkgIE5v ZGUgKmluZGV4X2V4cHIpOwohIHN0YXRpYyBpbnQgYWNxdWlyZV9zYW1wbGVfcm93cyhSZWxh dGlvbiBvbmVyZWwsCiEgCQkJCQkJCSAgIEhlYXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dz LAohIAkJCQkJCQkgICBkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dz LAohIAkJCQkJCQkgICBCbG9ja051bWJlciAqdG90YWxwYWdlcywgaW50IGVsZXZlbCk7CiAg c3RhdGljIGludCBhY3F1aXJlX2luaGVyaXRlZF9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVy ZWwsCiAgCQkJCQkJCSAgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiEgCQkJCQkJ CSAgZG91YmxlICp0b3RhbHJvd3MsIGRvdWJsZSAqdG90YWxkZWFkcm93cywKISAJCQkJCQkJ ICBCbG9ja051bWJlciAqdG90YWxwYWdlcywgaW50IGVsZXZlbCk7CiEgc3RhdGljIGludAlj b21wYXJlX3Jvd3MoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CiAgc3RhdGljIHZv aWQgdXBkYXRlX2F0dHN0YXRzKE9pZCByZWxpZCwgYm9vbCBpbmgsCiAgCQkJCWludCBuYXR0 cywgVmFjQXR0clN0YXRzICoqdmFjYXR0cnN0YXRzKTsKICBzdGF0aWMgRGF0dW0gc3RkX2Zl dGNoX2Z1bmMoVmFjQXR0clN0YXRzUCBzdGF0cywgaW50IHJvd251bSwgYm9vbCAqaXNOdWxs KTsKKioqKioqKioqKioqKioqCioqKiAxMTksMTI1ICoqKiogc3RhdGljIGJvb2wgc3RkX3R5 cGFuYWx5emUoVmFjQXR0clN0YXRzICpzdGF0cyk7Ci0tLSAxMTksMTI3IC0tLS0KICB2b2lk CiAgYW5hbHl6ZV9yZWwoT2lkIHJlbGlkLCBWYWN1dW1TdG10ICp2YWNzdG10LCBCdWZmZXJB Y2Nlc3NTdHJhdGVneSBic3RyYXRlZ3kpCiAgeworIAlpbnQJCQllbGV2ZWw7CiAgCVJlbGF0 aW9uCW9uZXJlbDsKKyAJRmR3Um91dGluZSAqZmR3cm91dGluZTsKICAKICAJLyogU2V0IHVw IHN0YXRpYyB2YXJpYWJsZXMgKi8KICAJaWYgKHZhY3N0bXQtPm9wdGlvbnMgJiBWQUNPUFRf VkVSQk9TRSkKKioqKioqKioqKioqKioqCioqKiAxODQsMTkzICoqKiogYW5hbHl6ZV9yZWwo T2lkIHJlbGlkLCBWYWN1dW1TdG10ICp2YWNzdG10LCBCdWZmZXJBY2Nlc3NTdHJhdGVneSBi c3RyYXRlZ3kpCiAgCX0KICAKICAJLyoKISAJICogQ2hlY2sgdGhhdCBpdCdzIGEgcGxhaW4g dGFibGU7IHdlIHVzZWQgdG8gZG8gdGhpcyBpbiBnZXRfcmVsX29pZHMoKSBidXQKISAJICog c2VlbXMgc2FmZXIgdG8gY2hlY2sgYWZ0ZXIgd2UndmUgbG9ja2VkIHRoZSByZWxhdGlvbi4K ICAJICovCiEgCWlmIChvbmVyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1JFTEFU SU9OKQogIAl7CiAgCQkvKiBObyBuZWVkIGZvciBhIFdBUk5JTkcgaWYgd2UgYWxyZWFkeSBj b21wbGFpbmVkIGR1cmluZyBWQUNVVU0gKi8KICAJCWlmICghKHZhY3N0bXQtPm9wdGlvbnMg JiBWQUNPUFRfVkFDVVVNKSkKLS0tIDE4NiwxOTcgLS0tLQogIAl9CiAgCiAgCS8qCiEgCSAq IENoZWNrIHRoYXQgaXQncyBhIHBsYWluIHRhYmxlIG9yIGZvcmVpZ24gdGFibGU7IHdlIHVz ZWQgdG8gZG8gdGhpcwohIAkgKiBpbiBnZXRfcmVsX29pZHMoKSBidXQgc2VlbXMgc2FmZXIg dG8gY2hlY2sgYWZ0ZXIgd2UndmUgbG9ja2VkIHRoZQohIAkgKiByZWxhdGlvbi4KICAJICov CiEgCWlmIChvbmVyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1JFTEFUSU9OICYm CiEgCQlvbmVyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUp CiAgCXsKICAJCS8qIE5vIG5lZWQgZm9yIGEgV0FSTklORyBpZiB3ZSBhbHJlYWR5IGNvbXBs YWluZWQgZHVyaW5nIFZBQ1VVTSAqLwogIAkJaWYgKCEodmFjc3RtdC0+b3B0aW9ucyAmIFZB Q09QVF9WQUNVVU0pKQoqKioqKioqKioqKioqKioKKioqIDIxMiwyMTcgKioqKiBhbmFseXpl X3JlbChPaWQgcmVsaWQsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIEJ1ZmZlckFjY2Vzc1N0cmF0 ZWd5IGJzdHJhdGVneSkKLS0tIDIxNiwyMjMgLS0tLQogIAogIAkvKgogIAkgKiBXZSBjYW4g QU5BTFlaRSBhbnkgdGFibGUgZXhjZXB0IHBnX3N0YXRpc3RpYy4gU2VlIHVwZGF0ZV9hdHRz dGF0cworIAkgKiBXZSBjYW4gQU5BTFlaRSBmb3JlaWduIHRhYmxlcyBpZiB0aGUgdW5kZXJs eWluZyBmb3JlaWduLWRhdGEgd3JhcHBlcnMKKyAJICogaGF2ZSB0aGVpciBBbmFseXplRm9y ZWlnblRhYmxlIGNhbGxiYWNrIHJvdXRpbmVzLgogIAkgKi8KICAJaWYgKFJlbGF0aW9uR2V0 UmVsaWQob25lcmVsKSA9PSBTdGF0aXN0aWNSZWxhdGlvbklkKQogIAl7CioqKioqKioqKioq KioqKgoqKiogMjE5LDIyNCAqKioqIGFuYWx5emVfcmVsKE9pZCByZWxpZCwgVmFjdXVtU3Rt dCAqdmFjc3RtdCwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5KQotLS0gMjI1LDI0 NCAtLS0tCiAgCQlyZXR1cm47CiAgCX0KICAKKyAJaWYgKG9uZXJlbC0+cmRfcmVsLT5yZWxr aW5kID09IFJFTEtJTkRfRk9SRUlHTl9UQUJMRSkKKyAJeworICAJCWZkd3JvdXRpbmUgPSBH ZXRGZHdSb3V0aW5lQnlSZWxJZChSZWxhdGlvbkdldFJlbGlkKG9uZXJlbCkpOworIAorIAkJ aWYgKGZkd3JvdXRpbmUtPkFuYWx5emVGb3JlaWduVGFibGUgPT0gTlVMTCkKKyAJCXsKKyAJ CQllcmVwb3J0KFdBUk5JTkcsCisgCQkJCQkoZXJybXNnKCJza2lwcGluZyBcIiVzXCIgLS0t IHVuZGVybHlpbmcgZm9yZWlnbi1kYXRhIHdyYXBwZXIgY2Fubm90IGFuYWx5emUgaXQiLAor IAkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpKSkpOworIAkJCXJlbGF0 aW9uX2Nsb3NlKG9uZXJlbCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKKyAJCQlyZXR1 cm47CisgCQl9CisgCX0KKyAKICAJLyoKICAJICogT0ssIGxldCdzIGRvIGl0LiAgRmlyc3Qg bGV0IG90aGVyIGJhY2tlbmRzIGtub3cgSSdtIGluIEFOQUxZWkUuCiAgCSAqLwoqKioqKioq KioqKioqKioKKioqIDIyNiwyNDEgKioqKiBhbmFseXplX3JlbChPaWQgcmVsaWQsIFZhY3V1 bVN0bXQgKnZhY3N0bXQsIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IGJzdHJhdGVneSkKICAJTXlQ Z1hhY3QtPnZhY3V1bUZsYWdzIHw9IFBST0NfSU5fQU5BTFlaRTsKICAJTFdMb2NrUmVsZWFz ZShQcm9jQXJyYXlMb2NrKTsKICAKISAJLyoKISAJICogRG8gdGhlIG5vcm1hbCBub24tcmVj dXJzaXZlIEFOQUxZWkUuCiEgCSAqLwohIAlkb19hbmFseXplX3JlbChvbmVyZWwsIHZhY3N0 bXQsIGZhbHNlKTsKICAKISAJLyoKISAJICogSWYgdGhlcmUgYXJlIGNoaWxkIHRhYmxlcywg ZG8gcmVjdXJzaXZlIEFOQUxZWkUuCiEgCSAqLwohIAlpZiAob25lcmVsLT5yZF9yZWwtPnJl bGhhc3N1YmNsYXNzKQohIAkJZG9fYW5hbHl6ZV9yZWwob25lcmVsLCB2YWNzdG10LCB0cnVl KTsKICAKICAJLyoKICAJICogQ2xvc2Ugc291cmNlIHJlbGF0aW9uIG5vdywgYnV0IGtlZXAg bG9jayBzbyB0aGF0IG5vIG9uZSBkZWxldGVzIGl0Ci0tLSAyNDYsMjgyIC0tLS0KICAJTXlQ Z1hhY3QtPnZhY3V1bUZsYWdzIHw9IFBST0NfSU5fQU5BTFlaRTsKICAJTFdMb2NrUmVsZWFz ZShQcm9jQXJyYXlMb2NrKTsKICAKISAJaWYgKG9uZXJlbC0+cmRfcmVsLT5yZWxraW5kID09 IFJFTEtJTkRfRk9SRUlHTl9UQUJMRSkKISAJewohIAkJZXJlcG9ydChlbGV2ZWwsCiEgCQkJ CShlcnJtc2coImFuYWx5emluZyBcIiVzLiVzXCIiLAohIAkJCQkJCWdldF9uYW1lc3BhY2Vf bmFtZShSZWxhdGlvbkdldE5hbWVzcGFjZShvbmVyZWwpKSwKISAJCQkJCQlSZWxhdGlvbkdl dFJlbGF0aW9uTmFtZShvbmVyZWwpKSkpOwohIAkJZmR3cm91dGluZS0+QW5hbHl6ZUZvcmVp Z25UYWJsZShvbmVyZWwsIHZhY3N0bXQsIGVsZXZlbCk7CiEgCX0KISAJZWxzZQohIAl7CiEg CQkvKgohIAkJICogRG8gdGhlIG5vcm1hbCBub24tcmVjdXJzaXZlIEFOQUxZWkUuCiEgCQkg Ki8KISAJCWVyZXBvcnQoZWxldmVsLAohIAkJCQkoZXJybXNnKCJhbmFseXppbmcgXCIlcy4l c1wiIiwKISAJCQkJCQlnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2Uo b25lcmVsKSksCiEgCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsK ISAJCWRvX2FuYWx5emVfcmVsKG9uZXJlbCwgdmFjc3RtdCwgZWxldmVsLCBmYWxzZSwgYWNx dWlyZV9zYW1wbGVfcm93cyk7CiAgCiEgCQkvKgohIAkJICogSWYgdGhlcmUgYXJlIGNoaWxk IHRhYmxlcywgZG8gcmVjdXJzaXZlIEFOQUxZWkUuCiEgCQkgKi8KISAJCWlmIChvbmVyZWwt PnJkX3JlbC0+cmVsaGFzc3ViY2xhc3MpCiEgCQl7CiEgCQkJZXJlcG9ydChlbGV2ZWwsCiEg CQkJCQkoZXJybXNnKCJhbmFseXppbmcgXCIlcy4lc1wiIGluaGVyaXRhbmNlIHRyZWUiLAoh IAkJCQkJCQlnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2Uob25lcmVs KSksCiEgCQkJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG9uZXJlbCkpKSk7CiEgCQkJ ZG9fYW5hbHl6ZV9yZWwob25lcmVsLCB2YWNzdG10LCBlbGV2ZWwsIHRydWUsIGFjcXVpcmVf aW5oZXJpdGVkX3NhbXBsZV9yb3dzKTsKISAJCX0KISAJfQogIAogIAkvKgogIAkgKiBDbG9z ZSBzb3VyY2UgcmVsYXRpb24gbm93LCBidXQga2VlcCBsb2NrIHNvIHRoYXQgbm8gb25lIGRl bGV0ZXMgaXQKKioqKioqKioqKioqKioqCioqKiAyNTcsMjY0ICoqKiogYW5hbHl6ZV9yZWwo T2lkIHJlbGlkLCBWYWN1dW1TdG10ICp2YWNzdG10LCBCdWZmZXJBY2Nlc3NTdHJhdGVneSBi c3RyYXRlZ3kpCiAgLyoKICAgKglkb19hbmFseXplX3JlbCgpIC0tIGFuYWx5emUgb25lIHJl bGF0aW9uLCByZWN1cnNpdmVseSBvciBub3QKICAgKi8KISBzdGF0aWMgdm9pZAohIGRvX2Fu YWx5emVfcmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgYm9vbCBp bmgpCiAgewogIAlpbnQJCQlhdHRyX2NudCwKICAJCQkJdGNudCwKLS0tIDI5OCwzMDYgLS0t LQogIC8qCiAgICoJZG9fYW5hbHl6ZV9yZWwoKSAtLSBhbmFseXplIG9uZSByZWxhdGlvbiwg cmVjdXJzaXZlbHkgb3Igbm90CiAgICovCiEgdm9pZAohIGRvX2FuYWx5emVfcmVsKFJlbGF0 aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgaW50IGVsZXZlbCwgCiEgCQkJICAg Ym9vbCBpbmgsIFNhbXBsZVJvd0FjcXVpcmVGdW5jIGFjcXVpcmVmdW5jKQogIHsKICAJaW50 CQkJYXR0cl9jbnQsCiAgCQkJCXRjbnQsCioqKioqKioqKioqKioqKgoqKiogMjczLDI3OCAq KioqIGRvX2FuYWx5emVfcmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3Rt dCwgYm9vbCBpbmgpCi0tLSAzMTUsMzIxIC0tLS0KICAJCQkJbnVtcm93czsKICAJZG91Ymxl CQl0b3RhbHJvd3MsCiAgCQkJCXRvdGFsZGVhZHJvd3M7CisgCUJsb2NrTnVtYmVyIHRvdGFs cGFnZXM7CiAgCUhlYXBUdXBsZSAgKnJvd3M7CiAgCVBHUlVzYWdlCXJ1MDsKICAJVGltZXN0 YW1wVHogc3RhcnR0aW1lID0gMDsKKioqKioqKioqKioqKioqCioqKiAyODEsMjk3ICoqKiog ZG9fYW5hbHl6ZV9yZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10LCBi b29sIGluaCkKICAJaW50CQkJc2F2ZV9zZWNfY29udGV4dDsKICAJaW50CQkJc2F2ZV9uZXN0 bGV2ZWw7CiAgCi0gCWlmIChpbmgpCi0gCQllcmVwb3J0KGVsZXZlbCwKLSAJCQkJKGVycm1z ZygiYW5hbHl6aW5nIFwiJXMuJXNcIiBpbmhlcml0YW5jZSB0cmVlIiwKLSAJCQkJCQlnZXRf bmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2Uob25lcmVsKSksCi0gCQkJCQkJ UmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsKLSAJZWxzZQotIAkJZXJlcG9y dChlbGV2ZWwsCi0gCQkJCShlcnJtc2coImFuYWx5emluZyBcIiVzLiVzXCIiLAotIAkJCQkJ CWdldF9uYW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVzcGFjZShvbmVyZWwpKSwKLSAJ CQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpKSkpOwotIAogIAkvKgogIAkg KiBTZXQgdXAgYSB3b3JraW5nIGNvbnRleHQgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGZyZWUg d2hhdGV2ZXIganVuayBnZXRzCiAgCSAqIGNyZWF0ZWQuCi0tLSAzMjQsMzI5IC0tLS0KKioq KioqKioqKioqKioqCioqKiA0NDksNDU5ICoqKiogZG9fYW5hbHl6ZV9yZWwoUmVsYXRpb24g b25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10LCBib29sIGluaCkKICAJICovCiAgCXJvd3Mg PSAoSGVhcFR1cGxlICopIHBhbGxvYyh0YXJncm93cyAqIHNpemVvZihIZWFwVHVwbGUpKTsK ICAJaWYgKGluaCkKISAJCW51bXJvd3MgPSBhY3F1aXJlX2luaGVyaXRlZF9zYW1wbGVfcm93 cyhvbmVyZWwsIHJvd3MsIHRhcmdyb3dzLAohIAkJCQkJCQkJCQkJCSZ0b3RhbHJvd3MsICZ0 b3RhbGRlYWRyb3dzKTsKICAJZWxzZQohIAkJbnVtcm93cyA9IGFjcXVpcmVfc2FtcGxlX3Jv d3Mob25lcmVsLCByb3dzLCB0YXJncm93cywKISAJCQkJCQkJCQkgICZ0b3RhbHJvd3MsICZ0 b3RhbGRlYWRyb3dzKTsKICAKICAJLyoKICAJICogQ29tcHV0ZSB0aGUgc3RhdGlzdGljcy4J VGVtcG9yYXJ5IHJlc3VsdHMgZHVyaW5nIHRoZSBjYWxjdWxhdGlvbnMgZm9yCi0tLSA0ODEs NDkzIC0tLS0KICAJICovCiAgCXJvd3MgPSAoSGVhcFR1cGxlICopIHBhbGxvYyh0YXJncm93 cyAqIHNpemVvZihIZWFwVHVwbGUpKTsKICAJaWYgKGluaCkKISAJCW51bXJvd3MgPSBhY3F1 aXJlZnVuYyhvbmVyZWwsIHJvd3MsIHRhcmdyb3dzLAohIAkJCQkJCQkgICZ0b3RhbHJvd3Ms ICZ0b3RhbGRlYWRyb3dzLAohIAkJCQkJCQkgIE5VTEwsIGVsZXZlbCk7CiAgCWVsc2UKISAJ CW51bXJvd3MgPSBhY3F1aXJlZnVuYyhvbmVyZWwsIHJvd3MsIHRhcmdyb3dzLAohIAkJCQkJ CQkgICZ0b3RhbHJvd3MsICZ0b3RhbGRlYWRyb3dzLAohIAkJCQkJCQkgICZ0b3RhbHBhZ2Vz LCBlbGV2ZWwpOwogIAogIAkvKgogIAkgKiBDb21wdXRlIHRoZSBzdGF0aXN0aWNzLglUZW1w b3JhcnkgcmVzdWx0cyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9ucyBmb3IKKioqKioqKioqKioq KioqCioqKiA1MzQsNTQwICoqKiogZG9fYW5hbHl6ZV9yZWwoUmVsYXRpb24gb25lcmVsLCBW YWN1dW1TdG10ICp2YWNzdG10LCBib29sIGluaCkKICAJICovCiAgCWlmICghaW5oKQogIAkJ dmFjX3VwZGF0ZV9yZWxzdGF0cyhvbmVyZWwsCiEgCQkJCQkJCVJlbGF0aW9uR2V0TnVtYmVy T2ZCbG9ja3Mob25lcmVsKSwKICAJCQkJCQkJdG90YWxyb3dzLAogIAkJCQkJCQl2aXNpYmls aXR5bWFwX2NvdW50KG9uZXJlbCksCiAgCQkJCQkJCWhhc2luZGV4LAotLS0gNTY4LDU3NCAt LS0tCiAgCSAqLwogIAlpZiAoIWluaCkKICAJCXZhY191cGRhdGVfcmVsc3RhdHMob25lcmVs LAohIAkJCQkJCQl0b3RhbHBhZ2VzLAogIAkJCQkJCQl0b3RhbHJvd3MsCiAgCQkJCQkJCXZp c2liaWxpdHltYXBfY291bnQob25lcmVsKSwKICAJCQkJCQkJaGFzaW5kZXgsCioqKioqKioq KioqKioqKgoqKiogMTAxNywxMDIzICoqKiogQmxvY2tTYW1wbGVyX05leHQoQmxvY2tTYW1w bGVyIGJzKQogICAqLwogIHN0YXRpYyBpbnQKICBhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0 aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiEgCQkJCQlkb3Vi bGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzKQogIHsKICAJaW50CQkJbnVt cm93cyA9IDA7CS8qICMgcm93cyBub3cgaW4gcmVzZXJ2b2lyICovCiAgCWRvdWJsZQkJc2Ft cGxlcm93cyA9IDA7IC8qIHRvdGFsICMgcm93cyBjb2xsZWN0ZWQgKi8KLS0tIDEwNTEsMTA1 OCAtLS0tCiAgICovCiAgc3RhdGljIGludAogIGFjcXVpcmVfc2FtcGxlX3Jvd3MoUmVsYXRp b24gb25lcmVsLCBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKISAJCQkJCWRvdWJs ZSAqdG90YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJvd3MsCiEgCQkJCQlCbG9ja051bWJl ciAqdG90YWxwYWdlcywgaW50IGVsZXZlbCkKICB7CiAgCWludAkJCW51bXJvd3MgPSAwOwkv KiAjIHJvd3Mgbm93IGluIHJlc2Vydm9pciAqLwogIAlkb3VibGUJCXNhbXBsZXJvd3MgPSAw OyAvKiB0b3RhbCAjIHJvd3MgY29sbGVjdGVkICovCioqKioqKioqKioqKioqKgoqKiogMTAz MiwxMDM3ICoqKiogYWNxdWlyZV9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIEhlYXBU dXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAotLS0gMTA2NywxMDc0IC0tLS0KICAJQXNzZXJ0 KHRhcmdyb3dzID4gMCk7CiAgCiAgCXRvdGFsYmxvY2tzID0gUmVsYXRpb25HZXROdW1iZXJP ZkJsb2NrcyhvbmVyZWwpOworIAlpZiAodG90YWxwYWdlcykKKyAJCSp0b3RhbHBhZ2VzID0g dG90YWxibG9ja3M7CiAgCiAgCS8qIE5lZWQgYSBjdXRvZmYgeG1pbiBmb3IgSGVhcFR1cGxl U2F0aXNmaWVzVmFjdXVtICovCiAgCU9sZGVzdFhtaW4gPSBHZXRPbGRlc3RYbWluKG9uZXJl bC0+cmRfcmVsLT5yZWxpc3NoYXJlZCwgdHJ1ZSk7CioqKioqKioqKioqKioqKgoqKiogMTI1 NCwxMjYwICoqKiogYWNxdWlyZV9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIEhlYXBU dXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAogIH0KICAKICAvKiBTZWxlY3QgYSByYW5kb20g dmFsdWUgUiB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgaW4gKDAgLSAxKSAqLwohIHN0YXRpYyBk b3VibGUKICByYW5kb21fZnJhY3Qodm9pZCkKICB7CiAgCXJldHVybiAoKGRvdWJsZSkgcmFu ZG9tKCkgKyAxKSAvICgoZG91YmxlKSBNQVhfUkFORE9NX1ZBTFVFICsgMik7Ci0tLSAxMjkx LDEyOTcgLS0tLQogIH0KICAKICAvKiBTZWxlY3QgYSByYW5kb20gdmFsdWUgUiB1bmlmb3Jt bHkgZGlzdHJpYnV0ZWQgaW4gKDAgLSAxKSAqLwohIGRvdWJsZQogIHJhbmRvbV9mcmFjdCh2 b2lkKQogIHsKICAJcmV0dXJuICgoZG91YmxlKSByYW5kb20oKSArIDEpIC8gKChkb3VibGUp IE1BWF9SQU5ET01fVkFMVUUgKyAyKTsKKioqKioqKioqKioqKioqCioqKiAxMjc0LDEyODcg KioqKiByYW5kb21fZnJhY3Qodm9pZCkKICAgKiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Yg cmVjb3JkcyB0byBza2lwIGJlZm9yZSB0aGUgbmV4dCByZWNvcmQgaXMKICAgKiBwcm9jZXNz ZWQuCiAgICovCiEgc3RhdGljIGRvdWJsZQogIGluaXRfc2VsZWN0aW9uX3N0YXRlKGludCBu KQogIHsKICAJLyogSW5pdGlhbCB2YWx1ZSBvZiBXIChmb3IgdXNlIHdoZW4gQWxnb3JpdGht IFogaXMgZmlyc3QgYXBwbGllZCkgKi8KICAJcmV0dXJuIGV4cCgtbG9nKHJhbmRvbV9mcmFj dCgpKSAvIG4pOwogIH0KICAKISBzdGF0aWMgZG91YmxlCiAgZ2V0X25leHRfUyhkb3VibGUg dCwgaW50IG4sIGRvdWJsZSAqc3RhdGVwdHIpCiAgewogIAlkb3VibGUJCVM7Ci0tLSAxMzEx LDEzMjQgLS0tLQogICAqIGRldGVybWluZXMgdGhlIG51bWJlciBvZiByZWNvcmRzIHRvIHNr aXAgYmVmb3JlIHRoZSBuZXh0IHJlY29yZCBpcwogICAqIHByb2Nlc3NlZC4KICAgKi8KISBk b3VibGUKICBpbml0X3NlbGVjdGlvbl9zdGF0ZShpbnQgbikKICB7CiAgCS8qIEluaXRpYWwg dmFsdWUgb2YgVyAoZm9yIHVzZSB3aGVuIEFsZ29yaXRobSBaIGlzIGZpcnN0IGFwcGxpZWQp ICovCiAgCXJldHVybiBleHAoLWxvZyhyYW5kb21fZnJhY3QoKSkgLyBuKTsKICB9CiAgCiEg ZG91YmxlCiAgZ2V0X25leHRfUyhkb3VibGUgdCwgaW50IG4sIGRvdWJsZSAqc3RhdGVwdHIp CiAgewogIAlkb3VibGUJCVM7CioqKioqKioqKioqKioqKgoqKiogMTM5NywxNDAzICoqKiog Y29tcGFyZV9yb3dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCiAgICovCiAgc3Rh dGljIGludAogIGFjcXVpcmVfaW5oZXJpdGVkX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJl bCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiEgCQkJCQkJCSAgZG91YmxlICp0 b3RhbHJvd3MsIGRvdWJsZSAqdG90YWxkZWFkcm93cykKICB7CiAgCUxpc3QJICAgKnRhYmxl T0lEczsKICAJUmVsYXRpb24gICAqcmVsczsKLS0tIDE0MzQsMTQ0MSAtLS0tCiAgICovCiAg c3RhdGljIGludAogIGFjcXVpcmVfaW5oZXJpdGVkX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9u ZXJlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiEgCQkJCQkJCSAgZG91Ymxl ICp0b3RhbHJvd3MsIGRvdWJsZSAqdG90YWxkZWFkcm93cywKISAJCQkJCQkJICBCbG9ja051 bWJlciAqdG90YWxwYWdlcywgaW50IGVsZXZlbCkKICB7CiAgCUxpc3QJICAgKnRhYmxlT0lE czsKICAJUmVsYXRpb24gICAqcmVsczsKKioqKioqKioqKioqKioqCioqKiAxNDYwLDE0NjUg KioqKiBhY3F1aXJlX2luaGVyaXRlZF9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIEhl YXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAotLS0gMTQ5OCwxNTA1IC0tLS0KICAJCXRv dGFsYmxvY2tzICs9IHJlbGJsb2Nrc1tucmVsc107CiAgCQlucmVscysrOwogIAl9CisgCWlm ICh0b3RhbHBhZ2VzKQorIAkgICp0b3RhbHBhZ2VzID0gdG90YWxibG9ja3M7CiAgCiAgCS8q CiAgCSAqIE5vdyBzYW1wbGUgcm93cyBmcm9tIGVhY2ggcmVsYXRpb24sIHByb3BvcnRpb25h bGx5IHRvIGl0cyBmcmFjdGlvbiBvZgoqKioqKioqKioqKioqKioKKioqIDE0OTMsMTQ5OSAq KioqIGFjcXVpcmVfaW5oZXJpdGVkX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVh cFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiAgCQkJCQkJCQkJCQkJcm93cyArIG51bXJv d3MsCiAgCQkJCQkJCQkJCQkJY2hpbGR0YXJncm93cywKICAJCQkJCQkJCQkJCQkmdHJvd3Ms CiEgCQkJCQkJCQkJCQkJJnRkcm93cyk7CiAgCiAgCQkJCS8qIFdlIG1heSBuZWVkIHRvIGNv bnZlcnQgZnJvbSBjaGlsZCdzIHJvd3R5cGUgdG8gcGFyZW50J3MgKi8KICAJCQkJaWYgKGNo aWxkcm93cyA+IDAgJiYKLS0tIDE1MzMsMTU0MSAtLS0tCiAgCQkJCQkJCQkJCQkJcm93cyAr IG51bXJvd3MsCiAgCQkJCQkJCQkJCQkJY2hpbGR0YXJncm93cywKICAJCQkJCQkJCQkJCQkm dHJvd3MsCiEgCQkJCQkJCQkJCQkJJnRkcm93cywKISAJCQkJCQkJCQkJCQlOVUxMLAohIAkJ CQkJCQkJCQkJCWVsZXZlbCk7CiAgCiAgCQkJCS8qIFdlIG1heSBuZWVkIHRvIGNvbnZlcnQg ZnJvbSBjaGlsZCdzIHJvd3R5cGUgdG8gcGFyZW50J3MgKi8KICAJCQkJaWYgKGNoaWxkcm93 cyA+IDAgJiYKKioqIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKLS0tIGIv c3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKioqKioqKioqKioqKioqCioqKiAz MTcsMzIyICoqKiogc3RhdGljIHZvaWQgQVRQcmVwU2V0U3RhdGlzdGljcyhSZWxhdGlvbiBy ZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsCi0tLSAzMTcsMzI0IC0tLS0KICAJCQkJCU5vZGUg Km5ld1ZhbHVlLCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAgc3RhdGljIHZvaWQgQVRFeGVjU2V0 U3RhdGlzdGljcyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsCiAgCQkJCQlO b2RlICpuZXdWYWx1ZSwgTE9DS01PREUgbG9ja21vZGUpOworIHN0YXRpYyB2b2lkIEFUUHJl cFNldE9wdGlvbnMoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLAorIAkJCQkg Tm9kZSAqb3B0aW9ucywgTE9DS01PREUgbG9ja21vZGUpOwogIHN0YXRpYyB2b2lkIEFURXhl Y1NldE9wdGlvbnMoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLAogIAkJCQkg Tm9kZSAqb3B0aW9ucywgYm9vbCBpc1Jlc2V0LCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAgc3Rh dGljIHZvaWQgQVRFeGVjU2V0U3RvcmFnZShSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNv bE5hbWUsCioqKioqKioqKioqKioqKgoqKiogMjkxNiwyOTIxICoqKiogQVRQcmVwQ21kKExp c3QgKip3cXVldWUsIFJlbGF0aW9uIHJlbCwgQWx0ZXJUYWJsZUNtZCAqY21kLAotLS0gMjkx OCwyOTI0IC0tLS0KICAJCWNhc2UgQVRfU2V0T3B0aW9uczoJCS8qIEFMVEVSIENPTFVNTiBT RVQgKCBvcHRpb25zICkgKi8KICAJCWNhc2UgQVRfUmVzZXRPcHRpb25zOgkvKiBBTFRFUiBD T0xVTU4gUkVTRVQgKCBvcHRpb25zICkgKi8KICAJCQlBVFNpbXBsZVBlcm1pc3Npb25zKHJl bCwgQVRUX1RBQkxFIHwgQVRUX0lOREVYKTsKKyAJCQlBVFByZXBTZXRPcHRpb25zKHJlbCwg Y21kLT5uYW1lLCBjbWQtPmRlZiwgbG9ja21vZGUpOwogIAkJCS8qIFRoaXMgY29tbWFuZCBu ZXZlciByZWN1cnNlcyAqLwogIAkJCXBhc3MgPSBBVF9QQVNTX01JU0M7CiAgCQkJYnJlYWs7 CioqKioqKioqKioqKioqKgoqKiogNDg1MSw0ODYwICoqKiogQVRQcmVwU2V0U3RhdGlzdGlj cyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsIE5vZGUgKm5ld1ZhbHVlLCBM T0NLTU9ERQogIAkgKiBhbGxvd1N5c3RlbVRhYmxlTW9kcyB0byBiZSB0dXJuZWQgb24uCiAg CSAqLwogIAlpZiAocmVsLT5yZF9yZWwtPnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElPTiAm JgohIAkJcmVsLT5yZF9yZWwtPnJlbGtpbmQgIT0gUkVMS0lORF9JTkRFWCkKICAJCWVyZXBv cnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAoh IAkJCQkgZXJybXNnKCJcIiVzXCIgaXMgbm90IGEgdGFibGUgb3IgaW5kZXgiLAogIAkJCQkJ CVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpKSk7CiAgCiAgCS8qIFBlcm1pc3Npb25z IGNoZWNrcyAqLwotLS0gNDg1NCw0ODY0IC0tLS0KICAJICogYWxsb3dTeXN0ZW1UYWJsZU1v ZHMgdG8gYmUgdHVybmVkIG9uLgogIAkgKi8KICAJaWYgKHJlbC0+cmRfcmVsLT5yZWxraW5k ICE9IFJFTEtJTkRfUkVMQVRJT04gJiYKISAJCXJlbC0+cmRfcmVsLT5yZWxraW5kICE9IFJF TEtJTkRfSU5ERVggJiYKISAJCXJlbC0+cmRfcmVsLT5yZWxraW5kICE9IFJFTEtJTkRfRk9S RUlHTl9UQUJMRSkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVf V1JPTkdfT0JKRUNUX1RZUEUpLAohIAkJCQkgZXJybXNnKCJcIiVzXCIgaXMgbm90IGEgdGFi bGUsIGluZGV4IG9yIGZvcmVpZ24gdGFibGUiLAogIAkJCQkJCVJlbGF0aW9uR2V0UmVsYXRp b25OYW1lKHJlbCkpKSk7CiAgCiAgCS8qIFBlcm1pc3Npb25zIGNoZWNrcyAqLwoqKioqKioq KioqKioqKioKKioqIDQ5MjMsNDkyOCAqKioqIEFURXhlY1NldFN0YXRpc3RpY3MoUmVsYXRp b24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLCBOb2RlICpuZXdWYWx1ZSwgTE9DS01PREUK LS0tIDQ5MjcsNDk1MiAtLS0tCiAgfQogIAogIHN0YXRpYyB2b2lkCisgQVRQcmVwU2V0T3B0 aW9ucyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsIE5vZGUgKm9wdGlvbnMs CisgCQkJCSBMT0NLTU9ERSBsb2NrbW9kZSkKKyB7CisgCWlmIChyZWwtPnJkX3JlbC0+cmVs a2luZCA9PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUpCisgCXsKKyAJCUxpc3RDZWxsICAgKmNl bGw7CisgCisgCQlmb3JlYWNoKGNlbGwsIChMaXN0ICopIG9wdGlvbnMpCisgCQl7CisgCQkJ RGVmRWxlbSAgICAqZGVmID0gKERlZkVsZW0gKikgbGZpcnN0KGNlbGwpOworIAorIAkJCWlm IChwZ19zdHJuY2FzZWNtcChkZWYtPmRlZm5hbWUsICJuX2Rpc3RpbmN0X2luaGVyaXRlZCIs IHN0cmxlbigibl9kaXN0aW5jdF9pbmhlcml0ZWQiKSkgPT0gMCkKKyAJCQkJZXJlcG9ydChF UlJPUiwKKyAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCks CisgCQkJCQkJIGVycm1zZygiY2Fubm90IHN1cHBvcnQgb3B0aW9uIFwibl9kaXN0aW5jdF9p bmhlcml0ZWRcIiBmb3IgZm9yZWlnbiB0YWJsZXMiKSkpOworIAkJfQorIAl9CisgfQorIAor IHN0YXRpYyB2b2lkCiAgQVRFeGVjU2V0T3B0aW9ucyhSZWxhdGlvbiByZWwsIGNvbnN0IGNo YXIgKmNvbE5hbWUsIE5vZGUgKm9wdGlvbnMsCiAgCQkJCSBib29sIGlzUmVzZXQsIExPQ0tN T0RFIGxvY2ttb2RlKQogIHsKKioqIGEvc3JjL2Jpbi9wc3FsL3RhYi1jb21wbGV0ZS5jCi0t LSBiL3NyYy9iaW4vcHNxbC90YWItY29tcGxldGUuYwoqKioqKioqKioqKioqKioKKioqIDM5 OSw0MDQgKioqKiBzdGF0aWMgY29uc3QgU2NoZW1hUXVlcnkgUXVlcnlfZm9yX2xpc3Rfb2Zf dHN2ZiA9IHsKLS0tIDM5OSw0MTkgLS0tLQogIAlOVUxMCiAgfTsKICAKKyBzdGF0aWMgY29u c3QgU2NoZW1hUXVlcnkgUXVlcnlfZm9yX2xpc3Rfb2ZfdGYgPSB7CisgCS8qIGNhdG5hbWUg Ki8KKyAJInBnX2NhdGFsb2cucGdfY2xhc3MgYyIsCisgCS8qIHNlbGNvbmRpdGlvbiAqLwor IAkiYy5yZWxraW5kIElOICgncicsICdmJykiLAorIAkvKiB2aXNjb25kaXRpb24gKi8KKyAJ InBnX2NhdGFsb2cucGdfdGFibGVfaXNfdmlzaWJsZShjLm9pZCkiLAorIAkvKiBuYW1lc3Bh Y2UgKi8KKyAJImMucmVsbmFtZXNwYWNlIiwKKyAJLyogcmVzdWx0ICovCisgCSJwZ19jYXRh bG9nLnF1b3RlX2lkZW50KGMucmVsbmFtZSkiLAorIAkvKiBxdWFscmVzdWx0ICovCisgCU5V TEwKKyB9OworIAogIHN0YXRpYyBjb25zdCBTY2hlbWFRdWVyeSBRdWVyeV9mb3JfbGlzdF9v Zl92aWV3cyA9IHsKICAJLyogY2F0bmFtZSAqLwogIAkicGdfY2F0YWxvZy5wZ19jbGFzcyBj IiwKKioqKioqKioqKioqKioqCioqKiAyNzY5LDI3NzUgKioqKiBwc3FsX2NvbXBsZXRpb24o Y2hhciAqdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKQogIC8qIEFOQUxZWkUgKi8KICAJLyog SWYgdGhlIHByZXZpb3VzIHdvcmQgaXMgQU5BTFlaRSwgcHJvZHVjZSBsaXN0IG9mIHRhYmxl cyAqLwogIAllbHNlIGlmIChwZ19zdHJjYXNlY21wKHByZXZfd2QsICJBTkFMWVpFIikgPT0g MCkKISAJCUNPTVBMRVRFX1dJVEhfU0NIRU1BX1FVRVJZKFF1ZXJ5X2Zvcl9saXN0X29mX3Rh YmxlcywgTlVMTCk7CiAgCiAgLyogV0hFUkUgKi8KICAJLyogU2ltcGxlIGNhc2Ugb2YgdGhl IHdvcmQgYmVmb3JlIHRoZSB3aGVyZSBiZWluZyB0aGUgdGFibGUgbmFtZSAqLwotLS0gMjc4 NCwyNzkwIC0tLS0KICAvKiBBTkFMWVpFICovCiAgCS8qIElmIHRoZSBwcmV2aW91cyB3b3Jk IGlzIEFOQUxZWkUsIHByb2R1Y2UgbGlzdCBvZiB0YWJsZXMgKi8KICAJZWxzZSBpZiAocGdf c3RyY2FzZWNtcChwcmV2X3dkLCAiQU5BTFlaRSIpID09IDApCiEgCQlDT01QTEVURV9XSVRI X1NDSEVNQV9RVUVSWShRdWVyeV9mb3JfbGlzdF9vZl90ZiwgTlVMTCk7CiAgCiAgLyogV0hF UkUgKi8KICAJLyogU2ltcGxlIGNhc2Ugb2YgdGhlIHdvcmQgYmVmb3JlIHRoZSB3aGVyZSBi ZWluZyB0aGUgdGFibGUgbmFtZSAqLwoqKiogYS9zcmMvaW5jbHVkZS9jb21tYW5kcy92YWN1 dW0uaAotLS0gYi9zcmMvaW5jbHVkZS9jb21tYW5kcy92YWN1dW0uaAoqKioqKioqKioqKioq KioKKioqIDE2NSwxNzEgKioqKiBleHRlcm4gdm9pZCBsYXp5X3ZhY3V1bV9yZWwoUmVsYXRp b24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10LAotLS0gMTY1LDE4MiAtLS0tCiAgCQkJ CUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IGJzdHJhdGVneSk7CiAgCiAgLyogaW4gY29tbWFuZHMv YW5hbHl6ZS5jICovCisgdHlwZWRlZiBpbnQgKCpTYW1wbGVSb3dBY3F1aXJlRnVuYykgKFJl bGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLAorIAkJCQkJCQkJCSBpbnQgdGFyZ3Jv d3MsCisgCQkJCQkJCQkJIGRvdWJsZSAqdG90YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJv d3MsCisgCQkJCQkJCQkJIEJsb2NrTnVtYmVyICp0b3RhbHBhZ2VzLCBpbnQgZWxldmVsKTsK KyAKICBleHRlcm4gdm9pZCBhbmFseXplX3JlbChPaWQgcmVsaWQsIFZhY3V1bVN0bXQgKnZh Y3N0bXQsCiAgCQkJQnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5KTsKKyBleHRlcm4g dm9pZCBkb19hbmFseXplX3JlbChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0bXQgKnZhY3N0 bXQsIGludCBlbGV2ZWwsIAorIAkJCQkJCSAgIGJvb2wgaW5oLCBTYW1wbGVSb3dBY3F1aXJl RnVuYyBhY3F1aXJlZnVuYyk7CisgZXh0ZXJuIGRvdWJsZSByYW5kb21fZnJhY3Qodm9pZCk7 CisgZXh0ZXJuIGRvdWJsZSBpbml0X3NlbGVjdGlvbl9zdGF0ZShpbnQgbik7CisgZXh0ZXJu IGRvdWJsZSBnZXRfbmV4dF9TKGRvdWJsZSB0LCBpbnQgbiwgZG91YmxlICpzdGF0ZXB0cik7 CisgCiAgCiAgI2VuZGlmICAgLyogVkFDVVVNX0ggKi8KKioqIGEvc3JjL2luY2x1ZGUvZm9y ZWlnbi9mZHdhcGkuaAotLS0gYi9zcmMvaW5jbHVkZS9mb3JlaWduL2Zkd2FwaS5oCioqKioq KioqKioqKioqKgoqKiogMTIsMTkgKioqKgotLS0gMTIsMjEgLS0tLQogICNpZm5kZWYgRkRX QVBJX0gKICAjZGVmaW5lIEZEV0FQSV9ICiAgCisgI2luY2x1ZGUgImZvcmVpZ24vZm9yZWln bi5oIgogICNpbmNsdWRlICJub2Rlcy9leGVjbm9kZXMuaCIKICAjaW5jbHVkZSAibm9kZXMv cmVsYXRpb24uaCIKKyAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAgCiAgLyogVG8gYXZvaWQg aW5jbHVkaW5nIGV4cGxhaW4uaCBoZXJlLCByZWZlcmVuY2UgRXhwbGFpblN0YXRlIHRodXM6 ICovCiAgc3RydWN0IEV4cGxhaW5TdGF0ZTsKKioqKioqKioqKioqKioqCioqKiA2OCw3MyAq KioqIHR5cGVkZWYgdm9pZCAoKlJlU2NhbkZvcmVpZ25TY2FuX2Z1bmN0aW9uKSAoRm9yZWln blNjYW5TdGF0ZSAqbm9kZSk7Ci0tLSA3MCw3OCAtLS0tCiAgCiAgdHlwZWRlZiB2b2lkICgq RW5kRm9yZWlnblNjYW5fZnVuY3Rpb24pIChGb3JlaWduU2NhblN0YXRlICpub2RlKTsKICAK KyB0eXBlZGVmIHZvaWQgKCpBbmFseXplRm9yZWlnblRhYmxlX2Z1bmN0aW9uKSAoUmVsYXRp b24gcmVsYXRpb24sCisgCQkJCQkJCQkJCQkgIFZhY3V1bVN0bXQgKnZhY3N0bXQsCisgCQkJ CQkJCQkJCQkgIGludCBlbGV2ZWwpOwogIAogIC8qCiAgICogRmR3Um91dGluZSBpcyB0aGUg c3RydWN0IHJldHVybmVkIGJ5IGEgZm9yZWlnbi1kYXRhIHdyYXBwZXIncyBoYW5kbGVyCioq KioqKioqKioqKioqKgoqKiogODgsOTMgKioqKiB0eXBlZGVmIHN0cnVjdCBGZHdSb3V0aW5l Ci0tLSA5Myw5OSAtLS0tCiAgCUl0ZXJhdGVGb3JlaWduU2Nhbl9mdW5jdGlvbiBJdGVyYXRl Rm9yZWlnblNjYW47CiAgCVJlU2NhbkZvcmVpZ25TY2FuX2Z1bmN0aW9uIFJlU2NhbkZvcmVp Z25TY2FuOwogIAlFbmRGb3JlaWduU2Nhbl9mdW5jdGlvbiBFbmRGb3JlaWduU2NhbjsKKyAJ QW5hbHl6ZUZvcmVpZ25UYWJsZV9mdW5jdGlvbiBBbmFseXplRm9yZWlnblRhYmxlOwogIH0g RmR3Um91dGluZTsKICAKICAK --------------070903080301060501080200--