Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kVZlK-0004WU-Ok for pgsql-hackers@arkaria.postgresql.org; Thu, 22 Oct 2020 12:32:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kVZlJ-00014L-Mw for pgsql-hackers@arkaria.postgresql.org; Thu, 22 Oct 2020 12:32:09 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kVZlJ-0000ym-3F for pgsql-hackers@lists.postgresql.org; Thu, 22 Oct 2020 12:32:09 +0000 Received: from oss.nttdata.com ([49.212.34.109]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kVZlF-0002fH-0A for pgsql-hackers@postgresql.org; Thu, 22 Oct 2020 12:32:08 +0000 Received: from oss.nttdata.com (localhost [127.0.0.1]) by oss.nttdata.com (Postfix) with ESMTP id 86011601A7; Thu, 22 Oct 2020 21:32:00 +0900 (JST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.102.3 at oss.nttdata.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_c6be2045a8b2a31852217b01f916332c" Date: Thu, 22 Oct 2020 21:32:00 +0900 From: torikoshia To: Kasahara Tatsuhito Cc: Michael Paquier , tomas.vondra@2ndquadrant.com, Tom Lane , PostgreSQL-development Subject: Re: Get memory contexts of an arbitrary backend process In-Reply-To: References: <0271f440ac77f2a4180e0e56ebd944d1@oss.nttdata.com> <4a39f13d6496ea4686bbac4254154fe8@oss.nttdata.com> <640735.1599154807@sss.pgh.pa.us> <20200904124619.k2dgu7dty7awb6cu@development> <8865138e1c262d54e8a67a71b4a538aa@oss.nttdata.com> <20200924040149.GH28585@paquier.xyz> Message-ID: X-Sender: torikoshia@oss.nttdata.com User-Agent: Roundcube Webmail/1.1.9 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --=_c6be2045a8b2a31852217b01f916332c Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed > On Thu, Oct 1, 2020 at 4:06 PM Kasahara Tatsuhito > wrote: > Hi, > > On Fri, Sep 25, 2020 at 4:28 PM torikoshia > wrote: > > Thanks for all your comments, I updated the patch. > Thanks for updating the patch. > I did a brief test and code review. Thanks for your tests and review! > > I added a shared hash table consisted of minimal members > > mainly for managing whether the file is dumped or not. > > Some members like 'loc' seem useful in the future, but I > > haven't added them since it's not essential at this point. > Yes, that would be good. > > +        /* > +         * Since we allow only one session can request to dump > memory context at > +         * the same time, check whether the dump files already exist. > +         */ > +        while (stat(dumpfile, &stat_tmp) == 0 || stat(tmpfile, > &stat_tmp) == 0) > +        { > +            pg_usleep(1000000L); > +        } > > If pg_get_backend_memory_contexts() is executed by two or more > sessions at the same time, it cannot be run exclusively in this way. > Currently it seems to cause a crash when do it so. > This is easy to reproduce and can be done as follows. > > [session-1] > BEGIN; > LOCK TABKE t1; >   [Session-2] >   BEGIN; >   LOCK TABLE t1; <- waiting >     [Session-3] >     select * FROM pg_get_backend_memory_contexts(); >       [Session-4] >       select * FROM pg_get_backend_memory_contexts(); > > If you issue commit or abort at session-1, you will get SEGV. > > Instead of checking for the existence of the file, it might be better > to use a hash (mcxtdumpHash) entry with LWLock. Thanks! Added a LWLock and changed the way from checking the file existence to finding the hash entry. > +        if (proc == NULL) > +        { > +            ereport(WARNING, > +                    (errmsg("PID %d is not a PostgreSQL server > process", dst_pid))); > +            return (Datum) 1; > +        } > > Shouldn't it clear the hash entry before return? Yeah. added codes for removing the entry. > > +        /* Wait until target process finished dumping file. */ > +        while (!entry->is_dumped) > +        { > +            CHECK_FOR_INTERRUPTS(); > +            pg_usleep(10000L); > +        } > > If the target is killed and exit before dumping the memory > information, you're in an infinite loop here. > So how about making sure that any process that has to stop before > doing a memory dump changes the status of the hash (entry->is_dumped) > before stopping and the caller detects it? > I'm not sure it's best or not, but you might want to use something > like the on_shmem_exit callback. Thanks for your idea! Added a callback to change the status of the hash table entry. Although I think it's necessary to remove this callback when it finished processing memory dumping, on_shmem_exit() does not seem to have such a function. I used before_shmem_exit() since it has a corresponding function to remove registered callback. If it's inappropriate, I'm going to add a function removing the registered callback of on_shmem_exit(). > In the current design, if the caller stops processing before reading > the dumped file, you will have an orphaned file. > It looks like the following. > > [session-1] > BEGIN; > LOCK TABKE t1; >   [Session-2] >   BEGIN; >   LOCK TABLE t1; <- waiting >     [Session-3] >     select * FROM pg_get_backend_memory_contexts(); > > If you cancel or terminate the session-3, then issue commit or abort > at session-1, you will get orphaned files in pg_memusage. > > So if you allow only one session can request to dump file, it could > call pg_memusage_reset() before send the signal in this function. Although I'm going to allow only one session per one target process, I'd like to allow running multiple pg_get_backend_memory_contexts() which target process is different. Instead of calling pg_memusage_reset(), I added a callback for cleaning up orphaned files and the elements of the hash table using before_shmem_exit() through PG_ENSURE_ERROR_CLEANUP() and PG_END_ENSURE_ERROR_CLEANUP(). I chose PG_ENSURE_ERROR_CLEANUP() and PG_END_ENSURE_ERROR_CLEANUP() here since it can handle not only termination but also cancellation. Any thoughts? -- Atsushi Torikoshi --=_c6be2045a8b2a31852217b01f916332c Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0003-Enabled-pg_get_backend_memory_contexts-to-collect.patch Content-Disposition: attachment; filename=0003-Enabled-pg_get_backend_memory_contexts-to-collect.patch; size=29870 RnJvbSA0ZDNmZjI1NGE2MzQ4OTVlOGMyM2M4M2JiNjNmNTE5YTE0Nzg1ZjA2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBdHN1c2hpIFRvcmlrb3NoaSA8dG9yaWtvc2hpYUBvc3MubnR0 ZGF0YS5jb20+CkRhdGU6IFRodSwgMjIgT2N0IDIwMjAgMjA6MjQ6MTkgKzA5MDAKU3ViamVjdDog W1BBVENIXSBFbmFibGVkIHBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cygpIHRvIGNvbGxl Y3QgYXJiaXRyYXJ5CiBiYWNrZW5kIHByb2Nlc3MncyBtZW1vcnkgY29udGV4dHMuCgpQcmV2aXNv dWx5LCBwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMoKSBjb3VsZCBvbmx5IGdldCB0aGUK bG9jYWwgbWVtb3J5IGNvbnRleHRzLiBUaGlzIHBhdGNoIGVuYWJsZXMgdG8gZ2V0IG1lbW9yeSBj b250ZXh0cwpvZiB0aGUgYXJiaXRyYXJ5IHByb2Nlc3Mgd2hpY2ggUElEIGlzIHNwZWNpZmllZCBi eSB0aGUgYXJndW1lbnQuCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jICAg ICAgICAgICAgfCAgIDcgKwogc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsICAg ICAgICAgfCAgIDQgKy0KIHNyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2Jhc2ViYWNrdXAuYyAgICAg ICAgIHwgICAzICsKIHNyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYyAgICAgICAgICAgICAg IHwgICAyICsKIHNyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NzaWduYWwuYyAgICAgICAgIHwg ICA0ICsKIHNyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sd2xvY2tuYW1lcy50eHQgICAgIHwgICAx ICsKIHNyYy9iYWNrZW5kL3Rjb3AvcG9zdGdyZXMuYyAgICAgICAgICAgICAgICAgIHwgICA1ICsK IHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9tY3h0ZnVuY3MuYyAgICAgICAgICAgIHwgNTY2ICsrKysr KysrKysrKysrKysrKy0KIHNyYy9iYWNrZW5kL3V0aWxzL2luaXQvZ2xvYmFscy5jICAgICAgICAg ICAgIHwgICAxICsKIHNyYy9iaW4vaW5pdGRiL2luaXRkYi5jICAgICAgICAgICAgICAgICAgICAg IHwgICAzICstCiBzcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wMTBfcGdfYmFzZWJhY2t1cC5wbCB8 ICAgNCArLQogc3JjL2Jpbi9wZ19yZXdpbmQvZmlsZW1hcC5jICAgICAgICAgICAgICAgICAgfCAg IDMgKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgICAgICAgfCAgMTAg Ky0KIHNyYy9pbmNsdWRlL21pc2NhZG1pbi5oICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsK IHNyYy9pbmNsdWRlL3N0b3JhZ2UvcHJvY3NpZ25hbC5oICAgICAgICAgICAgIHwgICAxICsKIHNy Yy9pbmNsdWRlL3V0aWxzL21jeHRmdW5jcy5oICAgICAgICAgICAgICAgIHwgIDUxICsrCiBzcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dCAgICAgICAgICB8ICAgMiArLQogMTcgZmls ZXMgY2hhbmdlZCwgNjQyIGluc2VydGlvbnMoKyksIDI2IGRlbGV0aW9ucygtKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IHNyYy9pbmNsdWRlL3V0aWxzL21jeHRmdW5jcy5oCgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5z YW0veGxvZy5jCmluZGV4IDUyYTY3YjExNzAuLjgyMGI2NmRhNjIgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJh bnNhbS94bG9nLmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlICJzdG9yYWdlL3N5bmMuaCIK ICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2d1Yy5oIgorI2lu Y2x1ZGUgInV0aWxzL21jeHRmdW5jcy5oIgogI2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCiAj aW5jbHVkZSAidXRpbHMvcHNfc3RhdHVzLmgiCiAjaW5jbHVkZSAidXRpbHMvcmVsbWFwcGVyLmgi CkBAIC02OTg3LDYgKzY5ODgsMTIgQEAgU3RhcnR1cFhMT0codm9pZCkKIAkJICovCiAJCXBnc3Rh dF9yZXNldF9hbGwoKTsKIAorCQkvKgorCQkgKiBSZXNldCBkdW1wZWQgZmlsZXMgaW4gcGdfbWVt dXNhZ2UsIGJlY2F1c2UgdGFyZ2V0IHByb2Nlc3NlcyBkbworCQkgKiBub3QgZXhpc3QgYW55IG1v cmUuCisJCSAqLworCQlwZ19tZW11c2FnZV9yZXNldCgwKTsKKwogCQkvKgogCQkgKiBJZiB0aGVy ZSB3YXMgYSBiYWNrdXAgbGFiZWwgZmlsZSwgaXQncyBkb25lIGl0cyBqb2IgYW5kIHRoZSBpbmZv CiAJCSAqIGhhcyBub3cgYmVlbiBwcm9wYWdhdGVkIGludG8gcGdfY29udHJvbC4gIFdlIG11c3Qg Z2V0IHJpZCBvZiB0aGUKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX3Zp ZXdzLnNxbCBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX3ZpZXdzLnNxbAppbmRleCA4NWNk MTQ3ZTIxLi4zZjE3N2Y5Njg4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jYXRhbG9nL3N5c3Rl bV92aWV3cy5zcWwKKysrIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsCkBA IC01NTUsMTAgKzU1NSwxMCBAQCBSRVZPS0UgQUxMIE9OIHBnX3NobWVtX2FsbG9jYXRpb25zIEZS T00gUFVCTElDOwogUkVWT0tFIEVYRUNVVEUgT04gRlVOQ1RJT04gcGdfZ2V0X3NobWVtX2FsbG9j YXRpb25zKCkgRlJPTSBQVUJMSUM7CiAKIENSRUFURSBWSUVXIHBnX2JhY2tlbmRfbWVtb3J5X2Nv bnRleHRzIEFTCi0gICAgU0VMRUNUICogRlJPTSBwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4 dHMoKTsKKyAgICBTRUxFQ1QgKiBGUk9NIHBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cyhO VUxMKTsKIAogUkVWT0tFIEFMTCBPTiBwZ19iYWNrZW5kX21lbW9yeV9jb250ZXh0cyBGUk9NIFBV QkxJQzsKLVJFVk9LRSBFWEVDVVRFIE9OIEZVTkNUSU9OIHBnX2dldF9iYWNrZW5kX21lbW9yeV9j b250ZXh0cygpIEZST00gUFVCTElDOworUkVWT0tFIEVYRUNVVEUgT04gRlVOQ1RJT04gcGdfZ2V0 X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzIEZST00gUFVCTElDOwogCiAtLSBTdGF0aXN0aWNzIHZp ZXdzCiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2Jhc2ViYWNrdXAuYyBi L3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2Jhc2ViYWNrdXAuYwppbmRleCBiODlkZjAxZmE3Li4z ZWRiNTkxOTUyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9iYXNlYmFja3Vw LmMKKysrIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vYmFzZWJhY2t1cC5jCkBAIC0xODQsNiAr MTg0LDkgQEAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGV4Y2x1ZGVEaXJDb250ZW50c1tdID0K IAkvKiBDb250ZW50cyB6ZXJvZWQgb24gc3RhcnR1cCwgc2VlIFN0YXJ0dXBTVUJUUkFOUygpLiAq LwogCSJwZ19zdWJ0cmFucyIsCiAKKwkvKiBTa2lwIG1lbW9yeSBjb250ZXh0IGR1bXBlZCBmaWxl cy4gKi8KKwkicGdfbWVtdXNhZ2UiLAorCiAJLyogZW5kIG9mIGxpc3QgKi8KIAlOVUxMCiB9Owpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5jIGIvc3JjL2JhY2tlbmQv c3RvcmFnZS9pcGMvaXBjaS5jCmluZGV4IDk2YzJhYWFiYmQuLjkyZjIxYWQyYmYgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYworKysgYi9zcmMvYmFja2VuZC9zdG9y YWdlL2lwYy9pcGNpLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICJzdG9yYWdlL3Byb2Nz aWduYWwuaCIKICNpbmNsdWRlICJzdG9yYWdlL3NpbnZhbGFkdC5oIgogI2luY2x1ZGUgInN0b3Jh Z2Uvc3Bpbi5oIgorI2luY2x1ZGUgInV0aWxzL21jeHRmdW5jcy5oIgogI2luY2x1ZGUgInV0aWxz L3NuYXBtZ3IuaCIKIAogLyogR1VDcyAqLwpAQCAtMjY3LDYgKzI2OCw3IEBAIENyZWF0ZVNoYXJl ZE1lbW9yeUFuZFNlbWFwaG9yZXModm9pZCkKIAlCVHJlZVNobWVtSW5pdCgpOwogCVN5bmNTY2Fu U2htZW1Jbml0KCk7CiAJQXN5bmNTaG1lbUluaXQoKTsKKwlNY3h0RHVtcFNobWVtSW5pdCgpOwog CiAjaWZkZWYgRVhFQ19CQUNLRU5ECiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv aXBjL3Byb2NzaWduYWwuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NzaWduYWwuYwpp bmRleCBmZmU2N2FjZWExLi5jZTZjNjdkOWYyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9y YWdlL2lwYy9wcm9jc2lnbmFsLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvcHJvY3Np Z25hbC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAic3RvcmFnZS9zaG1lbS5oIgogI2lu Y2x1ZGUgInN0b3JhZ2Uvc2ludmFsLmgiCiAjaW5jbHVkZSAidGNvcC90Y29wcHJvdC5oIgorI2lu Y2x1ZGUgInV0aWxzL21jeHRmdW5jcy5oIgogCiAvKgogICogVGhlIFNJR1VTUjEgc2lnbmFsIGlz IG11bHRpcGxleGVkIHRvIHN1cHBvcnQgc2lnbmFsaW5nIG11bHRpcGxlIGV2ZW50CkBAIC01Njcs NiArNTY4LDkgQEAgcHJvY3NpZ25hbF9zaWd1c3IxX2hhbmRsZXIoU0lHTkFMX0FSR1MpCiAJaWYg KENoZWNrUHJvY1NpZ25hbChQUk9DU0lHX0JBUlJJRVIpKQogCQlIYW5kbGVQcm9jU2lnbmFsQmFy cmllckludGVycnVwdCgpOwogCisJaWYgKENoZWNrUHJvY1NpZ25hbChQUk9DU0lHX0RVTVBfTUVN T1JZKSkKKwkJSGFuZGxlUHJvY1NpZ25hbER1bXBNZW1vcnkoKTsKKwogCWlmIChDaGVja1Byb2NT aWduYWwoUFJPQ1NJR19SRUNPVkVSWV9DT05GTElDVF9EQVRBQkFTRSkpCiAJCVJlY292ZXJ5Q29u ZmxpY3RJbnRlcnJ1cHQoUFJPQ1NJR19SRUNPVkVSWV9DT05GTElDVF9EQVRBQkFTRSk7CiAKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sd2xvY2tuYW1lcy50eHQgYi9zcmMv YmFja2VuZC9zdG9yYWdlL2xtZ3IvbHdsb2NrbmFtZXMudHh0CmluZGV4IDc3NDI5MmZkOTQuLjYw MzY3MTNmMTEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sd2xvY2tuYW1l cy50eHQKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL2x3bG9ja25hbWVzLnR4dApAQCAt NTMsMyArNTMsNCBAQCBYYWN0VHJ1bmNhdGlvbkxvY2sJCQkJCTQ0CiAjIDQ1IHdhcyBYYWN0VHJ1 bmNhdGlvbkxvY2sgdW50aWwgcmVtb3ZhbCBvZiBCYWNrZW5kUmFuZG9tTG9jawogV3JhcExpbWl0 c1ZhY3V1bUxvY2sJCQkJNDYKIE5vdGlmeVF1ZXVlVGFpbExvY2sJCQkJCTQ3CitNY3h0RHVtcEhh c2hMb2NrCQkJCQk0OApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jIGIv c3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jCmluZGV4IDQxMWNmYWRiZmYuLmU4ZjQxNzVjNDgg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3Rjb3AvcG9zdGdyZXMuYworKysgYi9zcmMvYmFja2Vu ZC90Y29wL3Bvc3RncmVzLmMKQEAgLTc1LDYgKzc1LDcgQEAKICNpbmNsdWRlICJ0Y29wL3Rjb3Bw cm90LmgiCiAjaW5jbHVkZSAidGNvcC91dGlsaXR5LmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2Nh Y2hlLmgiCisjaW5jbHVkZSAidXRpbHMvbWN4dGZ1bmNzLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVt dXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9wc19zdGF0dXMuaCIKICNpbmNsdWRlICJ1dGlscy9z bmFwbWdyLmgiCkBAIC01MzksNiArNTQwLDEwIEBAIFByb2Nlc3NDbGllbnRSZWFkSW50ZXJydXB0 KGJvb2wgYmxvY2tlZCkKIAkJLyogUHJvY2VzcyBub3RpZnkgaW50ZXJydXB0cywgaWYgYW55ICov CiAJCWlmIChub3RpZnlJbnRlcnJ1cHRQZW5kaW5nKQogCQkJUHJvY2Vzc05vdGlmeUludGVycnVw dCgpOworCisJCS8qIFByb2Nlc3MgbWVtb3J5IGNvbnRleHRzIGR1bXAgaW50ZXJydXB0cywgaWYg YW55ICovCisJCWlmIChQcm9jU2lnbmFsRHVtcE1lbW9yeVBlbmRpbmcpCisJCQlQcm9jZXNzRHVt cE1lbW9yeUludGVycnVwdCgpOwogCX0KIAllbHNlIGlmIChQcm9jRGllUGVuZGluZykKIAl7CmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvbWN4dGZ1bmNzLmMgYi9zcmMvYmFja2Vu ZC91dGlscy9hZHQvbWN4dGZ1bmNzLmMKaW5kZXggNTBlMWIwN2ZmMC4uNWI3NDQxZjRkZCAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21jeHRmdW5jcy5jCisrKyBiL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9tY3h0ZnVuY3MuYwpAQCAtMTUsMzAgKzE1LDgyIEBACiAKICNpbmNsdWRl ICJwb3N0Z3Jlcy5oIgogCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQu aD4KKworI2luY2x1ZGUgImNvbW1vbi9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgog I2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCisjaW5jbHVk ZSAic3RvcmFnZS9pcGMuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2xhdGNoLmgiCisjaW5jbHVkZSAi c3RvcmFnZS9wcm9jLmgiCisjaW5jbHVkZSAic3RvcmFnZS9wcm9jYXJyYXkuaCIKKyNpbmNsdWRl ICJzdG9yYWdlL3Byb2NzaWduYWwuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3NobWVtLmgiCiAjaW5j bHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9tY3h0ZnVuY3MuaCIKKwor LyogVGhlIG1heCBieXRlcyBmb3Igc2hvd2luZyBuYW1lcyBhbmQgaWRlbnRpZmllcnMgb2YgTWVt b3J5Q29udGV4dC4gKi8KKyNkZWZpbmUgTUVNT1JZX0NPTlRFWFRfRElTUExBWV9TSVpFCTEwMjQK KworLyogTnVtYmVyIG9mIGNvbHVtbnMgaW4gcGdfYmFja2VuZF9tZW1vcnlfY29udGV4dHMgdmll dyAqLworI2RlZmluZSBQR19HRVRfQkFDS0VORF9NRU1PUllfQ09OVEVYVFNfQ09MUwk5CisKKy8q IEhhc2ggZm9yIG1hbmFnaW5nIHRoZSBzdGF0dXMgb2YgbWVtb3J5IGNvbnRleHQgZHVtcC4gKi8K K3N0YXRpYyBIVEFCICptY3h0ZHVtcEhhc2ggPSBOVUxMOworCisvKgorICogTWN4dER1bXBLaWxs CisgKiAJCUNhbGxlZCB3aGVuIHRhcmdldCBwcm9jZXNzIG9mIGR1bXBpbmcgbWVtb3J5IGV4aXRz LgorICoKKyAqIFRoaXMgZnVuY3Rpb24ganVzdCBjaGFuZ2VzIHRoZSBkdW1wX3N0YXR1cyBhbmQg YWN0dWFsIGNsZWFudXAgaXMKKyAqIGRvbmUgYnkgdGhlIGNhbGxlciBvZiBwZ19nZXRfYmFja2Vu ZF9tZW1vcnlfY29udGV4dHMoKS4KKyAqLworc3RhdGljIHZvaWQKK01jeHREdW1wS2lsbChpbnQg Y29kZSwgRGF0dW0gYXJnKQoreworCW1jeHRkdW1wRW50cnkgKmVudHJ5ID0gKG1jeHRkdW1wRW50 cnkgKikgRGF0dW1HZXRQb2ludGVyKGFyZyk7CisKKwllbnRyeS0+ZHVtcF9zdGF0dXMgPSBNQ1hU RFVNUFNUQVRVU19FUlJPUjsKK30KIAotLyogLS0tLS0tLS0tLQotICogVGhlIG1heCBieXRlcyBm b3Igc2hvd2luZyBpZGVudGlmaWVycyBvZiBNZW1vcnlDb250ZXh0LgotICogLS0tLS0tLS0tLQor LyoKKyAqIE1jeHRSZXFLaWxsCisgKgkJQ2xlYW51cCBmdW5jdGlvbi4KKyAqCisgKiBDYWxsZWQg d2hlbiB0aGUgY2FsbGVyIG9mIHBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cygpCisgKiBl eGl0cy4KICAqLwotI2RlZmluZSBNRU1PUllfQ09OVEVYVF9JREVOVF9ESVNQTEFZX1NJWkUJMTAy NAorc3RhdGljIHZvaWQKK01jeHRSZXFLaWxsKGludCBjb2RlLCBEYXR1bSBhcmcpCit7CisJaW50 CQlkc3RfcGlkID0gRGF0dW1HZXRJbnQzMihhcmcpOzsKKworCUxXTG9ja0FjcXVpcmUoTWN4dER1 bXBIYXNoTG9jaywgTFdfRVhDTFVTSVZFKTsKKworCWlmIChoYXNoX3NlYXJjaChtY3h0ZHVtcEhh c2gsICZkc3RfcGlkLCBIQVNIX1JFTU9WRSwgTlVMTCkgPT0gTlVMTCkKKwkJZWxvZyhFUlJPUiwg Imhhc2ggdGFibGUgY29ycnVwdGVkIik7CisKKwlMV0xvY2tSZWxlYXNlKE1jeHREdW1wSGFzaExv Y2spOworCisJcGdfbWVtdXNhZ2VfcmVzZXQoZHN0X3BpZCk7Cit9CiAKIC8qCiAgKiBQdXRNZW1v cnlDb250ZXh0c1N0YXRzVHVwbGVTdG9yZQogICoJCU9uZSByZWN1cnNpb24gbGV2ZWwgZm9yIHBn X2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cy4KKyAqCisgKiBOb3RlOiBXaGVuIGZwb3V0IGlz IG5vdCBOVUxMLCBmZXJyb3IoKSBjaGVjayBtdXN0IGJlIGRvbmUgYnkgdGhlIGNhbGxlci4KICAq Lwogc3RhdGljIHZvaWQKIFB1dE1lbW9yeUNvbnRleHRzU3RhdHNUdXBsZVN0b3JlKFR1cGxlc3Rv cmVzdGF0ZSAqdHVwc3RvcmUsCiAJCQkJCQkJCVR1cGxlRGVzYyB0dXBkZXNjLCBNZW1vcnlDb250 ZXh0IGNvbnRleHQsCi0JCQkJCQkJCWNvbnN0IGNoYXIgKnBhcmVudCwgaW50IGxldmVsKQorCQkJ CQkJCQljb25zdCBjaGFyICpwYXJlbnQsIGludCBsZXZlbCwgRklMRSAqZnBvdXQpCiB7Ci0jZGVm aW5lIFBHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xTCTkKLQogCURhdHVtCQl2YWx1 ZXNbUEdfR0VUX0JBQ0tFTkRfTUVNT1JZX0NPTlRFWFRTX0NPTFNdOwogCWJvb2wJCW51bGxzW1BH X0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xTXTsKKwljaGFyCQljbGlwcGVkX2lkZW50 W01FTU9SWV9DT05URVhUX0RJU1BMQVlfU0laRV07CiAJTWVtb3J5Q29udGV4dENvdW50ZXJzIHN0 YXQ7CiAJTWVtb3J5Q29udGV4dCBjaGlsZDsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtNzQsMTQg KzEyNiwxMiBAQCBQdXRNZW1vcnlDb250ZXh0c1N0YXRzVHVwbGVTdG9yZShUdXBsZXN0b3Jlc3Rh dGUgKnR1cHN0b3JlLAogCWlmIChpZGVudCkKIAl7CiAJCWludAkJaWRsZW4gPSBzdHJsZW4oaWRl bnQpOwotCQljaGFyCQljbGlwcGVkX2lkZW50W01FTU9SWV9DT05URVhUX0lERU5UX0RJU1BMQVlf U0laRV07Ci0KIAkJLyoKIAkJICogU29tZSBpZGVudGlmaWVycyBzdWNoIGFzIFNRTCBxdWVyeSBz dHJpbmcgY2FuIGJlIHZlcnkgbG9uZywKIAkJICogdHJ1bmNhdGUgb3ZlcnNpemUgaWRlbnRpZmll cnMuCiAJCSAqLwotCQlpZiAoaWRsZW4gPj0gTUVNT1JZX0NPTlRFWFRfSURFTlRfRElTUExBWV9T SVpFKQotCQkJaWRsZW4gPSBwZ19tYmNsaXBsZW4oaWRlbnQsIGlkbGVuLCBNRU1PUllfQ09OVEVY VF9JREVOVF9ESVNQTEFZX1NJWkUgLSAxKTsKKwkJaWYgKGlkbGVuID49IE1FTU9SWV9DT05URVhU X0RJU1BMQVlfU0laRSkKKwkJCWlkbGVuID0gcGdfbWJjbGlwbGVuKGlkZW50LCBpZGxlbiwgTUVN T1JZX0NPTlRFWFRfRElTUExBWV9TSVpFIC0gMSk7CiAKIAkJbWVtY3B5KGNsaXBwZWRfaWRlbnQs IGlkZW50LCBpZGxlbik7CiAJCWNsaXBwZWRfaWRlbnRbaWRsZW5dID0gJ1wwJzsKQEAgLTEwMSwx NSArMTUxLDIwMCBAQCBQdXRNZW1vcnlDb250ZXh0c1N0YXRzVHVwbGVTdG9yZShUdXBsZXN0b3Jl c3RhdGUgKnR1cHN0b3JlLAogCXZhbHVlc1s2XSA9IEludDY0R2V0RGF0dW0oc3RhdC5mcmVlc3Bh Y2UpOwogCXZhbHVlc1s3XSA9IEludDY0R2V0RGF0dW0oc3RhdC5mcmVlY2h1bmtzKTsKIAl2YWx1 ZXNbOF0gPSBJbnQ2NEdldERhdHVtKHN0YXQudG90YWxzcGFjZSAtIHN0YXQuZnJlZXNwYWNlKTsK LQl0dXBsZXN0b3JlX3B1dHZhbHVlcyh0dXBzdG9yZSwgdHVwZGVzYywgdmFsdWVzLCBudWxscyk7 CisKKwkvKgorCSAqIFNpbmNlIHBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cygpIGlzIGNh bGxlZCBmcm9tIGxvY2FsIHByb2Nlc3MsCisJICogc2ltcGx5IHB1dCB0dXBsZXMuCisJICovCisJ aWYoZnBvdXQgPT0gTlVMTCkKKwkJdHVwbGVzdG9yZV9wdXR2YWx1ZXModHVwc3RvcmUsIHR1cGRl c2MsIHZhbHVlcywgbnVsbHMpOworCisJLyoKKwkgKiBXcml0ZSBvdXQgdGhlIGN1cnJlbnQgbWVt b3J5IGNvbnRleHQgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YKKwkgKiAia2V5OiB2YWx1ZSIg cGFpcnMgdG8gdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgb2YKKwkgKiBwZ19nZXRf YmFja2VuZF9tZW1vcnlfY29udGV4dHMoKS4KKwkgKi8KKwllbHNlCisJeworCQkvKgorCQkgKiBN YWtlIGVhY2ggbWVtb3J5IGNvbnRleHQgaW5mb3JtYXRpb24gc3RhcnRzIHdpdGggJ0QnLgorCQkg KiBUaGlzIGlzIGNoZWNrZWQgYnkgdGhlIGNhbGxlciB3aGVuIHJlYWRpbmcgdGhlIGZpbGUuCisJ CSAqLworCQlmcHV0YygnRCcsIGZwb3V0KTsKKworCQlmcHJpbnRmKGZwb3V0LAorCQkJIm5hbWU6 ICVzLCBpZGVudDogJXMsIHBhcmVudDogJXMsIGxldmVsOiAlZCwgdG90YWxfYnl0ZXM6ICVsdSwg XAorCQkJdG90YWxfbmJsb2NrczogJWx1LCBmcmVlX2J5dGVzOiAlbHUsIGZyZWVfY2h1bmtzOiAl bHUsIHVzZWRfYnl0ZXM6ICVsdSxcbiIsCisJCQluYW1lLAorCQkJaWRlbnQgPyBjbGlwcGVkX2lk ZW50IDogIm5vbmUiLAorCQkJcGFyZW50ID8gcGFyZW50IDogIm5vbmUiLCBsZXZlbCwKKwkJCXN0 YXQudG90YWxzcGFjZSwKKwkJCXN0YXQubmJsb2NrcywKKwkJCXN0YXQuZnJlZXNwYWNlLAorCQkJ c3RhdC5mcmVlY2h1bmtzLAorCQkJc3RhdC50b3RhbHNwYWNlIC0gc3RhdC5mcmVlc3BhY2UpOwor CX0KIAogCWZvciAoY2hpbGQgPSBjb250ZXh0LT5maXJzdGNoaWxkOyBjaGlsZCAhPSBOVUxMOyBj aGlsZCA9IGNoaWxkLT5uZXh0Y2hpbGQpCiAJewogCQlQdXRNZW1vcnlDb250ZXh0c1N0YXRzVHVw bGVTdG9yZSh0dXBzdG9yZSwgdHVwZGVzYywKLQkJCQkJCQkJICBjaGlsZCwgbmFtZSwgbGV2ZWwg KyAxKTsKKwkJCQkJCQkJICBjaGlsZCwgbmFtZSwgbGV2ZWwgKyAxLCBmcG91dCk7CiAJfQogfQog CisvKgorICogQWRkRW50cnlUb01jeHRkdW1wSGFzaAorICoJIAlhZGQgYW4gZW50cnkgdG8gTWN4 dGR1bXBIYXNoIGZvciBzcGVjaWZpZWQgUElELgorICovCitzdGF0aWMgbWN4dGR1bXBFbnRyeSAq CitBZGRFbnRyeVRvTWN4dGR1bXBIYXNoKGludCBwaWQpCit7CisJbWN4dGR1bXBFbnRyeQkqZW50 cnk7CisJYm9vbAkJZm91bmQ7CisKKwkvKgorCSAqIFdlIG9ubHkgYWxsb3cgb25lIHNlc3Npb24g cGVyIHRhcmdldCBwcm9jZXNzIHRvIHJlcXVlc3QgYSBtZW1vcnkKKwkgKiBkdW1wIGF0IGEgdGlt ZS4KKwkgKiBJZiBtY3h0ZHVtcEhhc2ggaGFzIGNvcnJlc3BvbmRpbmcgZW50cnksIHdhaXQgdW50 aWwgaXQgaGFzIHJlbW92ZWQuCisJICovCisJd2hpbGUgKHRydWUpCisJeworCQlMV0xvY2tBY3F1 aXJlKE1jeHREdW1wSGFzaExvY2ssIExXX1NIQVJFRCk7CisJCWVudHJ5ID0gKG1jeHRkdW1wRW50 cnkgKikgaGFzaF9zZWFyY2gobWN4dGR1bXBIYXNoLCAmcGlkLAorCQkJSEFTSF9FTlRFUiwgJmZv dW5kKTsKKworCQlpZiAoIWZvdW5kKQorCQl7CisJCQlMV0xvY2tSZWxlYXNlKE1jeHREdW1wSGFz aExvY2spOworCQkJTFdMb2NrQWNxdWlyZShNY3h0RHVtcEhhc2hMb2NrLCBMV19FWENMVVNJVkUp OworCisJCQllbnRyeS0+ZHVtcF9zdGF0dXMgPSBNQ1hURFVNUFNUQVRVU19OT1RZRVQ7CisJCQll bnRyeS0+c3JjX3BpZCA9IE15UHJvY1BpZDsKKworCQkJTFdMb2NrUmVsZWFzZShNY3h0RHVtcEhh c2hMb2NrKTsKKworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJCWVsc2UKKwkJeworCQkJZXJlcG9y dChJTkZPLAorCQkJCQkoZXJybXNnKCJQSUQgJWQgaXMgbG9va2VkIHVwIGJ5IGFub3RoZXIgcHJv Y2VzcyIsIHBpZCkpKTsKKworCQkJTFdMb2NrUmVsZWFzZShNY3h0RHVtcEhhc2hMb2NrKTsKKwor CQkJcGdfdXNsZWVwKDEwMDAwMDBMKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFB1dER1bXBlZFZh bHVlc09uVHVwbGVzdG9yZQorICoJCVJlYWQgc3BlY2lmaWVkIG1lbW9yeSBjb250ZXh0IGR1bXAg ZmlsZSBhbmQgcHV0IGl0cyB2YWx1ZXMKKyAqCQlvbiB0aGUgdHVwbGUgc3RvcmUuCisgKi8KK3N0 YXRpYyB2b2lkCitQdXREdW1wZWRWYWx1ZXNPblR1cGxlc3RvcmUoY2hhciAqZHVtcGZpbGUsIFR1 cGxlc3RvcmVzdGF0ZSAqdHVwc3RvcmUsCisJCQkJCQkJCVR1cGxlRGVzYyB0dXBkZXNjLCBpbnQg cGlkKQoreworCWludAkJZm9ybWF0X2lkOworCUZJTEUJIAkqZnBpbjsKKworCWlmICgoZnBpbiA9 IEFsbG9jYXRlRmlsZShkdW1wZmlsZSwgInIiKSkgPT0gTlVMTCkKKwl7CisJCWlmIChlcnJubyAh PSBFTk9FTlQpCisJCQllcmVwb3J0KExPRywgKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCisJ CQkJIGVycm1zZygiY291bGQgbm90IG9wZW4gbWVtb3J5IGNvbnRleHQgZHVtcCBmaWxlIFwiJXNc IjogJW0iLAorCQkJCQlkdW1wZmlsZSkpKTsKKwl9CisKKwkvKiBWZXJpZnkgaXQncyBvZiB0aGUg ZXhwZWN0ZWQgZm9ybWF0LiAqLworCWlmIChmcmVhZCgmZm9ybWF0X2lkLCAxLCBzaXplb2YoZm9y bWF0X2lkKSwgZnBpbikgIT0gc2l6ZW9mKGZvcm1hdF9pZCkgfHwKKwkJZm9ybWF0X2lkICE9IFBH X01FTUNPTlRFWFRfRklMRV9GT1JNQVRfSUQpCisJeworCQllcmVwb3J0KFdBUk5JTkcsCisJCQkJ KGVycm1zZygiY29ycnVwdGVkIG1lbW9yeSBjb250ZXh0IGR1bXAgZmlsZSBcIiVzXCIiLCBkdW1w ZmlsZSkpKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFJlYWQgZHVtcGVkIGZpbGUgYW5kIHB1 dCB2YWx1ZXMgb24gdHVwbGUgc3RvcmUuICovCisJd2hpbGUgKHRydWUpCisJeworCQlEYXR1bQkJ dmFsdWVzW1BHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xTXTsKKwkJYm9vbAkJbnVs bHNbUEdfR0VUX0JBQ0tFTkRfTUVNT1JZX0NPTlRFWFRTX0NPTFNdOworCQljaGFyIAkJbmFtZVtN RU1PUllfQ09OVEVYVF9ESVNQTEFZX1NJWkVdOworCQljaGFyIAkJcGFyZW50W01FTU9SWV9DT05U RVhUX0RJU1BMQVlfU0laRV07CisJCWNoYXIgCQljbGlwcGVkX2lkZW50W01FTU9SWV9DT05URVhU X0RJU1BMQVlfU0laRV07CisJCWludCAJCWxldmVsOworCQlTaXplCXRvdGFsX2J5dGVzOworCQlT aXplCXRvdGFsX25ibG9ja3M7CisJCVNpemUJZnJlZV9ieXRlczsKKwkJU2l6ZQlmcmVlX2NodW5r czsKKwkJU2l6ZQl1c2VkX2J5dGVzOworCisJCW1lbXNldCh2YWx1ZXMsIDAsIHNpemVvZih2YWx1 ZXMpKTsKKwkJbWVtc2V0KG51bGxzLCAwLCBzaXplb2YobnVsbHMpKTsKKworCQlzd2l0Y2ggKGZn ZXRjKGZwaW4pKQorCQl7CisJCQkvKiAnRCcJQSBtZW1vcnkgY29udGV4dCBpbmZvcm1hdGlvbiBm b2xsb3dzLiAqLworCQkJY2FzZSAnRCc6CisJCQkJaWYgKGZzY2FuZihmcGluLCAibmFtZTogJTEw MjNbXixdLCBpZGVudDogJTEwMjNbXixdLCBwYXJlbnQ6ICUxMDIzW14sXSwgXAorCQkJCQlsZXZl bDogJWQsIHRvdGFsX2J5dGVzOiAlbHUsIHRvdGFsX25ibG9ja3M6ICVsdSwgXAorCQkJCQlmcmVl X2J5dGVzOiAlbHUsIGZyZWVfY2h1bmtzOiAlbHUsIHVzZWRfYnl0ZXM6ICVsdSxcbiIsCisJCQkJ CW5hbWUsIGNsaXBwZWRfaWRlbnQsIHBhcmVudCwgJmxldmVsLCAmdG90YWxfYnl0ZXMsICZ0b3Rh bF9uYmxvY2tzLAorCQkJCQkJJmZyZWVfYnl0ZXMsICZmcmVlX2NodW5rcywgJnVzZWRfYnl0ZXMp CisJCQkJCSE9IFBHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xTKQorCQkJCXsKKwkJ CQkJZXJlcG9ydChXQVJOSU5HLAorCQkJCQkJKGVycm1zZygiY29ycnVwdGVkIG1lbW9yeSBjb250 ZXh0IGR1bXAgZmlsZSBcIiVzXCIiLAorCQkJCQkJCWR1bXBmaWxlKSkpOworCQkJCQlnb3RvIGRv bmU7CisJCQkJfQorCisJCQkJdmFsdWVzWzBdID0gQ1N0cmluZ0dldFRleHREYXR1bShuYW1lKTsK KworCQkJCWlmIChzdHJjbXAoY2xpcHBlZF9pZGVudCwgIm5vbmUiKSkKKwkJCQkJdmFsdWVzWzFd ID0gQ1N0cmluZ0dldFRleHREYXR1bShjbGlwcGVkX2lkZW50KTsKKwkJCQllbHNlCisJCQkJCW51 bGxzWzFdID0gdHJ1ZTsKKworCQkJCWlmIChzdHJjbXAocGFyZW50LCAibm9uZSIpKQorCQkJCQl2 YWx1ZXNbMl0gPSBDU3RyaW5nR2V0VGV4dERhdHVtKHBhcmVudCk7CisJCQkJZWxzZQorCQkJCQlu dWxsc1syXSA9IHRydWU7CisKKwkJCQl2YWx1ZXNbM10gPSBJbnQzMkdldERhdHVtKGxldmVsKTsK KwkJCQl2YWx1ZXNbNF0gPSBJbnQ2NEdldERhdHVtKHRvdGFsX2J5dGVzKTsKKwkJCQl2YWx1ZXNb NV0gPSBJbnQ2NEdldERhdHVtKHRvdGFsX25ibG9ja3MpOworCQkJCXZhbHVlc1s2XSA9IEludDY0 R2V0RGF0dW0oZnJlZV9ieXRlcyk7CisJCQkJdmFsdWVzWzddID0gSW50NjRHZXREYXR1bShmcmVl X2NodW5rcyk7CisJCQkJdmFsdWVzWzhdID0gSW50NjRHZXREYXR1bSh1c2VkX2J5dGVzKTsKKwor CQkJCXR1cGxlc3RvcmVfcHV0dmFsdWVzKHR1cHN0b3JlLCB0dXBkZXNjLCB2YWx1ZXMsIG51bGxz KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnRSc6CisJCQkJZ290byBkb25lOworCisJCQlkZWZh dWx0OgorCQkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkJCShlcnJtc2coImNvcnJ1cHRlZCBtZW1v cnkgY29udGV4dCBkdW1wIGZpbGUgXCIlc1wiIiwKKwkJCQkJCQlkdW1wZmlsZSkpKTsKKwkJCQln b3RvIGRvbmU7CisJCX0KKwl9Citkb25lOgorCUZyZWVGaWxlKGZwaW4pOworCXVubGluayhkdW1w ZmlsZSk7CisKKwlMV0xvY2tBY3F1aXJlKE1jeHREdW1wSGFzaExvY2ssIExXX0VYQ0xVU0lWRSk7 CisKKwlpZiAoaGFzaF9zZWFyY2gobWN4dGR1bXBIYXNoLCAmcGlkLCBIQVNIX1JFTU9WRSwgTlVM TCkgPT0gTlVMTCkKKwkJZWxvZyhFUlJPUiwgImhhc2ggdGFibGUgY29ycnVwdGVkIik7CisKKwlM V0xvY2tSZWxlYXNlKE1jeHREdW1wSGFzaExvY2spOworfQorCiAvKgogICogcGdfZ2V0X2JhY2tl bmRfbWVtb3J5X2NvbnRleHRzCiAgKgkJU1FMIFNSRiBzaG93aW5nIGJhY2tlbmQgbWVtb3J5IGNv bnRleHQuCkBAIC0xMTcsNiArMzUyLDggQEAgUHV0TWVtb3J5Q29udGV4dHNTdGF0c1R1cGxlU3Rv cmUoVHVwbGVzdG9yZXN0YXRlICp0dXBzdG9yZSwKIERhdHVtCiBwZ19nZXRfYmFja2VuZF9tZW1v cnlfY29udGV4dHMoUEdfRlVOQ1RJT05fQVJHUykKIHsKKwlpbnQJCQlkc3RfcGlkID0gUEdfQVJH SVNOVUxMKDApID8gLTEgOiBQR19HRVRBUkdfSU5UMzIoMCk7CisKIAlSZXR1cm5TZXRJbmZvICpy c2luZm8gPSAoUmV0dXJuU2V0SW5mbyAqKSBmY2luZm8tPnJlc3VsdGluZm87CiAJVHVwbGVEZXNj CXR1cGRlc2M7CiAJVHVwbGVzdG9yZXN0YXRlICp0dXBzdG9yZTsKQEAgLTE0NywxMSArMzg0LDMx MCBAQCBwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMoUEdfRlVOQ1RJT05fQVJHUykKIAog CU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKIAotCVB1dE1lbW9yeUNvbnRleHRz U3RhdHNUdXBsZVN0b3JlKHR1cHN0b3JlLCB0dXBkZXNjLAotCQkJCQkJCQlUb3BNZW1vcnlDb250 ZXh0LCBOVUxMLCAwKTsKKwkvKgorCSAqIElmIHRoZSB0YXJnZXQgaXMgbG9jYWwgcHJvY2Vzcywg c2ltcGx5IGxvb2sgaW50byBtZW1vcnkgY29udGV4dHMKKwkgKiByZWN1cnNpdmVseS4KKwkgKi8K KwlpZiAoZHN0X3BpZCA9PSAtMSB8fCBkc3RfcGlkID09IE15UHJvY1BpZCkKKwkJUHV0TWVtb3J5 Q29udGV4dHNTdGF0c1R1cGxlU3RvcmUodHVwc3RvcmUsIHR1cGRlc2MsCisJCQkJCQkJCVRvcE1l bW9yeUNvbnRleHQsICIiLCAwLCBOVUxMKTsKKworCS8qCisJICogU2VuZCBzaWduYWwgZm9yIGR1 bXBpbmcgbWVtb3J5IGNvbnRleHRzIHRvIHRoZSB0YXJnZXQgcHJvY2VzcywKKwkgKiBhbmQgcmVh ZCB0aGUgZHVtcGVkIGZpbGUuCisJICovCisJZWxzZQorCXsKKwkJY2hhcgkJdG1wZmlsZVtNQVhQ R1BBVEhdOworCQljaGFyCQlkdW1wZmlsZVtNQVhQR1BBVEhdOworCQlzdHJ1Y3QgCQlzdGF0IHN0 YXRfdG1wOworCQltY3h0ZHVtcEVudHJ5CSplbnRyeTsKKwkJUEdQUk9DCSAJKnByb2M7CisKKwkJ c25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMvJWQudG1wIiwgUEdfTUVNVVNB R0VfRElSLCBkc3RfcGlkKTsKKwkJc25wcmludGYoZHVtcGZpbGUsIHNpemVvZihkdW1wZmlsZSks ICIlcy8lZCIsIFBHX01FTVVTQUdFX0RJUiwgZHN0X3BpZCk7CisKKwkJZW50cnkgPSBBZGRFbnRy eVRvTWN4dGR1bXBIYXNoKGRzdF9waWQpOworCisJCS8qIENoZWNrIHdoZXRoZXIgdGhlIHRhcmdl dCBwcm9jZXNzIGlzIFBvc3RncmVTUUwgYmFja2VuZCBwcm9jZXNzLiAqLworCQkvKiBUT0RPOiBD aGVjayBhbHNvIHdoZXRoZXIgYmFja2VuZCBvciBub3QuICovCisJCXByb2MgPSBCYWNrZW5kUGlk R2V0UHJvYyhkc3RfcGlkKTsKKworCQlpZiAocHJvYyA9PSBOVUxMKQorCQl7CisJCQllcmVwb3J0 KFdBUk5JTkcsCisJCQkJCShlcnJtc2coIlBJRCAlZCBpcyBub3QgYSBQb3N0Z3JlU1FMIHNlcnZl ciBwcm9jZXNzIiwgZHN0X3BpZCkpKTsKKworCQkJTFdMb2NrQWNxdWlyZShNY3h0RHVtcEhhc2hM b2NrLCBMV19FWENMVVNJVkUpOworCisJCQlpZiAoaGFzaF9zZWFyY2gobWN4dGR1bXBIYXNoLCAm ZHN0X3BpZCwgSEFTSF9SRU1PVkUsIE5VTEwpID09IE5VTEwpCisJCQkJZWxvZyhXQVJOSU5HLCAi aGFzaCB0YWJsZSBjb3JydXB0ZWQiKTsKKworCQkJTFdMb2NrUmVsZWFzZShNY3h0RHVtcEhhc2hM b2NrKTsKKworCQkJcmV0dXJuIChEYXR1bSkgMTsKKwkJfQorCisJCS8qIFRoZSBFTlNVUkUgc3R1 ZmYgZW5zdXJlcyB3ZSBjbGVhbiB1cCBzaGFyZWQgbWVtb3J5IGFuZCBmaWxlcyBvbiBmYWlsdXJl ICovCisJCVBHX0VOU1VSRV9FUlJPUl9DTEVBTlVQKE1jeHRSZXFLaWxsLCAoRGF0dW0pIEludDMy R2V0RGF0dW0oZHN0X3BpZCkpOworCQl7CisJCQlTZW5kUHJvY1NpZ25hbChkc3RfcGlkLCBQUk9D U0lHX0RVTVBfTUVNT1JZLCBJbnZhbGlkQmFja2VuZElkKTsKKworCQkJLyogV2FpdCB1bnRpbCB0 YXJnZXQgcHJvY2VzcyBmaW5pc2hlZCBkdW1waW5nIGZpbGUuICovCisJCQl3aGlsZSAoZW50cnkt PmR1bXBfc3RhdHVzID09IE1DWFREVU1QU1RBVFVTX05PVFlFVCkKKwkJCXsKKwkJCQlDSEVDS19G T1JfSU5URVJSVVBUUygpOworCQkJCXBnX3VzbGVlcCgxMDAwMEwpOworCQkJfQorCQl9CisJCVBH X0VORF9FTlNVUkVfRVJST1JfQ0xFQU5VUChNY3h0UmVxS2lsbCwgKERhdHVtKSBJbnQzMkdldERh dHVtKGRzdF9waWQpKTsKKworCisJCWlmIChlbnRyeS0+ZHVtcF9zdGF0dXMgPT0gTUNYVERVTVBT VEFUVVNfRVJST1IpCisJCXsKKwkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkJKGVycm1zZygiRmFp bGVkIHRvIGdldCBtZW1vcnkgY29udGV4dCBmcm9tIFBJRCAlZCIsIGRzdF9waWQpKSk7CisKKwkJ CWlmIChzdGF0KHRtcGZpbGUsICZzdGF0X3RtcCkgPT0gMCkKKwkJCQl1bmxpbmsodG1wZmlsZSk7 CisJCQlpZiAoc3RhdChkdW1wZmlsZSwgJnN0YXRfdG1wKSA9PSAwKQorCQkJCXVubGluayhkdW1w ZmlsZSk7CisKKwkJCUxXTG9ja0FjcXVpcmUoTWN4dER1bXBIYXNoTG9jaywgTFdfRVhDTFVTSVZF KTsKKworCQkJaWYgKGhhc2hfc2VhcmNoKG1jeHRkdW1wSGFzaCwgJmRzdF9waWQsIEhBU0hfUkVN T1ZFLCBOVUxMKSA9PSBOVUxMKQorCQkJCWVsb2coRVJST1IsICJoYXNoIHRhYmxlIGNvcnJ1cHRl ZCIpOworCisJCQlMV0xvY2tSZWxlYXNlKE1jeHREdW1wSGFzaExvY2spOworCisJCQkvKiBjbGVh biB1cCBhbmQgcmV0dXJuIHRoZSB0dXBsZXN0b3JlICovCisJCQl0dXBsZXN0b3JlX2RvbmVzdG9y aW5nKHR1cHN0b3JlKTsKKworCisJCQlyZXR1cm4gKERhdHVtKSAwOworCQl9CisKKwkJLyogUmVh ZCB2YWx1ZXMgZnJvbSB0aGUgZHVtcGVkIGZpbGUgYW5kIHB1dCB0aGVtIG9uIHR1cGxlc3RvcmUu ICovCisJCVB1dER1bXBlZFZhbHVlc09uVHVwbGVzdG9yZShkdW1wZmlsZSwgdHVwc3RvcmUsIHR1 cGRlc2MsIGRzdF9waWQpOworCX0KIAogCS8qIGNsZWFuIHVwIGFuZCByZXR1cm4gdGhlIHR1cGxl c3RvcmUgKi8KIAl0dXBsZXN0b3JlX2RvbmVzdG9yaW5nKHR1cHN0b3JlKTsKIAogCXJldHVybiAo RGF0dW0pIDA7CiB9CisKKy8qCisgKiBkdW1wX21lbW9yeV9jb250ZXh0cworICogCQlEdW1wIGxv Y2FsIG1lbW9yeSBjb250ZXh0cyB0byBhIGZpbGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2Vz IG5vdCBkZWxldGUgZHVtcGVkIGZpbGUsIGFzIGl0IGlzIGludGVuZGVkIHRvIGJlIHJlYWQKKyAq IGJ5IGFub3RoZXIgcHJvY2Vzcy4KKyAqLworc3RhdGljIHZvaWQKK2R1bXBfbWVtb3J5X2NvbnRl eHRzKHZvaWQpCit7CisJRklMRQkJKmZwb3V0OworCWNoYXIJCXRtcGZpbGVbTUFYUEdQQVRIXTsK KwljaGFyCQlkdW1wZmlsZVtNQVhQR1BBVEhdOworCW1jeHRkdW1wRW50cnkJKmVudHJ5OworCWlu dAkJZm9ybWF0X2lkOworCisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMv JWQudG1wIiwgUEdfTUVNVVNBR0VfRElSLCBNeVByb2NQaWQpOworCXNucHJpbnRmKGR1bXBmaWxl LCBzaXplb2YoZHVtcGZpbGUpLCAiJXMvJWQiLCBQR19NRU1VU0FHRV9ESVIsIE15UHJvY1BpZCk7 CisKKwlMV0xvY2tBY3F1aXJlKE1jeHREdW1wSGFzaExvY2ssIExXX1NIQVJFRCk7CisKKwllbnRy eSA9IChtY3h0ZHVtcEVudHJ5ICopIGhhc2hfc2VhcmNoKG1jeHRkdW1wSGFzaCwgJk15UHJvY1Bp ZCwgSEFTSF9GSU5ELCBOVUxMKTsKKworCUxXTG9ja1JlbGVhc2UoTWN4dER1bXBIYXNoTG9jayk7 CisKKwkvKiBUaGUgcHJvY2VzcyB0aGF0IHJlcXVlc3RlZCB0byBkdW1wIHNlZW1zIGFscmVhZHkg ZXhpdGVkLiAqLworCWlmIChlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwliZWZvcmVfc2ht ZW1fZXhpdChNY3h0RHVtcEtpbGwsIFBvaW50ZXJHZXREYXR1bShlbnRyeSkpOworCisJZnBvdXQg PSBBbGxvY2F0ZUZpbGUodG1wZmlsZSwgInciKTsKKworCWlmIChmcG91dCA9PSBOVUxMKQorCXsK KwkJZXJlcG9ydChMT0csCisJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCisJCQkJIGVy cm1zZygiY291bGQgbm90IHdyaXRlIHRlbXBvcmFyeSBtZW1vcnkgY29udGV4dCBmaWxlIFwiJXNc IjogJW0iLAorCQkJCQkJdG1wZmlsZSkpKTsKKworCQllbnRyeS0+ZHVtcF9zdGF0dXMgPSBNQ1hU RFVNUFNUQVRVU19FUlJPUjsKKworCQlyZXR1cm47CisJfQorCisJZm9ybWF0X2lkID0gUEdfTUVN Q09OVEVYVF9GSUxFX0ZPUk1BVF9JRDsKKwlmd3JpdGUoJmZvcm1hdF9pZCwgc2l6ZW9mKGZvcm1h dF9pZCksIDEsIGZwb3V0KTsKKworCS8qIExvb2sgaW50byBlYWNoIG1lbW9yeSBjb250ZXh0IGZy b20gVG9wTWVtb3J5Q29udGV4dCByZWN1cnNpdmVseS4gKi8KKwlQdXRNZW1vcnlDb250ZXh0c1N0 YXRzVHVwbGVTdG9yZShOVUxMLCBOVUxMLAorCQkJCQkJCVRvcE1lbW9yeUNvbnRleHQsIE5VTEws IDAsIGZwb3V0KTsKKworCS8qCisJICogTWFrZSBkdW1wIGZpbGUgZW5kcyB3aXRoICdEJy4KKwkg KiBUaGlzIGlzIGNoZWNrZWQgYnkgdGhlIGNhbGxlciB3aGVuIHJlYWRpbmcgdGhlIGZpbGUuCisJ ICovCisJZnB1dGMoJ0UnLCBmcG91dCk7CisKKwlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCisJ aWYgKGZlcnJvcihmcG91dCkpCisJeworCQllcmVwb3J0KExPRywKKwkJCQkoZXJyY29kZV9mb3Jf ZmlsZV9hY2Nlc3MoKSwKKwkJCQkgZXJybXNnKCJjb3VsZCBub3Qgd3JpdGUgdGVtcG9yYXJ5IG1l bW9yeSBjb250ZXh0IGR1bXAgZmlsZSBcIiVzXCI6ICVtIiwKKwkJCQkJCXRtcGZpbGUpKSk7CisJ CUZyZWVGaWxlKGZwb3V0KTsKKwkJdW5saW5rKHRtcGZpbGUpOworCX0KKworCS8qIE5vIG1vcmUg b3V0cHV0IHRvIGJlIGRvbmUuIENsb3NlIHRoZSB0bXAgZmlsZSBhbmQgcmVuYW1lIGl0LiAqLwor CWVsc2UgaWYgKEZyZWVGaWxlKGZwb3V0KSA8IDApCisJeworCQllcmVwb3J0KExPRywKKwkJCQko ZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKwkJCQkgZXJybXNnKCJjb3VsZCBub3QgY2xvc2Ug dGVtcG9yYXJ5IG1lbW9yeSBjb250ZXh0IGR1bXAgZmlsZSBcIiVzXCI6ICVtIiwKKwkJCQkJCXRt cGZpbGUpKSk7CisJCXVubGluayh0bXBmaWxlKTsKKwl9CisJZWxzZSBpZiAocmVuYW1lKHRtcGZp bGUsIGR1bXBmaWxlKSA8IDApCisJeworCQllcmVwb3J0KExPRywKKwkJCQkoZXJyY29kZV9mb3Jf ZmlsZV9hY2Nlc3MoKSwKKwkJCQkgZXJybXNnKCJjb3VsZCBub3QgcmVuYW1lIGR1bXAgZmlsZSBc IiVzXCIgdG8gXCIlc1wiOiAlbSIsCisJCQkJCQl0bXBmaWxlLCBkdW1wZmlsZSkpKTsKKwkJdW5s aW5rKHRtcGZpbGUpOworCX0KKworCWVudHJ5LT5kdW1wX3N0YXR1cyA9IE1DWFREVU1QU1RBVFVT X0RPTkU7CisKKwljYW5jZWxfYmVmb3JlX3NobWVtX2V4aXQoTWN4dER1bXBLaWxsLCAoRGF0dW0p IFBvaW50ZXJHZXREYXR1bShlbnRyeSkpOworfQorCisvKgorICogUHJvY2Vzc0R1bXBNZW1vcnlJ bnRlcnJ1cHQKKyAqCQlUaGUgcG9ydGlvbiBvZiBtZW1vcnkgY29udGV4dCBkdW1wIGludGVycnVw dCBoYW5kbGluZyB0aGF0IHJ1bnMKKyAqCQlvdXRzaWRlIG9mIHRoZSBzaWduYWwgaGFuZGxlci4K KyAqLwordm9pZAorUHJvY2Vzc0R1bXBNZW1vcnlJbnRlcnJ1cHQodm9pZCkKK3sKKwlQcm9jU2ln bmFsRHVtcE1lbW9yeVBlbmRpbmcgPSBmYWxzZTsKKwlkdW1wX21lbW9yeV9jb250ZXh0cygpOwor fQorCisvKgorICogSGFuZGxlUHJvY1NpZ25hbER1bXBNZW1vcnkKKyAqIAkJSGFuZGxlIHJlY2Vp cHQgb2YgYW4gaW50ZXJydXB0IGluZGljYXRpbmcgYSBtZW1vcnkgY29udGV4dCBkdW1wLgorICoJ CVNpZ25hbCBoYW5kbGVyIHBvcnRpb24gb2YgaW50ZXJydXB0IGhhbmRsaW5nLgorICovCit2b2lk CitIYW5kbGVQcm9jU2lnbmFsRHVtcE1lbW9yeSh2b2lkKQoreworCVByb2NTaWduYWxEdW1wTWVt b3J5UGVuZGluZyA9IHRydWU7CisKKwkvKiBtYWtlIHN1cmUgdGhlIGV2ZW50IGlzIHByb2Nlc3Nl ZCBpbiBkdWUgY291cnNlICovCisJU2V0TGF0Y2goTXlMYXRjaCk7Cit9CisKKy8qCisgKiBNY3h0 RHVtcFNobWVtSW5pdAorICogCQlJbml0aWFsaXplIG1jeHRkdW1wIGhhc2ggdGFibGUuCisgKi8K K3ZvaWQKK01jeHREdW1wU2htZW1Jbml0KHZvaWQpCit7CisJSEFTSENUTAkJaW5mbzsKKworCU1l bVNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwlpbmZvLmtleXNpemUgPSBzaXplb2YocGlk X3QpOworCWluZm8uZW50cnlzaXplID0gc2l6ZW9mKG1jeHRkdW1wRW50cnkpOworCisJTFdMb2Nr QWNxdWlyZShNY3h0RHVtcEhhc2hMb2NrLCBMV19FWENMVVNJVkUpOworCisJbWN4dGR1bXBIYXNo ID0gU2htZW1Jbml0SGFzaCgibWN4dGR1bXAgaGFzaCIsCisJCQkJCQkJICAgU0hNRU1fTUVNQ09O VEVYVF9TSVpFLAorCQkJCQkJCSAgIFNITUVNX01FTUNPTlRFWFRfU0laRSwKKwkJCQkJCQkgICAm aW5mbywKKwkJCQkJCQkgICBIQVNIX0VMRU0gfCBIQVNIX0JMT0JTKTsKKworCUxXTG9ja1JlbGVh c2UoTWN4dER1bXBIYXNoTG9jayk7Cit9CisKKy8qCisgKiBwZ19tZW11c2FnZV9yZXNldAorICoJ IAlSZW1vdmUgdGhlIG1lbW9yeSBjb250ZXh0IGR1bXAgZmlsZXMuCisgKi8KK3ZvaWQKK3BnX21l bXVzYWdlX3Jlc2V0KGludCBwaWQpCit7CisJRElSCQkqZGlyOworCXN0cnVjdCAJZGlyZW50ICpk dW1wZmlsZTsKKworCWlmIChwaWQgPT0gMCkKKwl7CisJCWRpciA9IEFsbG9jYXRlRGlyKFBHX01F TVVTQUdFX0RJUik7CisJCXdoaWxlICgoZHVtcGZpbGUgPSBSZWFkRGlyKGRpciwgUEdfTUVNVVNB R0VfRElSKSkgIT0gTlVMTCkKKwkJeworCQkJY2hhcgkJZHVtcGZpbGVwYXRoWzMyXTsKKworCQkJ aWYgKHN0cmNtcChkdW1wZmlsZS0+ZF9uYW1lLCAiLiIpID09IDAgfHwgc3RyY21wKGR1bXBmaWxl LT5kX25hbWUsICIuLiIpID09IDApCisJCQkJY29udGludWU7CisKKwkJCXNwcmludGYoZHVtcGZp bGVwYXRoLCAiJXMvJXMiLCBQR19NRU1VU0FHRV9ESVIsIGR1bXBmaWxlLT5kX25hbWUpOworCisJ CQllcmVwb3J0KERFQlVHMiwKKwkJCQkJKGVycm1zZygicmVtb3ZpbmcgZmlsZSBcIiVzXCIiLCBk dW1wZmlsZXBhdGgpKSk7CisKKwkJCWlmICh1bmxpbmsoZHVtcGZpbGVwYXRoKSA8IDApCisJCQl7 CisJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAor CQkJCQkJIGVycm1zZygiY291bGQgbm90IHJlbW92ZSBmaWxlIFwiJXNcIjogJW0iLCBkdW1wZmls ZXBhdGgpKSk7CisJCQl9CisJCX0KKwkJRnJlZURpcihkaXIpOworCX0KKwllbHNlCisJeworCQlj aGFyCQlzdHJfcGlkWzEyXTsKKwkJY2hhcgkJZHVtcGZpbGVwYXRoWzMyXTsKKwkJc3RydWN0IAkJ c3RhdCBzdGF0X3RtcDsKKworCQlwZ19sdG9hKHBpZCwgc3RyX3BpZCk7CisJCXNwcmludGYoZHVt cGZpbGVwYXRoLCAiJXMvJXMiLCBQR19NRU1VU0FHRV9ESVIsIHN0cl9waWQpOworCisJCWVyZXBv cnQoREVCVUcyLAorCQkJCShlcnJtc2coInJlbW92aW5nIGZpbGUgXCIlc1wiIiwgZHVtcGZpbGVw YXRoKSkpOworCisJCWlmIChzdGF0KGR1bXBmaWxlcGF0aCwgJnN0YXRfdG1wKSA9PSAwKQorCQl7 CisJCQlpZiAodW5saW5rKGR1bXBmaWxlcGF0aCkgPCAwKQorCQkJeworCQkJCWVyZXBvcnQoRVJS T1IsCisJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJCQkgZXJybXNnKCJjb3Vs ZCBub3QgcmVtb3ZlIGZpbGUgXCIlc1wiOiAlbSIsIGR1bXBmaWxlcGF0aCkpKTsKKwkJCX0KKwkJ fQorCQlzcHJpbnRmKGR1bXBmaWxlcGF0aCwgIiVzLyVzLnRtcCIsIFBHX01FTVVTQUdFX0RJUiwg c3RyX3BpZCk7CisKKwkJZXJlcG9ydChERUJVRzIsCisJCQkJKGVycm1zZygicmVtb3ZpbmcgZmls ZSBcIiVzXCIiLCBkdW1wZmlsZXBhdGgpKSk7CisKKwkJaWYgKHN0YXQoZHVtcGZpbGVwYXRoLCAm c3RhdF90bXApID09IDApCisJCXsKKwkJCWlmICh1bmxpbmsoZHVtcGZpbGVwYXRoKSA8IDApCisJ CQl7CisJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCks CisJCQkJCSBlcnJtc2coImNvdWxkIG5vdCByZW1vdmUgZmlsZSBcIiVzXCI6ICVtIiwgZHVtcGZp bGVwYXRoKSkpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvaW5pdC9nbG9iYWxzLmMgYi9zcmMvYmFja2VuZC91dGlscy9pbml0L2dsb2JhbHMuYwppbmRl eCA2YWI4MjE2ODM5Li40NjMzMzdmNjYxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9p bml0L2dsb2JhbHMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9pbml0L2dsb2JhbHMuYwpAQCAt MzMsNiArMzMsNyBAQCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgUHJvY0RpZVBlbmRpbmcgPSBmYWxz ZTsKIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBDbGllbnRDb25uZWN0aW9uTG9zdCA9IGZhbHNlOwog dm9sYXRpbGUgc2lnX2F0b21pY190IElkbGVJblRyYW5zYWN0aW9uU2Vzc2lvblRpbWVvdXRQZW5k aW5nID0gZmFsc2U7CiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgUHJvY1NpZ25hbEJhcnJpZXJQZW5k aW5nID0gZmFsc2U7Cit2b2xhdGlsZSBzaWdfYXRvbWljX3QgUHJvY1NpZ25hbER1bXBNZW1vcnlQ ZW5kaW5nID0gZmFsc2U7CiB2b2xhdGlsZSB1aW50MzIgSW50ZXJydXB0SG9sZG9mZkNvdW50ID0g MDsKIHZvbGF0aWxlIHVpbnQzMiBRdWVyeUNhbmNlbEhvbGRvZmZDb3VudCA9IDA7CiB2b2xhdGls ZSB1aW50MzIgQ3JpdFNlY3Rpb25Db3VudCA9IDA7CmRpZmYgLS1naXQgYS9zcmMvYmluL2luaXRk Yi9pbml0ZGIuYyBiL3NyYy9iaW4vaW5pdGRiL2luaXRkYi5jCmluZGV4IGVlM2JmYTgyZjQuLjUy Y2RiMjYyNzIgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vaW5pdGRiL2luaXRkYi5jCisrKyBiL3NyYy9i aW4vaW5pdGRiL2luaXRkYi5jCkBAIC0yMjEsNyArMjIxLDggQEAgc3RhdGljIGNvbnN0IGNoYXIg KmNvbnN0IHN1YmRpcnNbXSA9IHsKIAkicGdfeGFjdCIsCiAJInBnX2xvZ2ljYWwiLAogCSJwZ19s b2dpY2FsL3NuYXBzaG90cyIsCi0JInBnX2xvZ2ljYWwvbWFwcGluZ3MiCisJInBnX2xvZ2ljYWwv bWFwcGluZ3MiLAorCSJwZ19tZW11c2FnZSIKIH07CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9w Z19iYXNlYmFja3VwL3QvMDEwX3BnX2Jhc2ViYWNrdXAucGwgYi9zcmMvYmluL3BnX2Jhc2ViYWNr dXAvdC8wMTBfcGdfYmFzZWJhY2t1cC5wbAppbmRleCBmNjc0YTdjOTRlLi4zNDBhODBmYzExIDEw MDY0NAotLS0gYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wMTBfcGdfYmFzZWJhY2t1cC5wbAor KysgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wMTBfcGdfYmFzZWJhY2t1cC5wbApAQCAtNiw3 ICs2LDcgQEAgdXNlIEZpbGU6OkJhc2VuYW1lIHF3KGJhc2VuYW1lIGRpcm5hbWUpOwogdXNlIEZp bGU6OlBhdGggcXcocm10cmVlKTsKIHVzZSBQb3N0Z3Jlc05vZGU7CiB1c2UgVGVzdExpYjsKLXVz ZSBUZXN0OjpNb3JlIHRlc3RzID0+IDEwOTsKK3VzZSBUZXN0OjpNb3JlIHRlc3RzID0+IDExMDsK IAogcHJvZ3JhbV9oZWxwX29rKCdwZ19iYXNlYmFja3VwJyk7CiBwcm9ncmFtX3ZlcnNpb25fb2so J3BnX2Jhc2ViYWNrdXAnKTsKQEAgLTEyNCw3ICsxMjQsNyBAQCBpc19kZWVwbHkoCiAKICMgQ29u dGVudHMgb2YgdGhlc2UgZGlyZWN0b3JpZXMgc2hvdWxkIG5vdCBiZSBjb3BpZWQuCiBmb3JlYWNo IG15ICRkaXJuYW1lICgKLQlxdyhwZ19keW5zaG1lbSBwZ19ub3RpZnkgcGdfcmVwbHNsb3QgcGdf c2VyaWFsIHBnX3NuYXBzaG90cyBwZ19zdGF0X3RtcCBwZ19zdWJ0cmFucykKKwlxdyhwZ19keW5z aG1lbSBwZ19ub3RpZnkgcGdfcmVwbHNsb3QgcGdfc2VyaWFsIHBnX3NuYXBzaG90cyBwZ19zdGF0 X3RtcCBwZ19zdWJ0cmFucyBwZ19tZW11c2FnZSkKICAgKQogewogCWlzX2RlZXBseSgKZGlmZiAt LWdpdCBhL3NyYy9iaW4vcGdfcmV3aW5kL2ZpbGVtYXAuYyBiL3NyYy9iaW4vcGdfcmV3aW5kL2Zp bGVtYXAuYwppbmRleCAxYWJjMjU3MTc3Li5mZjMzMzhlOWJlIDEwMDY0NAotLS0gYS9zcmMvYmlu L3BnX3Jld2luZC9maWxlbWFwLmMKKysrIGIvc3JjL2Jpbi9wZ19yZXdpbmQvZmlsZW1hcC5jCkBA IC04NSw2ICs4NSw5IEBAIHN0YXRpYyBjb25zdCBjaGFyICpleGNsdWRlRGlyQ29udGVudHNbXSA9 CiAJLyogQ29udGVudHMgemVyb2VkIG9uIHN0YXJ0dXAsIHNlZSBTdGFydHVwU1VCVFJBTlMoKS4g Ki8KIAkicGdfc3VidHJhbnMiLAogCisJLyogU2tpcCBtZW1vcnkgY29udGV4dCBkdW1wZWQgZmls ZXMuICovCisJInBnX21lbXVzYWdlIiwKKwogCS8qIGVuZCBvZiBsaXN0ICovCiAJTlVMTAogfTsK ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVk ZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4IGJiY2FjNjlkNDguLjkzZmQ1NDIwNTUgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtNzgzNSwxMSArNzgzNSwxMSBAQAogCiAjIG1lbW9yeSBj b250ZXh0IG9mIGxvY2FsIGJhY2tlbmQKIHsgb2lkID0+ICcyMjgyJywgZGVzY3IgPT4gJ2luZm9y bWF0aW9uIGFib3V0IGFsbCBtZW1vcnkgY29udGV4dHMgb2YgbG9jYWwgYmFja2VuZCcsCi0gIHBy b25hbWUgPT4gJ3BnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cycsIHByb3Jvd3MgPT4gJzEw MCcsIHByb3JldHNldCA9PiAndCcsCi0gIHByb3ZvbGF0aWxlID0+ICd2JywgcHJvcGFyYWxsZWwg PT4gJ3InLCBwcm9yZXR0eXBlID0+ICdyZWNvcmQnLCBwcm9hcmd0eXBlcyA9PiAnJywKLSAgcHJv YWxsYXJndHlwZXMgPT4gJ3t0ZXh0LHRleHQsdGV4dCxpbnQ0LGludDgsaW50OCxpbnQ4LGludDgs aW50OH0nLAotICBwcm9hcmdtb2RlcyA9PiAne28sbyxvLG8sbyxvLG8sbyxvfScsCi0gIHByb2Fy Z25hbWVzID0+ICd7bmFtZSwgaWRlbnQsIHBhcmVudCwgbGV2ZWwsIHRvdGFsX2J5dGVzLCB0b3Rh bF9uYmxvY2tzLCBmcmVlX2J5dGVzLCBmcmVlX2NodW5rcywgdXNlZF9ieXRlc30nLAorICBwcm9u YW1lID0+ICdwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMnLCBwcm9yb3dzID0+ICcxMDAn LCBwcm9pc3N0cmljdCA9PiAnZicsCisgIHByb3JldHNldCA9PiAndCcsIHByb3ZvbGF0aWxlID0+ ICd2JywgcHJvcGFyYWxsZWwgPT4gJ3InLCBwcm9yZXR0eXBlID0+ICdyZWNvcmQnLAorICBwcm9h cmd0eXBlcyA9PiAnaW50NCcsIHByb2FsbGFyZ3R5cGVzID0+ICd7aW50NCx0ZXh0LHRleHQsdGV4 dCxpbnQ0LGludDgsaW50OCxpbnQ4LGludDgsaW50OH0nLAorICBwcm9hcmdtb2RlcyA9PiAne2ks byxvLG8sbyxvLG8sbyxvLG99JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3twaWQsIG5hbWUsIGlkZW50 LCBwYXJlbnQsIGxldmVsLCB0b3RhbF9ieXRlcywgdG90YWxfbmJsb2NrcywgZnJlZV9ieXRlcywg ZnJlZV9jaHVua3MsIHVzZWRfYnl0ZXN9JywKICAgcHJvc3JjID0+ICdwZ19nZXRfYmFja2VuZF9t ZW1vcnlfY29udGV4dHMnIH0sCiAKICMgbm9uLXBlcnNpc3RlbnQgc2VyaWVzIGdlbmVyYXRvcgpk aWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbWlzY2FkbWluLmggYi9zcmMvaW5jbHVkZS9taXNjYWRt aW4uaAppbmRleCA3MmUzMzUyMzk4Li44MTIwMzJiYjE1IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVk ZS9taXNjYWRtaW4uaAorKysgYi9zcmMvaW5jbHVkZS9taXNjYWRtaW4uaApAQCAtODMsNiArODMs NyBAQCBleHRlcm4gUEdETExJTVBPUlQgdm9sYXRpbGUgc2lnX2F0b21pY190IFF1ZXJ5Q2FuY2Vs UGVuZGluZzsKIGV4dGVybiBQR0RMTElNUE9SVCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgUHJvY0Rp ZVBlbmRpbmc7CiBleHRlcm4gUEdETExJTVBPUlQgdm9sYXRpbGUgc2lnX2F0b21pY190IElkbGVJ blRyYW5zYWN0aW9uU2Vzc2lvblRpbWVvdXRQZW5kaW5nOwogZXh0ZXJuIFBHRExMSU1QT1JUIHZv bGF0aWxlIHNpZ19hdG9taWNfdCBQcm9jU2lnbmFsQmFycmllclBlbmRpbmc7CitleHRlcm4gUEdE TExJTVBPUlQgdm9sYXRpbGUgc2lnX2F0b21pY190IFByb2NTaWduYWxEdW1wTWVtb3J5UGVuZGlu ZzsKIAogZXh0ZXJuIFBHRExMSU1QT1JUIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBDbGllbnRDb25u ZWN0aW9uTG9zdDsKIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jc2lnbmFs LmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NzaWduYWwuaAppbmRleCA1Y2IzOTY5N2YzLi41 ZGI5MmE5YTUyIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NzaWduYWwuaAor KysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NzaWduYWwuaApAQCAtMzQsNiArMzQsNyBAQCB0 eXBlZGVmIGVudW0KIAlQUk9DU0lHX1BBUkFMTEVMX01FU1NBR0UsCS8qIG1lc3NhZ2UgZnJvbSBj b29wZXJhdGluZyBwYXJhbGxlbCBiYWNrZW5kICovCiAJUFJPQ1NJR19XQUxTTkRfSU5JVF9TVE9Q UElORywJLyogYXNrIHdhbHNlbmRlcnMgdG8gcHJlcGFyZSBmb3Igc2h1dGRvd24gICovCiAJUFJP Q1NJR19CQVJSSUVSLAkJCS8qIGdsb2JhbCBiYXJyaWVyIGludGVycnVwdCAgKi8KKwlQUk9DU0lH X0RVTVBfTUVNT1JZLAkJLyogcmVxdWVzdCBkdW1waW5nIG1lbW9yeSBjb250ZXh0IGludGVycnVw dCAqLwogCiAJLyogUmVjb3ZlcnkgY29uZmxpY3QgcmVhc29ucyAqLwogCVBST0NTSUdfUkVDT1ZF UllfQ09ORkxJQ1RfREFUQUJBU0UsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9tY3h0 ZnVuY3MuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL21jeHRmdW5jcy5oCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAuLjg1YWNhZTljNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMv aW5jbHVkZS91dGlscy9tY3h0ZnVuY3MuaApAQCAtMCwwICsxLDUxIEBACisvKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAqCisgKiBtY3h0ZnVuY3MuaAorICoJICBEZWNsYXJhdGlvbnMgZm9yIHNob3dpbmcg YmFja2VuZCBtZW1vcnkgY29udGV4dC4KKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5 OTYtMjAyMCwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqIFBvcnRpb25z IENvcHlyaWdodCAoYykgMTk5NCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9y bmlhCisgKgorICoKKyAqIElERU5USUZJQ0FUSU9OCisgKgkgIHNyYy9iYWNrZW5kL3V0aWxzL21j eHRmdW5jcy5oCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgTUNYVF9ICisj ZGVmaW5lIE1DWFRfSAorCisvKiBEaXJlY3RvcnkgdG8gc3RvcmUgZHVtcGVkIG1lbW9yeSBmaWxl cyAqLworI2RlZmluZSBQR19NRU1VU0FHRV9ESVIJCSJwZ19tZW11c2FnZSIKKworI2RlZmluZSBQ R19NRU1DT05URVhUX0ZJTEVfRk9STUFUX0lECTB4MDFCNUJDOUUKKworLyoKKyAqIFNpemUgb2Yg dGhlIHNobWVtIGhhc2ggdGFibGUgc2l6ZShub3QgYSBoYXJkIGxpbWl0KS4KKyAqCisgKiBBbHRo b3VnaCBpdCBtYXkgYmUgYmV0dGVyIHRvIGluY3JlYXNlIHRoaXMgbnVtYmVyIGluIHRoZSBmdXR1 cmUgKGUuZy4sCisgKiBhZGRpbmcgdmlld3MgZm9yIGFsbCB0aGUgYmFja2VuZCBwcm9jZXNzIG9m IG1lbW9yeSBjb250ZXh0cyksIGN1cnJlbnRseQorICogc21hbGwgbnVtYmVyIHdvdWxkIGJlIGVu b3VnaC4KKyAqLworI2RlZmluZSBTSE1FTV9NRU1DT05URVhUX1NJWkUJCSA2NAorCit0eXBlZGVm IGVudW0gTWN4dER1bXBTdGF0dXMKK3sKKwlNQ1hURFVNUFNUQVRVU19OT1RZRVQsCisJTUNYVERV TVBTVEFUVVNfRE9ORSwKKwlNQ1hURFVNUFNUQVRVU19FUlJPUgorfSBNY3h0RHVtcFN0YXR1czsK KwordHlwZWRlZiBzdHJ1Y3QgbWN4dGR1bXBFbnRyeQoreworCXBpZF90CQlkc3RfcGlkOwkJLyog cGlkIG9mIHRoZSBzaWduYWwgcmVjZWl2ZXIgKi8KKwlwaWRfdAkJc3JjX3BpZDsJCS8qIHBpZCBv ZiB0aGUgc2lnbmFsIHNlbmRlciAqLworCU1jeHREdW1wU3RhdHVzCWR1bXBfc3RhdHVzOwkJLyog ZHVtcCBzdGF0dXMgKi8KK30gbWN4dGR1bXBFbnRyeTsKKworZXh0ZXJuIHZvaWQgUHJvY2Vzc0R1 bXBNZW1vcnlJbnRlcnJ1cHQodm9pZCk7CitleHRlcm4gdm9pZCBIYW5kbGVQcm9jU2lnbmFsRHVt cE1lbW9yeSh2b2lkKTsKK2V4dGVybiB2b2lkIE1jeHREdW1wU2htZW1Jbml0KHZvaWQpOworZXh0 ZXJuIHZvaWQgcGdfbWVtdXNhZ2VfcmVzZXQoaW50KTsKKworI2VuZGlmCQkJCQkJCS8qIE1DWFRf SCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9ydWxlcy5vdXQgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dAppbmRleCA0OTJjZGNmNzRjLi5kNjM3 YjliYmNlIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dApAQCAtMTMzMyw3ICsxMzMz LDcgQEAgcGdfYmFja2VuZF9tZW1vcnlfY29udGV4dHN8IFNFTEVDVCBwZ19nZXRfYmFja2VuZF9t ZW1vcnlfY29udGV4dHMubmFtZSwKICAgICBwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMu ZnJlZV9ieXRlcywKICAgICBwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMuZnJlZV9jaHVu a3MsCiAgICAgcGdfZ2V0X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzLnVzZWRfYnl0ZXMKLSAgIEZS T00gcGdfZ2V0X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzKCkgcGdfZ2V0X2JhY2tlbmRfbWVtb3J5 X2NvbnRleHRzKG5hbWUsIGlkZW50LCBwYXJlbnQsIGxldmVsLCB0b3RhbF9ieXRlcywgdG90YWxf bmJsb2NrcywgZnJlZV9ieXRlcywgZnJlZV9jaHVua3MsIHVzZWRfYnl0ZXMpOworICAgRlJPTSBw Z19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMoTlVMTDo6aW50ZWdlcikgcGdfZ2V0X2JhY2tl bmRfbWVtb3J5X2NvbnRleHRzKG5hbWUsIGlkZW50LCBwYXJlbnQsIGxldmVsLCB0b3RhbF9ieXRl cywgdG90YWxfbmJsb2NrcywgZnJlZV9ieXRlcywgZnJlZV9jaHVua3MsIHVzZWRfYnl0ZXMpOwog cGdfY29uZmlnfCBTRUxFQ1QgcGdfY29uZmlnLm5hbWUsCiAgICAgcGdfY29uZmlnLnNldHRpbmcK ICAgIEZST00gcGdfY29uZmlnKCkgcGdfY29uZmlnKG5hbWUsIHNldHRpbmcpOwotLSAKMi4xOC4x Cgo= --=_c6be2045a8b2a31852217b01f916332c--