Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1weXbV-004rKO-2n for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Jun 2026 12:30:18 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1weXbU-0086rb-2E for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Jun 2026 12:30:16 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1weXbU-0086rT-07 for pgsql-hackers@lists.postgresql.org; Tue, 30 Jun 2026 12:30:16 +0000 Received: from mail-dy1-x1331.google.com ([2607:f8b0:4864:20::1331]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1weXbR-00000000umL-3JGe for pgsql-hackers@postgresql.org; Tue, 30 Jun 2026 12:30:14 +0000 Received: by mail-dy1-x1331.google.com with SMTP id 5a478bee46e88-30c09f29b64so258983eec.0 for ; Tue, 30 Jun 2026 05:30:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782822613; cv=none; d=google.com; s=arc-20260327; b=oIzBlHldRuCzsfBsvNGGo1vd/7tNIe8TvH6KbH2nwgqzoMxh3B0iIxPYm7lZtSrs9X 9KndxEZhPTcmPyxF/o9nnM6ptHLnVHr5oOBQv+JZ4eu/7B1/qojgRTX2NC8fIngYWUAB su8L93LOMx4mXILQW4sBJ0XOxVuTq0DJa80JmHPEd7UPCkcs/k1aMASLvSvT4rp5gNXI 42Eax+/nWUrX7otlOInmo2uVdh3ca+CuGElhFcHbyjTRlQVicDev9pCjpxM9jic/1hcX ey0kmYUZEg969HPtJlNPblvPZUG7av5EkvR0pgWHWQxJukZT35GopuodEpPXfY/9tpS7 CBEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=/RkbVrj+HZLDMsHgDWg1LvzyJbvO2Rn6dBBisr+2wjo=; fh=FUqK/u5y9C+sTgjUu1i57PqX8s4d2dBlI+gXd2Gnohk=; b=fKjp1nG4daFu4sTDc00AVljGlTC9F9Gr1SPylv+TUTQtxApu/8OEOyiv2FK546eVxq 8AhW/DNVLejJ6OJINi27Dd9QTgTu7RHZuJdNc0L/Jmrdt8VvSwYyL6i096nWrd6//vod uTdJ6j+EMo3PJS8Lj0g6oKD+ts9iJIQXHVWKS5Hv4WWPbMfbcZtrz6O0yNNpWnuLotSr uaMm/lhH5071nmKuQMrjvacEh0QwlQy2/Ko3p3BYvlRM+zAuWNS9rgn2U8daDkCGqfEQ 3Uocbfmylq8FLJKT/VKh9HMvxrvTtS4ppOKdmb0n94fCOWMnUIS620NY1tqmwFyJ4uDr zRwA==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782822613; x=1783427413; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=/RkbVrj+HZLDMsHgDWg1LvzyJbvO2Rn6dBBisr+2wjo=; b=A6/dMJ8x8GPUiL7fUW14xrTMy2+yrq+nSQHe54dEc/kMBBmYsKKolVh0g/pQlThbEm RQGE2Pv57piL/Zm19FYuZKb6qXygU05GkkLturmmKZVAcABnebqBWYy6ACC4q6LBhFVq eJh6BFRt+8QKTsOnyp7lae/ZTTy/NsMdZgrnzUVZHmx5n2oS+D5kGvWu9tGT1QvRdBEX VsllAepw3PgrtGkpjP1uQCUXahJL/BcH2F3v4It/o11M+stwXkzd5DAskF6SLMbmLjb5 HKMEoVAJEPyeMBMjpUb/VTfafBehA1eE1ZR3D/X8V+fz2j/DAEmNUFha+y5s96KZUDwX HPFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782822613; x=1783427413; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=/RkbVrj+HZLDMsHgDWg1LvzyJbvO2Rn6dBBisr+2wjo=; b=YZTXD8bnhk+zoHmchxgi5QvcK9auSaLn83dAQ2vyO0AVx7D4rsI9VZQS+EjnlfhqZs gdsC6TzSSqYpmh4ZvAHJvghlZ12uWlO3m0KGaF38wGk0HwoWNZnJZwpcXWwevprRm82j 5NTPNzXoRXtpshxo5M4Prm8pHCDoa27pQXqeoV/POgu7b7boSb9nQH4ij9jjN04fPXKA gqFDLGq8d4MW5BvXfjXJ+klaab2PvuF6riQiCi+buFxyqH1qAJPh+tyayitKfsRYVXDu VpNJVJoCVK7aLRa/ddRQLy8WfottFRKEe4kSZyt1YhPBZqJQblzlinZjkFcreXXscw7x BrFQ== X-Forwarded-Encrypted: i=1; AHgh+RpRIsMIxEpdi9ykmhV+DFJZ9r/pUcCnsMJoz6fApY1Olby9nsByS5izluWbiG/9TnXLKcC4dKdKWveXcWr4@postgresql.org X-Gm-Message-State: AOJu0Ywum/OWQq8zLaIR+x7H7Q3GoVYssQtNUXRWQfiQFNaKYM5kjApp AXPvAbjIUXf/4vYxJbFp/5ErEX5RhRdu+yoenMCh3laRl0HZPI/68b30fPJYVKUVg6+iuzu0S3b NUK0rD9Rb3exUfZNh+/QWBh6+6SNcj2jUdhcud9M= X-Gm-Gg: AfdE7cmI6oEL+D9dVGsweIQReu93eONX7HVmcMX73wS0h4xWjQpCyBaMjDDCrPBGk2a wV31THKIRRGsQDeFMHwnUaDzVrd+QmYeO8vdDYnvGtVklfeuCQK9rS0opuaBqTV0oL16EqzAWhU jyp+jUEMUxBWSvbclFLtWGg9wImjCauRfdS9Q6Y+UCu9JeTGdTdVZiVYwLwd9aPn43hnfhhOmn/ IlKNBwTLZO/WX+hrMAWdSWaoxOKBYMAOe/9j+nerpXO0P0yv9Ss3Jt6xD4WBz89oQ22yL+0yIev K1uOfsYYbAwLUscmCBktwc8V7AkIUw6Rf//JaKKoNLKrTXng0whVLCz3yavMGT3STAaF+Ul5+gb Glq6KHMBZBg7gNNyPehCHNmy0Z9Gwqw== X-Received: by 2002:a05:7300:8ca4:b0:30c:ab96:7306 with SMTP id 5a478bee46e88-30eea0e9753mr1321090eec.22.1782822612560; Tue, 30 Jun 2026 05:30:12 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Etsuro Fujita Date: Tue, 30 Jun 2026 21:29:58 +0900 X-Gm-Features: AVVi8CdSCMwh2duyFeDaWFfmGVuHJ-id7Q1FU298s5w9D2JN96u6vnYXGpJ3TA8 Message-ID: Subject: Re: use of SPI by postgresImportForeignStatistics To: Corey Huinker Cc: Robert Haas , "pgsql-hackers@postgresql.org" Content-Type: multipart/mixed; boundary="000000000000863525065577bc37" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000863525065577bc37 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Jun 30, 2026 at 10:10=E2=80=AFAM Corey Huinker wrote: > On Mon, Jun 29, 2026 at 2:17=E2=80=AFPM Robert Haas wrote: >> On Mon, Jun 29, 2026 at 7:50=E2=80=AFAM Etsuro Fujita wrote: >> > I like this refactoring, but while it's rather mechanical, it's pretty >> > large, so I think it's too late to do the refactoring at this time >> > just before the beta 2 release. So I'd vote for going with your >> > v1-0001 and v1-0002 and doing the refactoring in v20. As mentioned by >> > Robert, I don't think it's good to call LOCAL_FCINFO() in >> > import_relation_statistics() and import_attribute_statistics() to call >> > the guts of those functions either, but that is *consistent* with the >> > existing way pg_restore_relation_stats() and >> > pg_restore_attribute_stats() do that, so that is actually not that >> > bad. Also, as you mentioned above, it's inefficient for the new API >> > functions to lock an already-locked relation, and validate an >> > already-validated attname/attnum, but I think it would be negligible. >> >> Fujita-san, is it then your plan to get those two patches committed? Yes, it is. > Are we ok with changing the functions that postgres_fdw makes from v19 to= v20? Because what I put in the v2 patch does not match the v1 patch. If we= are NOT ok with that, then we'd need to: > > 1. rename the two relation_stats_argnum -> relation_args_argnum and attri= bute_stats_argnum -> attribute_args_argnum out of the way of the ones creat= ed in relation_stats.h and attribute_stats.h. The actual enumeration values= can stay the same, as there are no conflicts there, just ambiguity about w= hich set of values they belong to. > 2. rename the existing static functions relation_statistics_update -> upd= ate_relstats and attribute_statistics_update -> update_relstats to make way= for the public functions of the same names. > 3. Create new relation_statistics_update and attribute_statistics_update,= with the isnull/values, and have those fcinfo-invoke the respective pg_res= tore functions just like v1 does. > > That would at least make the user API consistent in v19 vs v20. > > I'm on vacation this week, but time is short for beta2, so I'll make an e= xception to get the above into beta2. Let me know if you want me to write t= hat up. Thanks! Here is an updated patch, which merges your v1-0001 and v1-0002. One notable change I made to your version is the signatures of import_relation_statistics() and import_attribute_statistics(). As mentioned upthread, the proposed signatures of these functions would be too tailored for postgres_fdw, and might not be useful for other FDWs, so I changed them to have NullableDatum arguments for stats-data inputs like this: bool import_relation_statistics(Relation rel, NullableDatum *relpages, NullableDatum *reltuples, NullableDatum *relallvisible, NullableDatum *relallfrozen) bool import_attribute_statistics(Relation rel, AttrNumber attnum, bool inherited= , NullableDatum *null_frac, NullableDatum *avg_width, NullableDatum *n_distinct, NullableDatum *most_common_vals, NullableDatum *most_common_freqs, NullableDatum *histogram_bounds, NullableDatum *correlation, NullableDatum *most_common_elems, NullableDatum *most_common_elem_freqs, NullableDatum *elem_count_histogram, NullableDatum *range_length_histogram, NullableDatum *range_empty_frac, NullableDatum *range_bounds_histogram) As postgresImportForeignStatistics() is provided for FDWs that want to calculate statistics remotely, so I'm assuming that they have enough knowledge about the stats-data structures. I think we could instead use the values/isnull arrays as proposed in your v2, but the problem about doing so is error messages in functions in stat_utils.c like this: ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("argument \"%s\" must not be a multidimensional arr= ay", arginfo[argnum].argname))); Note that the message uses the word "argument", so I think it's better for the new functions as well to have individual arguments for stats-data inputs. Also, I removed the attname argument from import_attribute_statistics(), to 1) make the signature (and the internal processing) simple and 2) match it to delete_attribute_statistics(). In relation to this change, I moved helper functions set_XXX_arg() that you added to relation_stats.c and attribute_stats.c to postgres_fdw.c. The helper functions had soft error handling, but in the postgres_fdw use, there is no need for that, so I removed that handling as well. What do you think? If there is no problem with this change, we wouldn't need to worry about the stability of postgres_fdw (and other FDWs) in v20. Best regards, Etsuro Fujita --000000000000863525065577bc37 Content-Type: application/octet-stream; name="Remove-SPI-from-stat-import-in-postgres-fdw-efujita.patch" Content-Disposition: attachment; filename="Remove-SPI-from-stat-import-in-postgres-fdw-efujita.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mr0mjalk0 ZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5v dXQgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CmluZGV4 IGU5MDI4OWU0YWIxLi41MWQwOWIyNzI2NyAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dAorKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9l eHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CkBAIC0xMjkyNyw2ICsxMjkyNyw0MyBAQCBBTkFMWVpF IGR0ZXN0X3RhYmxlOwogQU5BTFlaRSBWRVJCT1NFIGR0ZXN0X2Z0YWJsZTsgICAgICAgICAgICAg LS0gc2hvdWxkIHdvcmsKIElORk86ICBpbXBvcnRpbmcgc3RhdGlzdGljcyBmb3IgZm9yZWlnbiB0 YWJsZSAicHVibGljLmR0ZXN0X2Z0YWJsZSIKIElORk86ICBmaW5pc2hlZCBpbXBvcnRpbmcgc3Rh dGlzdGljcyBmb3IgZm9yZWlnbiB0YWJsZSAicHVibGljLmR0ZXN0X2Z0YWJsZSIKKy0tIGR0ZXN0 X2Z0YWJsZSdzIHN0YXRzIHNob3VsZCBub3cgZXhhY3RseSBtYXRjaCBkdGVzdF90YWJsZSdzCist LSBjb21wYXJlIHZhbHVlcywgc2hvdWxkIG1hdGNoCitTRUxFQ1QgcmVscGFnZXMsIHJlbHR1cGxl cyBGUk9NIHBnX2NsYXNzCitXSEVSRSBvaWQgPSAncHVibGljLmR0ZXN0X3RhYmxlJzo6cmVnY2xh c3MKK0VYQ0VQVAorU0VMRUNUIHJlbHBhZ2VzLCByZWx0dXBsZXMgRlJPTSBwZ19jbGFzcworV0hF UkUgb2lkID0gJ3B1YmxpYy5kdGVzdF9mdGFibGUnOjpyZWdjbGFzczsKKyByZWxwYWdlcyB8IHJl bHR1cGxlcyAKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KKygwIHJvd3MpCisKKy0tIGNvbXBhcmUg dGhlIHJvd2NvdW50cywgc2hvdWxkIGdldCAwIHJvd3MgYmFjaworU0VMRUNUIENPVU5UKCopIEZS T00gcGdfc3RhdHMKK1dIRVJFIHNjaGVtYW5hbWUgPSAncHVibGljJyBBTkQgdGFibGVuYW1lID0g J2R0ZXN0X3RhYmxlJworRVhDRVBUCitTRUxFQ1QgQ09VTlQoKikgRlJPTSBwZ19zdGF0cworV0hF UkUgc2NoZW1hbmFtZSA9ICdwdWJsaWMnIEFORCB0YWJsZW5hbWUgPSAnZHRlc3RfZnRhYmxlJzsK KyBjb3VudCAKKy0tLS0tLS0KKygwIHJvd3MpCisKKy0tIHRlc3Qgb25seSBhIGZldyBzdGF0cyBj b2x1bW5zIGNvbW1vbiB0byBpbnRlZ2VyIHR5cGVzCitTRUxFQ1QgYXR0bmFtZSwgaW5oZXJpdGVk LCBudWxsX2ZyYWMsIGF2Z193aWR0aCwgbl9kaXN0aW5jdCwKKyAgbW9zdF9jb21tb25fdmFsczo6 dGV4dCBhcyBtY3YsIG1vc3RfY29tbW9uX2ZyZXFzLAorICBoaXN0b2dyYW1fYm91bmRzOjp0ZXh0 IGFzIGhiLCBjb3JyZWxhdGlvbgorRlJPTSBwZ19zdGF0cworV0hFUkUgc2NoZW1hbmFtZSA9ICdw dWJsaWMnIEFORCB0YWJsZW5hbWUgPSAnZHRlc3RfdGFibGUnCitFWENFUFQKK1NFTEVDVCBhdHRu YW1lLCBpbmhlcml0ZWQsIG51bGxfZnJhYywgYXZnX3dpZHRoLCBuX2Rpc3RpbmN0LAorICBtb3N0 X2NvbW1vbl92YWxzOjp0ZXh0IGFzIG1jdiwgbW9zdF9jb21tb25fZnJlcXMsCisgIGhpc3RvZ3Jh bV9ib3VuZHM6OnRleHQgYXMgaGIsIGNvcnJlbGF0aW9uCitGUk9NIHBnX3N0YXRzCitXSEVSRSBz Y2hlbWFuYW1lID0gJ3B1YmxpYycgQU5EIHRhYmxlbmFtZSA9ICdkdGVzdF9mdGFibGUnOworIGF0 dG5hbWUgfCBpbmhlcml0ZWQgfCBudWxsX2ZyYWMgfCBhdmdfd2lkdGggfCBuX2Rpc3RpbmN0IHwg bWN2IHwgbW9zdF9jb21tb25fZnJlcXMgfCBoYiB8IGNvcnJlbGF0aW9uIAorLS0tLS0tLS0tKy0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tLQorKDAgcm93cykKKwogLS0gY2xlYW51 cAogRFJPUCBGT1JFSUdOIFRBQkxFIHNpbXBvcnRfZnRhYmxlOwogRFJPUCBGT1JFSUdOIFRBQkxF IHNpbXBvcnRfZnZpZXc7CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jl c19mZHcuYyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCmluZGV4IDZkYmFl NTgzZWNjLi5iMTcxZDI2YjUzMiAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9z dGdyZXNfZmR3LmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKQEAg LTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlICJjb21tYW5kcy92YWN1dW0uaCIKICNpbmNsdWRlICJl eGVjdXRvci9leGVjQXN5bmMuaCIKICNpbmNsdWRlICJleGVjdXRvci9pbnN0cnVtZW50LmgiCi0j aW5jbHVkZSAiZXhlY3V0b3Ivc3BpLmgiCiAjaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKICNp bmNsdWRlICJmdW5jYXBpLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCkBAIC00Niw2ICs0NSw3 IEBACiAjaW5jbHVkZSAic3RvcmFnZS9sYXRjaC5oIgogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5z LmgiCiAjaW5jbHVkZSAidXRpbHMvZmxvYXQuaCIKKyNpbmNsdWRlICJ1dGlscy9mbWdyb2lkcy5o IgogI2luY2x1ZGUgInV0aWxzL2d1Yy5oIgogI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgog I2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCkBAIC0zMzUsNyArMzM1LDYgQEAgdHlwZWRlZiBz dHJ1Y3QKIHsKIAlQR3Jlc3VsdCAgICpyZWw7CiAJUEdyZXN1bHQgICAqYXR0OwotCWludAkJCXNl cnZlcl92ZXJzaW9uX251bTsKIH0gUmVtb3RlU3RhdHNSZXN1bHRzOwogCiAvKiBDb2x1bW4gb3Jk ZXIgaW4gcmVsYXRpb24gc3RhdHMgcXVlcnkgKi8KQEAgLTM2NywxMzYgKzM2Niw2IEBAIGVudW0g QXR0U3RhdHNDb2x1bW5zCiAJQVRUU1RBVFNfTlVNX0ZJRUxEUywKIH07CiAKLS8qIFJlbGF0aW9u IHN0YXRzIGltcG9ydCBxdWVyeSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnJlbGltcG9ydF9zcWwg PQotIlNFTEVDVCBwZ19jYXRhbG9nLnBnX3Jlc3RvcmVfcmVsYXRpb25fc3RhdHMoXG4iCi0iXHQn dmVyc2lvbicsICQxLFxuIgotIlx0J3NjaGVtYW5hbWUnLCAkMixcbiIKLSJcdCdyZWxuYW1lJywg JDMsXG4iCi0iXHQncmVscGFnZXMnLCAkNDo6aW50ZWdlcixcbiIKLSJcdCdyZWx0dXBsZXMnLCAk NTo6cmVhbCkiOwotCi0vKiBBcmd1bWVudCBvcmRlciBpbiByZWxhdGlvbiBzdGF0cyBpbXBvcnQg cXVlcnkgKi8KLWVudW0gUmVsSW1wb3J0U3FsQXJncwotewotCVJFTElNUE9SVF9TUUxfVkVSU0lP TiA9IDAsCi0JUkVMSU1QT1JUX1NRTF9TQ0hFTUFOQU1FLAotCVJFTElNUE9SVF9TUUxfUkVMTkFN RSwKLQlSRUxJTVBPUlRfU1FMX1JFTFBBR0VTLAotCVJFTElNUE9SVF9TUUxfUkVMVFVQTEVTLAot CVJFTElNUE9SVF9TUUxfTlVNX0ZJRUxEUwotfTsKLQotLyogQXJndW1lbnQgdHlwZXMgaW4gcmVs YXRpb24gc3RhdHMgaW1wb3J0IHF1ZXJ5ICovCi1zdGF0aWMgY29uc3QgT2lkIHJlbGltcG9ydF9h cmd0eXBlc1tSRUxJTVBPUlRfU1FMX05VTV9GSUVMRFNdID0KLXsKLQlJTlQ0T0lELCBURVhUT0lE LCBURVhUT0lELCBURVhUT0lELAotCVRFWFRPSUQsCi19OwotCi0vKiBBdHRyaWJ1dGUgc3RhdHMg aW1wb3J0IHF1ZXJ5ICovCi1zdGF0aWMgY29uc3QgY2hhciAqYXR0aW1wb3J0X3NxbCA9Ci0iU0VM RUNUIHBnX2NhdGFsb2cucGdfcmVzdG9yZV9hdHRyaWJ1dGVfc3RhdHMoXG4iCi0iXHQndmVyc2lv bicsICQxLFxuIgotIlx0J3NjaGVtYW5hbWUnLCAkMixcbiIKLSJcdCdyZWxuYW1lJywgJDMsXG4i Ci0iXHQnYXR0bnVtJywgJDQsXG4iCi0iXHQnaW5oZXJpdGVkJywgZmFsc2U6OmJvb2xlYW4sXG4i Ci0iXHQnbnVsbF9mcmFjJywgJDU6OnJlYWwsXG4iCi0iXHQnYXZnX3dpZHRoJywgJDY6OmludGVn ZXIsXG4iCi0iXHQnbl9kaXN0aW5jdCcsICQ3OjpyZWFsLFxuIgotIlx0J21vc3RfY29tbW9uX3Zh bHMnLCAkOCxcbiIKLSJcdCdtb3N0X2NvbW1vbl9mcmVxcycsICQ5OjpyZWFsW10sXG4iCi0iXHQn aGlzdG9ncmFtX2JvdW5kcycsICQxMCxcbiIKLSJcdCdjb3JyZWxhdGlvbicsICQxMTo6cmVhbCxc biIKLSJcdCdtb3N0X2NvbW1vbl9lbGVtcycsICQxMixcbiIKLSJcdCdtb3N0X2NvbW1vbl9lbGVt X2ZyZXFzJywgJDEzOjpyZWFsW10sXG4iCi0iXHQnZWxlbV9jb3VudF9oaXN0b2dyYW0nLCAkMTQ6 OnJlYWxbXSxcbiIKLSJcdCdyYW5nZV9sZW5ndGhfaGlzdG9ncmFtJywgJDE1LFxuIgotIlx0J3Jh bmdlX2VtcHR5X2ZyYWMnLCAkMTY6OnJlYWwsXG4iCi0iXHQncmFuZ2VfYm91bmRzX2hpc3RvZ3Jh bScsICQxNykiOwotCi0vKiBBcmd1bWVudCBvcmRlciBpbiBhdHRyaWJ1dGUgc3RhdHMgaW1wb3J0 IHF1ZXJ5ICovCi1lbnVtIEF0dEltcG9ydFNxbEFyZ3MKLXsKLQlBVFRJTVBPUlRfU1FMX1ZFUlNJ T04gPSAwLAotCUFUVElNUE9SVF9TUUxfU0NIRU1BTkFNRSwKLQlBVFRJTVBPUlRfU1FMX1JFTE5B TUUsCi0JQVRUSU1QT1JUX1NRTF9BVFROVU0sCi0JQVRUSU1QT1JUX1NRTF9OVUxMX0ZSQUMsCi0J QVRUSU1QT1JUX1NRTF9BVkdfV0lEVEgsCi0JQVRUSU1QT1JUX1NRTF9OX0RJU1RJTkNULAotCUFU VElNUE9SVF9TUUxfTU9TVF9DT01NT05fVkFMUywKLQlBVFRJTVBPUlRfU1FMX01PU1RfQ09NTU9O X0ZSRVFTLAotCUFUVElNUE9SVF9TUUxfSElTVE9HUkFNX0JPVU5EUywKLQlBVFRJTVBPUlRfU1FM X0NPUlJFTEFUSU9OLAotCUFUVElNUE9SVF9TUUxfTU9TVF9DT01NT05fRUxFTVMsCi0JQVRUSU1Q T1JUX1NRTF9NT1NUX0NPTU1PTl9FTEVNX0ZSRVFTLAotCUFUVElNUE9SVF9TUUxfRUxFTV9DT1VO VF9ISVNUT0dSQU0sCi0JQVRUSU1QT1JUX1NRTF9SQU5HRV9MRU5HVEhfSElTVE9HUkFNLAotCUFU VElNUE9SVF9TUUxfUkFOR0VfRU1QVFlfRlJBQywKLQlBVFRJTVBPUlRfU1FMX1JBTkdFX0JPVU5E U19ISVNUT0dSQU0sCi0JQVRUSU1QT1JUX1NRTF9OVU1fRklFTERTCi19OwotCi0vKiBBcmd1bWVu dCB0eXBlcyBpbiBhdHRyaWJ1dGUgc3RhdHMgaW1wb3J0IHF1ZXJ5ICovCi1zdGF0aWMgY29uc3Qg T2lkIGF0dGltcG9ydF9hcmd0eXBlc1tBVFRJTVBPUlRfU1FMX05VTV9GSUVMRFNdID0KLXsKLQlJ TlQ0T0lELCBURVhUT0lELCBURVhUT0lELCBJTlQyT0lELAotCVRFWFRPSUQsIFRFWFRPSUQsIFRF WFRPSUQsIFRFWFRPSUQsCi0JVEVYVE9JRCwgVEVYVE9JRCwgVEVYVE9JRCwgVEVYVE9JRCwKLQlU RVhUT0lELCBURVhUT0lELCBURVhUT0lELCBURVhUT0lELAotCVRFWFRPSUQsCi19OwotCi0vKgot ICogVGhlIG1hcHBpbmcgb2YgYXR0cmlidXRlIHN0YXRzIHF1ZXJ5IGNvbHVtbnMgdG8gdGhlIHBv c2l0aW9uYWwgYXJndW1lbnRzIGluCi0gKiB0aGUgcHJlcGFyZWQgcGdfcmVzdG9yZV9hdHRyaWJ1 dGVfc3RhdHMoKSBzdGF0ZW1lbnQuCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0JZW51bSBBdHRT dGF0c0NvbHVtbnMgcmVzX2ZpZWxkOwotCWVudW0gQXR0SW1wb3J0U3FsQXJncyBhcmdfbnVtOwot fSBBdHRyUmVzdWx0QXJnTWFwOwotCi0jZGVmaW5lIE5VTV9NQVBQRURfQVRUSU1QT1JUX0FSR1Mg MTMKLQotc3RhdGljIGNvbnN0IEF0dHJSZXN1bHRBcmdNYXAgYXR0cl9yZXN1bHRfYXJnX21hcFtO VU1fTUFQUEVEX0FUVElNUE9SVF9BUkdTXSA9Ci17Ci0Je0FUVFNUQVRTX05VTExfRlJBQywgQVRU SU1QT1JUX1NRTF9OVUxMX0ZSQUN9LAotCXtBVFRTVEFUU19BVkdfV0lEVEgsIEFUVElNUE9SVF9T UUxfQVZHX1dJRFRIfSwKLQl7QVRUU1RBVFNfTl9ESVNUSU5DVCwgQVRUSU1QT1JUX1NRTF9OX0RJ U1RJTkNUfSwKLQl7QVRUU1RBVFNfTU9TVF9DT01NT05fVkFMUywgQVRUSU1QT1JUX1NRTF9NT1NU X0NPTU1PTl9WQUxTfSwKLQl7QVRUU1RBVFNfTU9TVF9DT01NT05fRlJFUVMsIEFUVElNUE9SVF9T UUxfTU9TVF9DT01NT05fRlJFUVN9LAotCXtBVFRTVEFUU19ISVNUT0dSQU1fQk9VTkRTLCBBVFRJ TVBPUlRfU1FMX0hJU1RPR1JBTV9CT1VORFN9LAotCXtBVFRTVEFUU19DT1JSRUxBVElPTiwgQVRU SU1QT1JUX1NRTF9DT1JSRUxBVElPTn0sCi0Je0FUVFNUQVRTX01PU1RfQ09NTU9OX0VMRU1TLCBB VFRJTVBPUlRfU1FMX01PU1RfQ09NTU9OX0VMRU1TfSwKLQl7QVRUU1RBVFNfTU9TVF9DT01NT05f RUxFTV9GUkVRUywgQVRUSU1QT1JUX1NRTF9NT1NUX0NPTU1PTl9FTEVNX0ZSRVFTfSwKLQl7QVRU U1RBVFNfRUxFTV9DT1VOVF9ISVNUT0dSQU0sIEFUVElNUE9SVF9TUUxfRUxFTV9DT1VOVF9ISVNU T0dSQU19LAotCXtBVFRTVEFUU19SQU5HRV9MRU5HVEhfSElTVE9HUkFNLCBBVFRJTVBPUlRfU1FM X1JBTkdFX0xFTkdUSF9ISVNUT0dSQU19LAotCXtBVFRTVEFUU19SQU5HRV9FTVBUWV9GUkFDLCBB VFRJTVBPUlRfU1FMX1JBTkdFX0VNUFRZX0ZSQUN9LAotCXtBVFRTVEFUU19SQU5HRV9CT1VORFNf SElTVE9HUkFNLCBBVFRJTVBPUlRfU1FMX1JBTkdFX0JPVU5EU19ISVNUT0dSQU19LAotfTsKLQot LyogQXR0cmlidXRlIHN0YXRzIGNsZWFyIHF1ZXJ5ICovCi1zdGF0aWMgY29uc3QgY2hhciAqYXR0 Y2xlYXJfc3FsID0KLSJTRUxFQ1QgcGdfY2F0YWxvZy5wZ19jbGVhcl9hdHRyaWJ1dGVfc3RhdHMo JDEsICQyLCAkMywgZmFsc2UpIjsKLQotLyogQXJndW1lbnQgb3JkZXIgaW4gYXR0cmlidXRlIHN0 YXRzIGNsZWFyIHF1ZXJ5ICovCi1lbnVtIEF0dENsZWFyU3FsQXJncwotewotCUFUVENMRUFSX1NR TF9TQ0hFTUFOQU1FID0gMCwKLQlBVFRDTEVBUl9TUUxfUkVMTkFNRSwKLQlBVFRDTEVBUl9TUUxf QVRUTkFNRSwKLQlBVFRDTEVBUl9TUUxfTlVNX0ZJRUxEUwotfTsKLQotLyogQXJndW1lbnQgdHlw ZXMgaW4gYXR0cmlidXRlIHN0YXRzIGNsZWFyIHF1ZXJ5ICovCi1zdGF0aWMgY29uc3QgT2lkIGF0 dGNsZWFyX2FyZ3R5cGVzW0FUVENMRUFSX1NRTF9OVU1fRklFTERTXSA9Ci17Ci0JVEVYVE9JRCwg VEVYVE9JRCwgVEVYVE9JRCwKLX07Ci0KIC8qCiAgKiBTUUwgZnVuY3Rpb25zCiAgKi8KQEAgLTcx NCwxNCArNTgzLDE4IEBAIHN0YXRpYyBib29sIG1hdGNoX2F0dHJtYXAoUEdyZXN1bHQgKnJlcywK IAkJCQkJCSAgY29uc3QgY2hhciAqcmVtb3RlX3JlbG5hbWUsCiAJCQkJCQkgIGludCBhdHRyY250 LAogCQkJCQkJICBSZW1vdGVBdHRyaWJ1dGVNYXBwaW5nICpyZW1hdHRybWFwKTsKLXN0YXRpYyBi b29sIGltcG9ydF9mZXRjaGVkX3N0YXRpc3RpY3MoY29uc3QgY2hhciAqc2NoZW1hbmFtZSwKK3N0 YXRpYyBib29sIGltcG9ydF9mZXRjaGVkX3N0YXRpc3RpY3MoUmVsYXRpb24gcmVsYXRpb24sCisJ CQkJCQkJCQkgIGNvbnN0IGNoYXIgKnNjaGVtYW5hbWUsCiAJCQkJCQkJCQkgIGNvbnN0IGNoYXIg KnJlbG5hbWUsCiAJCQkJCQkJCQkgIGludCBhdHRyY250LAogCQkJCQkJCQkJICBjb25zdCBSZW1v dGVBdHRyaWJ1dGVNYXBwaW5nICpyZW1hdHRybWFwLAogCQkJCQkJCQkJICBSZW1vdGVTdGF0c1Jl c3VsdHMgKnJlbXN0YXRzKTsKLXN0YXRpYyB2b2lkIG1hcF9maWVsZF90b19hcmcoUEdyZXN1bHQg KnJlcywgaW50IHJvdywgaW50IGZpZWxkLAotCQkJCQkJCSBpbnQgYXJnLCBEYXR1bSAqdmFsdWVz LCBjaGFyICpudWxscyk7Ci1zdGF0aWMgYm9vbCBpbXBvcnRfc3BpX3F1ZXJ5X29rKHZvaWQpOwor c3RhdGljIGNoYXIgKmdldF9vcHRfdmFsdWUoUEdyZXN1bHQgKnJlcywgaW50IHJvdywgaW50IGNv bCk7CitzdGF0aWMgdm9pZCBzZXRfdGV4dF9hcmcoTnVsbGFibGVEYXR1bSAqYXJnLCBjb25zdCBj aGFyICpzKTsKK3N0YXRpYyB2b2lkIHNldF9pbnQzMl9hcmcoTnVsbGFibGVEYXR1bSAqYXJnLCBj b25zdCBjaGFyICpzKTsKK3N0YXRpYyB2b2lkIHNldF91aW50MzJfYXJnKE51bGxhYmxlRGF0dW0g KmFyZywgY29uc3QgY2hhciAqcyk7CitzdGF0aWMgdm9pZCBzZXRfZmxvYXRfYXJnKE51bGxhYmxl RGF0dW0gKmFyZywgY29uc3QgY2hhciAqcyk7CitzdGF0aWMgdm9pZCBzZXRfZmxvYXRhcnJfYXJn KE51bGxhYmxlRGF0dW0gKmFyZywgY29uc3QgY2hhciAqcyk7CiBzdGF0aWMgdm9pZCBwcm9kdWNl X3R1cGxlX2FzeW5jaHJvbm91c2x5KEFzeW5jUmVxdWVzdCAqYXJlcSwgYm9vbCBmZXRjaCk7CiBz dGF0aWMgdm9pZCBmZXRjaF9tb3JlX2RhdGFfYmVnaW4oQXN5bmNSZXF1ZXN0ICphcmVxKTsKIHN0 YXRpYyB2b2lkIGNvbXBsZXRlX3BlbmRpbmdfcmVxdWVzdChBc3luY1JlcXVlc3QgKmFyZXEpOwpA QCAtNTY2MSw3ICs1NTM0LDcgQEAgcG9zdGdyZXNJbXBvcnRGb3JlaWduU3RhdGlzdGljcyhSZWxh dGlvbiByZWxhdGlvbiwgTGlzdCAqdmFfY29scywgaW50IGVsZXZlbCkKIAkJCQkJCQkJICZhdHRy Y250LCAmcmVtYXR0cm1hcCwgJnJlbXN0YXRzKTsKIAogCWlmIChvaykKLQkJb2sgPSBpbXBvcnRf ZmV0Y2hlZF9zdGF0aXN0aWNzKHNjaGVtYW5hbWUsIHJlbG5hbWUsCisJCW9rID0gaW1wb3J0X2Zl dGNoZWRfc3RhdGlzdGljcyhyZWxhdGlvbiwgc2NoZW1hbmFtZSwgcmVsbmFtZSwKIAkJCQkJCQkJ CSAgIGF0dHJjbnQsIHJlbWF0dHJtYXAsICZyZW1zdGF0cyk7CiAKIAlpZiAob2spCkBAIC01NzI1 LDcgKzU1OTgsNyBAQCBmZXRjaF9yZW1vdGVfc3RhdGlzdGljcyhSZWxhdGlvbiByZWxhdGlvbiwK IAkgKi8KIAl1c2VyID0gR2V0VXNlck1hcHBpbmcoR2V0VXNlcklkKCksIHRhYmxlLT5zZXJ2ZXJp ZCk7CiAJY29ubiA9IEdldENvbm5lY3Rpb24odXNlciwgZmFsc2UsIE5VTEwpOwotCXJlbXN0YXRz LT5zZXJ2ZXJfdmVyc2lvbl9udW0gPSBzZXJ2ZXJfdmVyc2lvbl9udW0gPSBQUXNlcnZlclZlcnNp b24oY29ubik7CisJc2VydmVyX3ZlcnNpb25fbnVtID0gUFFzZXJ2ZXJWZXJzaW9uKGNvbm4pOwog CiAJLyogRmV0Y2ggcmVsYXRpb24gc3RhdHMuICovCiAJcmVtc3RhdHMtPnJlbCA9IHJlbHN0YXRz ID0gZmV0Y2hfcmVsc3RhdHMoY29ubiwgcmVsYXRpb24pOwpAQCAtNjEyOCw1OCArNjAwMSwzMSBA QCBtYXRjaF9hdHRybWFwKFBHcmVzdWx0ICpyZXMsCiAgKiBJbXBvcnQgZmV0Y2hlZCBzdGF0aXN0 aWNzIGludG8gdGhlIGxvY2FsIHN0YXRpc3RpY3MgdGFibGVzLgogICovCiBzdGF0aWMgYm9vbAot aW1wb3J0X2ZldGNoZWRfc3RhdGlzdGljcyhjb25zdCBjaGFyICpzY2hlbWFuYW1lLAoraW1wb3J0 X2ZldGNoZWRfc3RhdGlzdGljcyhSZWxhdGlvbiByZWxhdGlvbiwKKwkJCQkJCSAgY29uc3QgY2hh ciAqc2NoZW1hbmFtZSwKIAkJCQkJCSAgY29uc3QgY2hhciAqcmVsbmFtZSwKIAkJCQkJCSAgaW50 IGF0dHJjbnQsCiAJCQkJCQkgIGNvbnN0IFJlbW90ZUF0dHJpYnV0ZU1hcHBpbmcgKnJlbWF0dHJt YXAsCiAJCQkJCQkgIFJlbW90ZVN0YXRzUmVzdWx0cyAqcmVtc3RhdHMpCiB7Ci0JU1BJUGxhblB0 cglhdHRpbXBvcnRfcGxhbiA9IE5VTEw7Ci0JU1BJUGxhblB0cglhdHRjbGVhcl9wbGFuID0gTlVM TDsKLQlEYXR1bQkJdmFsdWVzW0FUVElNUE9SVF9TUUxfTlVNX0ZJRUxEU107Ci0JY2hhcgkJbnVs bHNbQVRUSU1QT1JUX1NRTF9OVU1fRklFTERTXTsKLQlpbnQJCQlzcGlyYzsKLQlib29sCQlvayA9 IGZhbHNlOwotCi0JLyogQXNzaWduIGFsbCB0aGUgaW52YXJpYW50IHBhcmFtZXRlcnMgY29tbW9u IHRvIHJlbGF0aW9uL2F0dHJpYnV0ZSBzdGF0cyAqLwotCXZhbHVlc1tBVFRJTVBPUlRfU1FMX1ZF UlNJT05dID0gSW50MzJHZXREYXR1bShyZW1zdGF0cy0+c2VydmVyX3ZlcnNpb25fbnVtKTsKLQlu dWxsc1tBVFRJTVBPUlRfU1FMX1ZFUlNJT05dID0gJyAnOwotCi0JdmFsdWVzW0FUVElNUE9SVF9T UUxfU0NIRU1BTkFNRV0gPSBDU3RyaW5nR2V0VGV4dERhdHVtKHNjaGVtYW5hbWUpOwotCW51bGxz W0FUVElNUE9SVF9TUUxfU0NIRU1BTkFNRV0gPSAnICc7Ci0KLQl2YWx1ZXNbQVRUSU1QT1JUX1NR TF9SRUxOQU1FXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0ocmVsbmFtZSk7Ci0JbnVsbHNbQVRUSU1Q T1JUX1NRTF9SRUxOQU1FXSA9ICcgJzsKLQotCVNQSV9jb25uZWN0KCk7CisJUEdyZXN1bHQgICAq cmVzOworCU51bGxhYmxlRGF0dW0gYXJnc1tBVFRTVEFUU19OVU1fRklFTERTIC0gMV07CiAKIAkv KgogCSAqIFdlIGltcG9ydCBhdHRyaWJ1dGUgc3RhdGlzdGljcyBmaXJzdCwgaWYgYW55LCBiZWNh dXNlIHRob3NlIGFyZSBtb3JlCiAJICogcHJvbmUgdG8gZXJyb3JzLiAgVGhpcyBhdm9pZHMgbWFr aW5nIGEgbW9kaWZpY2F0aW9uIG9mIHBnX2NsYXNzIHRoYXQKIAkgKiB3aWxsIGp1c3QgZ2V0IHJv bGxlZCBiYWNrIGJ5IGEgZmFpbGVkIGF0dHJpYnV0ZSBpbXBvcnQuCiAJICovCi0JaWYgKHJlbXN0 YXRzLT5hdHQgIT0gTlVMTCkKKwlyZXMgPSByZW1zdGF0cy0+YXR0OworCWlmIChyZXMgIT0gTlVM TCkKIAl7Ci0JCUFzc2VydChQUW5maWVsZHMocmVtc3RhdHMtPmF0dCkgPT0gQVRUU1RBVFNfTlVN X0ZJRUxEUyk7Ci0JCUFzc2VydChQUW50dXBsZXMocmVtc3RhdHMtPmF0dCkgPj0gMSk7Ci0KLQkJ YXR0aW1wb3J0X3BsYW4gPSBTUElfcHJlcGFyZShhdHRpbXBvcnRfc3FsLCBBVFRJTVBPUlRfU1FM X05VTV9GSUVMRFMsCi0JCQkJCQkJCQkgKE9pZCAqKSBhdHRpbXBvcnRfYXJndHlwZXMpOwotCQlp ZiAoYXR0aW1wb3J0X3BsYW4gPT0gTlVMTCkKLQkJCWVsb2coRVJST1IsICJmYWlsZWQgdG8gcHJl cGFyZSBhdHRpbXBvcnRfc3FsIHF1ZXJ5Iik7Ci0KLQkJYXR0Y2xlYXJfcGxhbiA9IFNQSV9wcmVw YXJlKGF0dGNsZWFyX3NxbCwgQVRUQ0xFQVJfU1FMX05VTV9GSUVMRFMsCi0JCQkJCQkJCQkoT2lk ICopIGF0dGNsZWFyX2FyZ3R5cGVzKTsKLQkJaWYgKGF0dGNsZWFyX3BsYW4gPT0gTlVMTCkKLQkJ CWVsb2coRVJST1IsICJmYWlsZWQgdG8gcHJlcGFyZSBhdHRjbGVhcl9zcWwgcXVlcnkiKTsKLQot CQludWxsc1tBVFRJTVBPUlRfU1FMX0FUVE5VTV0gPSAnICc7CisJCUFzc2VydChQUW5maWVsZHMo cmVzKSA9PSBBVFRTVEFUU19OVU1fRklFTERTKTsKKwkJQXNzZXJ0KFBRbnR1cGxlcyhyZXMpID49 IDEpOwogCiAJCWZvciAoaW50IG1hcGlkeCA9IDA7IG1hcGlkeCA8IGF0dHJjbnQ7IG1hcGlkeCsr KQogCQl7CiAJCQlpbnQJCQlyb3cgPSByZW1hdHRybWFwW21hcGlkeF0ucmVzX2luZGV4OwotCQkJ RGF0dW0JICAgKnZhbHVlczIgPSB2YWx1ZXMgKyAxOwotCQkJY2hhcgkgICAqbnVsbHMyID0gbnVs bHMgKyAxOworCQkJQXR0ck51bWJlcglhdHRudW0gPSByZW1hdHRybWFwW21hcGlkeF0ubG9jYWxf YXR0bnVtOwogCiAJCQkvKiBBbGwgbWFwcGluZ3Mgc2hvdWxkIGhhdmUgYmVlbiBhc3NpZ25lZCBh IHJlc3VsdCBzZXQgcm93LiAqLwogCQkJQXNzZXJ0KHJvdyA+PSAwKTsKQEAgLTYxOTEsMTI4ICs2 MDM3LDE5MiBAQCBpbXBvcnRfZmV0Y2hlZF9zdGF0aXN0aWNzKGNvbnN0IGNoYXIgKnNjaGVtYW5h bWUsCiAKIAkJCS8qCiAJCQkgKiBGaXJzdCwgY2xlYXIgZXhpc3RpbmcgYXR0cmlidXRlIHN0YXRz LgotCQkJICoKLQkJCSAqIFdlIGNhbiByZS11c2UgdGhlIHZhbHVlcy9udWxscyBiZWNhdXNlIHRo ZSBudW1iZXIgb2YgcGFyYW1ldGVycwotCQkJICogaXMgbGVzcyBhbmQgdGhlIGZpcnN0IHR3byBw YXJhbXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBzZWNvbmQgYW5kCi0JCQkgKiB0aGlyZCBvbmVzIGlu IGF0dGltcG9ydF9zcWwuCiAJCQkgKi8KLQkJCXZhbHVlczJbQVRUQ0xFQVJfU1FMX0FUVE5BTUVd ID0KLQkJCQlDU3RyaW5nR2V0VGV4dERhdHVtKHJlbWF0dHJtYXBbbWFwaWR4XS5sb2NhbF9hdHRu YW1lKTsKLQotCQkJc3BpcmMgPSBTUElfZXhlY3V0ZV9wbGFuKGF0dGNsZWFyX3BsYW4sIHZhbHVl czIsIG51bGxzMiwgZmFsc2UsIDEpOwotCQkJaWYgKHNwaXJjICE9IFNQSV9PS19TRUxFQ1QpCi0J CQkJZWxvZyhFUlJPUiwgImZhaWxlZCB0byBleGVjdXRlIGF0dGNsZWFyX3NxbCBxdWVyeSBmb3Ig Y29sdW1uIFwiJXNcIiBvZiBmb3JlaWduIHRhYmxlIFwiJXMuJXNcIiIsCi0JCQkJCSByZW1hdHRy bWFwW21hcGlkeF0ubG9jYWxfYXR0bmFtZSwgc2NoZW1hbmFtZSwgcmVsbmFtZSk7Ci0KLQkJCXZh bHVlc1tBVFRJTVBPUlRfU1FMX0FUVE5VTV0gPQotCQkJCUludDE2R2V0RGF0dW0ocmVtYXR0cm1h cFttYXBpZHhdLmxvY2FsX2F0dG51bSk7Ci0KLQkJCS8qIExvb3AgdGhyb3VnaCBhbGwgbWFwcGFi bGUgY29sdW1ucyB0byBzZXQgcmVtYWluaW5nIGFyZ3VtZW50cyAqLwotCQkJZm9yIChpbnQgaSA9 IDA7IGkgPCBOVU1fTUFQUEVEX0FUVElNUE9SVF9BUkdTOyBpKyspCi0JCQkJbWFwX2ZpZWxkX3Rv X2FyZyhyZW1zdGF0cy0+YXR0LCByb3csCi0JCQkJCQkJCSBhdHRyX3Jlc3VsdF9hcmdfbWFwW2ld LnJlc19maWVsZCwKLQkJCQkJCQkJIGF0dHJfcmVzdWx0X2FyZ19tYXBbaV0uYXJnX251bSwKLQkJ CQkJCQkJIHZhbHVlcywgbnVsbHMpOwotCi0JCQlzcGlyYyA9IFNQSV9leGVjdXRlX3BsYW4oYXR0 aW1wb3J0X3BsYW4sIHZhbHVlcywgbnVsbHMsIGZhbHNlLCAxKTsKLQkJCWlmIChzcGlyYyAhPSBT UElfT0tfU0VMRUNUKQotCQkJCWVsb2coRVJST1IsICJmYWlsZWQgdG8gZXhlY3V0ZSBhdHRpbXBv cnRfc3FsIHF1ZXJ5IGZvciBjb2x1bW4gXCIlc1wiIG9mIGZvcmVpZ24gdGFibGUgXCIlcy4lc1wi IiwKLQkJCQkJIHJlbWF0dHJtYXBbbWFwaWR4XS5sb2NhbF9hdHRuYW1lLCBzY2hlbWFuYW1lLCBy ZWxuYW1lKTsKLQotCQkJaWYgKCFpbXBvcnRfc3BpX3F1ZXJ5X29rKCkpCisJCQlkZWxldGVfYXR0 cmlidXRlX3N0YXRpc3RpY3MocmVsYXRpb24sIGF0dG51bSwgZmFsc2UpOworCisJCQlzZXRfZmxv YXRfYXJnKCZhcmdzWzBdLAorCQkJCQkJICBnZXRfb3B0X3ZhbHVlKHJlcywgcm93LCBBVFRTVEFU U19OVUxMX0ZSQUMpKTsKKwkJCXNldF9pbnQzMl9hcmcoJmFyZ3NbMV0sCisJCQkJCQkgIGdldF9v cHRfdmFsdWUocmVzLCByb3csIEFUVFNUQVRTX0FWR19XSURUSCkpOworCQkJc2V0X2Zsb2F0X2Fy ZygmYXJnc1syXSwKKwkJCQkJCSAgZ2V0X29wdF92YWx1ZShyZXMsIHJvdywgQVRUU1RBVFNfTl9E SVNUSU5DVCkpOworCQkJc2V0X3RleHRfYXJnKCZhcmdzWzNdLAorCQkJCQkJIGdldF9vcHRfdmFs dWUocmVzLCByb3csIEFUVFNUQVRTX01PU1RfQ09NTU9OX1ZBTFMpKTsKKwkJCXNldF9mbG9hdGFy cl9hcmcoJmFyZ3NbNF0sCisJCQkJCQkJIGdldF9vcHRfdmFsdWUocmVzLCByb3csIEFUVFNUQVRT X01PU1RfQ09NTU9OX0ZSRVFTKSk7CisJCQlzZXRfdGV4dF9hcmcoJmFyZ3NbNV0sCisJCQkJCQkg Z2V0X29wdF92YWx1ZShyZXMsIHJvdywgQVRUU1RBVFNfSElTVE9HUkFNX0JPVU5EUykpOworCQkJ c2V0X2Zsb2F0X2FyZygmYXJnc1s2XSwKKwkJCQkJCSAgZ2V0X29wdF92YWx1ZShyZXMsIHJvdywg QVRUU1RBVFNfQ09SUkVMQVRJT04pKTsKKwkJCXNldF90ZXh0X2FyZygmYXJnc1s3XSwKKwkJCQkJ CSBnZXRfb3B0X3ZhbHVlKHJlcywgcm93LCBBVFRTVEFUU19NT1NUX0NPTU1PTl9FTEVNUykpOwor CQkJc2V0X2Zsb2F0YXJyX2FyZygmYXJnc1s4XSwKKwkJCQkJCQkgZ2V0X29wdF92YWx1ZShyZXMs IHJvdywgQVRUU1RBVFNfTU9TVF9DT01NT05fRUxFTV9GUkVRUykpOworCQkJc2V0X2Zsb2F0YXJy X2FyZygmYXJnc1s5XSwKKwkJCQkJCQkgZ2V0X29wdF92YWx1ZShyZXMsIHJvdywgQVRUU1RBVFNf RUxFTV9DT1VOVF9ISVNUT0dSQU0pKTsKKwkJCXNldF90ZXh0X2FyZygmYXJnc1sxMF0sCisJCQkJ CQkgZ2V0X29wdF92YWx1ZShyZXMsIHJvdywgQVRUU1RBVFNfUkFOR0VfTEVOR1RIX0hJU1RPR1JB TSkpOworCQkJc2V0X2Zsb2F0X2FyZygmYXJnc1sxMV0sCisJCQkJCQkgIGdldF9vcHRfdmFsdWUo cmVzLCByb3csIEFUVFNUQVRTX1JBTkdFX0VNUFRZX0ZSQUMpKTsKKwkJCXNldF90ZXh0X2FyZygm YXJnc1sxMl0sCisJCQkJCQkgZ2V0X29wdF92YWx1ZShyZXMsIHJvdywgQVRUU1RBVFNfUkFOR0Vf Qk9VTkRTX0hJU1RPR1JBTSkpOworCisJCQlpZiAoIWltcG9ydF9hdHRyaWJ1dGVfc3RhdGlzdGlj cyhyZWxhdGlvbiwgYXR0bnVtLCBmYWxzZSwKKwkJCQkJCQkJCQkJICZhcmdzWzBdLCAmYXJnc1sx XSwgJmFyZ3NbMl0sCisJCQkJCQkJCQkJCSAmYXJnc1szXSwgJmFyZ3NbNF0sICZhcmdzWzVdLAor CQkJCQkJCQkJCQkgJmFyZ3NbNl0sICZhcmdzWzddLCAmYXJnc1s4XSwKKwkJCQkJCQkJCQkJICZh cmdzWzldLCAmYXJnc1sxMF0sICZhcmdzWzExXSwKKwkJCQkJCQkJCQkJICZhcmdzWzEyXSkpCiAJ CQl7CiAJCQkJZXJlcG9ydChXQVJOSU5HLAogCQkJCQkJZXJybXNnKCJjb3VsZCBub3QgaW1wb3J0 IHN0YXRpc3RpY3MgZm9yIGZvcmVpZ24gdGFibGUgXCIlcy4lc1wiIC0tLSBhdHRyaWJ1dGUgc3Rh dGlzdGljcyBpbXBvcnQgZmFpbGVkIGZvciBjb2x1bW4gXCIlc1wiIG9mIHRoaXMgZm9yZWlnbiB0 YWJsZSIsCiAJCQkJCQkJICAgc2NoZW1hbmFtZSwgcmVsbmFtZSwKIAkJCQkJCQkgICByZW1hdHRy bWFwW21hcGlkeF0ubG9jYWxfYXR0bmFtZSkpOwotCQkJCWdvdG8gaW1wb3J0X2NsZWFudXA7CisJ CQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQl9CiAJfQogCiAJLyoKLQkgKiBJbXBvcnQgcmVsYXRp b24gc3RhdHMuICBXZSBvbmx5IHBlcmZvcm0gdGhpcyBvbmNlLCBzbyB0aGVyZSBpcyBubyBwb2lu dAotCSAqIGluIHByZXBhcmluZyB0aGUgc3RhdGVtZW50LgotCSAqCi0JICogV2UgY2FuIHJlLXVz ZSB0aGUgdmFsdWVzL251bGxzIGJlY2F1c2UgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIGxl c3MKLQkgKiBhbmQgdGhlIGZpcnN0IHRocmVlIHBhcmFtcyBhcmUgdGhlIHNhbWUgYXMgYXR0aW1w b3J0X3NxbC4KLQkgKi8KLQlBc3NlcnQocmVtc3RhdHMtPnJlbCAhPSBOVUxMKTsKLQlBc3NlcnQo UFFuZmllbGRzKHJlbXN0YXRzLT5yZWwpID09IFJFTFNUQVRTX05VTV9GSUVMRFMpOwotCUFzc2Vy dChQUW50dXBsZXMocmVtc3RhdHMtPnJlbCkgPT0gMSk7Ci0JbWFwX2ZpZWxkX3RvX2FyZyhyZW1z dGF0cy0+cmVsLCAwLCBSRUxTVEFUU19SRUxQQUdFUywKLQkJCQkJIFJFTElNUE9SVF9TUUxfUkVM UEFHRVMsIHZhbHVlcywgbnVsbHMpOwotCW1hcF9maWVsZF90b19hcmcocmVtc3RhdHMtPnJlbCwg MCwgUkVMU1RBVFNfUkVMVFVQTEVTLAotCQkJCQkgUkVMSU1QT1JUX1NRTF9SRUxUVVBMRVMsIHZh bHVlcywgbnVsbHMpOwotCi0Jc3BpcmMgPSBTUElfZXhlY3V0ZV93aXRoX2FyZ3MocmVsaW1wb3J0 X3NxbCwKLQkJCQkJCQkJICBSRUxJTVBPUlRfU1FMX05VTV9GSUVMRFMsCi0JCQkJCQkJCSAgKE9p ZCAqKSByZWxpbXBvcnRfYXJndHlwZXMsCi0JCQkJCQkJCSAgdmFsdWVzLCBudWxscywgZmFsc2Us IDEpOwotCWlmIChzcGlyYyAhPSBTUElfT0tfU0VMRUNUKQotCQllbG9nKEVSUk9SLCAiZmFpbGVk IHRvIGV4ZWN1dGUgcmVsaW1wb3J0X3NxbCBxdWVyeSBmb3IgZm9yZWlnbiB0YWJsZSBcIiVzLiVz XCIiLAotCQkJIHNjaGVtYW5hbWUsIHJlbG5hbWUpOwotCi0JaWYgKCFpbXBvcnRfc3BpX3F1ZXJ5 X29rKCkpCisJICogSW1wb3J0IHJlbGF0aW9uIHN0YXRzLgorCSAqLworCXJlcyA9IHJlbXN0YXRz LT5yZWw7CisJQXNzZXJ0KHJlcyAhPSBOVUxMKTsKKwlBc3NlcnQoUFFuZmllbGRzKHJlcykgPT0g UkVMU1RBVFNfTlVNX0ZJRUxEUyk7CisJQXNzZXJ0KFBRbnR1cGxlcyhyZXMpID09IDEpOworCisJ c2V0X3VpbnQzMl9hcmcoJmFyZ3NbMF0sIGdldF9vcHRfdmFsdWUocmVzLCAwLCBSRUxTVEFUU19S RUxQQUdFUykpOworCUFzc2VydCghYXJnc1swXS5pc251bGwpOworCXNldF9mbG9hdF9hcmcoJmFy Z3NbMV0sIGdldF9vcHRfdmFsdWUocmVzLCAwLCBSRUxTVEFUU19SRUxUVVBMRVMpKTsKKwlBc3Nl cnQoIWFyZ3NbMV0uaXNudWxsKTsKKwlhcmdzWzJdLnZhbHVlID0gKERhdHVtKSAwOworCWFyZ3Nb Ml0uaXNudWxsID0gdHJ1ZTsKKwlhcmdzWzNdLnZhbHVlID0gKERhdHVtKSAwOworCWFyZ3NbM10u aXNudWxsID0gdHJ1ZTsKKworCWlmICghaW1wb3J0X3JlbGF0aW9uX3N0YXRpc3RpY3MocmVsYXRp b24sCisJCQkJCQkJCQkmYXJnc1swXSwgJmFyZ3NbMV0sICZhcmdzWzJdLCAmYXJnc1szXSkpCiAJ ewogCQllcmVwb3J0KFdBUk5JTkcsCiAJCQkJZXJybXNnKCJjb3VsZCBub3QgaW1wb3J0IHN0YXRp c3RpY3MgZm9yIGZvcmVpZ24gdGFibGUgXCIlcy4lc1wiIC0tLSByZWxhdGlvbiBzdGF0aXN0aWNz IGltcG9ydCBmYWlsZWQgZm9yIHRoaXMgZm9yZWlnbiB0YWJsZSIsCiAJCQkJCSAgIHNjaGVtYW5h bWUsIHJlbG5hbWUpKTsKLQkJZ290byBpbXBvcnRfY2xlYW51cDsKKwkJcmV0dXJuIGZhbHNlOwog CX0KIAotCW9rID0gdHJ1ZTsKKwlyZXR1cm4gdHJ1ZTsKK30KIAotaW1wb3J0X2NsZWFudXA6Ci0J aWYgKGF0dGltcG9ydF9wbGFuKQotCQlTUElfZnJlZXBsYW4oYXR0aW1wb3J0X3BsYW4pOwotCWlm IChhdHRjbGVhcl9wbGFuKQotCQlTUElfZnJlZXBsYW4oYXR0Y2xlYXJfcGxhbik7Ci0JU1BJX2Zp bmlzaCgpOwotCXJldHVybiBvazsKKy8qCisgKiBDb25lbmllbmNlIHJvdXRpbmUgdG8gZmV0Y2gK KyAqLworc3RhdGljIGNoYXIgKgorZ2V0X29wdF92YWx1ZShQR3Jlc3VsdCAqcmVzLCBpbnQgcm93 LCBpbnQgY29sKQoreworCWlmIChQUWdldGlzbnVsbChyZXMsIHJvdywgY29sKSkKKwkJcmV0dXJu IE5VTEw7CisJcmV0dXJuIFBRZ2V0dmFsdWUocmVzLCByb3csIGNvbCk7CiB9CiAKIC8qCi0gKiBN b3ZlIGEgc3RyaW5nIHZhbHVlIGZyb20gYSByZXN1bHQgc2V0IHRvIGEgVGV4dCB2YWx1ZSBvZiBh IERhdHVtIGFycmF5LgorICogQ29udmVuaWVuY2Ugcm91dGluZSBmb3Igc2V0dGluZyBvcHRpb25h bCB0ZXh0IGFyZ3VtZW50cwogICovCiBzdGF0aWMgdm9pZAotbWFwX2ZpZWxkX3RvX2FyZyhQR3Jl c3VsdCAqcmVzLCBpbnQgcm93LCBpbnQgZmllbGQsCi0JCQkJIGludCBhcmcsIERhdHVtICp2YWx1 ZXMsIGNoYXIgKm51bGxzKQorc2V0X3RleHRfYXJnKE51bGxhYmxlRGF0dW0gKmFyZywgY29uc3Qg Y2hhciAqcykKIHsKLQlpZiAoUFFnZXRpc251bGwocmVzLCByb3csIGZpZWxkKSkKKwlpZiAocykK IAl7Ci0JCXZhbHVlc1thcmddID0gKERhdHVtKSAwOwotCQludWxsc1thcmddID0gJ24nOworCQlh cmctPnZhbHVlID0gQ1N0cmluZ0dldFRleHREYXR1bShzKTsKKwkJYXJnLT5pc251bGwgPSBmYWxz ZTsKIAl9CiAJZWxzZQogCXsKLQkJY29uc3QgY2hhciAqcyA9IFBRZ2V0dmFsdWUocmVzLCByb3cs IGZpZWxkKTsKKwkJYXJnLT52YWx1ZSA9IChEYXR1bSkgMDsKKwkJYXJnLT5pc251bGwgPSB0cnVl OworCX0KK30KKworLyoKKyAqIENvbnZlbmllbmNlIHJvdXRpbmUgZm9yIHNldHRpbmcgb3B0aW9u YWwgaW50MzIgYXJndW1lbnRzCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfaW50MzJfYXJnKE51bGxh YmxlRGF0dW0gKmFyZywgY29uc3QgY2hhciAqcykKK3sKKwlpZiAocykKKwl7CisJCWludDMyCQl2 YWwgPSBwZ19zdHJ0b2ludDMyKHMpOwogCi0JCXZhbHVlc1thcmddID0gQ1N0cmluZ0dldFRleHRE YXR1bShzKTsKLQkJbnVsbHNbYXJnXSA9ICcgJzsKKwkJYXJnLT52YWx1ZSA9IEludDMyR2V0RGF0 dW0odmFsKTsKKwkJYXJnLT5pc251bGwgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJYXJnLT52 YWx1ZSA9IChEYXR1bSkgMDsKKwkJYXJnLT5pc251bGwgPSB0cnVlOwogCX0KIH0KIAogLyoKLSAq IENoZWNrIHRoZSAxeDEgcmVzdWx0IHNldCBvZiBhIHBnX3Jlc3RvcmVfKl9zdGF0cygpIGNvbW1h bmQgZm9yIHN1Y2Nlc3MuCisgKiBDb252ZW5pZW5jZSByb3V0aW5lIGZvciBzZXR0aW5nIG9wdGlv bmFsIHVpbnQzMiBhcmd1bWVudHMKICAqLwotc3RhdGljIGJvb2wKLWltcG9ydF9zcGlfcXVlcnlf b2sodm9pZCkKK3N0YXRpYyB2b2lkCitzZXRfdWludDMyX2FyZyhOdWxsYWJsZURhdHVtICphcmcs IGNvbnN0IGNoYXIgKnMpCiB7Ci0JVHVwbGVEZXNjCXR1cGRlc2M7Ci0JRGF0dW0JCWRhdDsKLQli b29sCQlpc251bGw7CisJaWYgKHMpCisJeworCQl1aW50MzIJCXZhbCA9IHVpbnQzMmluX3N1YnIo cywgTlVMTCwgInVpbnQzMiIsIE5VTEwpOwogCi0JQXNzZXJ0KFNQSV90dXB0YWJsZSAhPSBOVUxM KTsKLQlBc3NlcnQoU1BJX3Byb2Nlc3NlZCA9PSAxKTsKKwkJYXJnLT52YWx1ZSA9IFVJbnQzMkdl dERhdHVtKHZhbCk7CisJCWFyZy0+aXNudWxsID0gZmFsc2U7CisJfQorCWVsc2UKKwl7CisJCWFy Zy0+dmFsdWUgPSAoRGF0dW0pIDA7CisJCWFyZy0+aXNudWxsID0gdHJ1ZTsKKwl9Cit9CisKKy8q CisgKiBDb252ZW5pZW5jZSByb3V0aW5lIGZvciBzZXR0aW5nIG9wdGlvbmFsIGZsb2F0IGFyZ3Vt ZW50cworICovCitzdGF0aWMgdm9pZAorc2V0X2Zsb2F0X2FyZyhOdWxsYWJsZURhdHVtICphcmcs IGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKHMpCisJeworCQlmbG9hdDQJCXZhbCA9IGZsb2F0NGlu X2ludGVybmFsKChjaGFyICopIHMsIE5VTEwsICJmbG9hdCIsIHMsIE5VTEwpOwogCi0JdHVwZGVz YyA9IFNQSV90dXB0YWJsZS0+dHVwZGVzYzsKLQlBc3NlcnQodHVwZGVzYy0+bmF0dHMgPT0gMSk7 Ci0JQXNzZXJ0KFR1cGxlRGVzY0F0dHIodHVwZGVzYywgMCktPmF0dHR5cGlkID09IEJPT0xPSUQp OwotCWRhdCA9IFNQSV9nZXRiaW52YWwoU1BJX3R1cHRhYmxlLT52YWxzWzBdLCB0dXBkZXNjLCAx LCAmaXNudWxsKTsKLQlBc3NlcnQoIWlzbnVsbCk7CisJCWFyZy0+dmFsdWUgPSBGbG9hdDRHZXRE YXR1bSh2YWwpOworCQlhcmctPmlzbnVsbCA9IGZhbHNlOworCX0KKwllbHNlCisJeworCQlhcmct PnZhbHVlID0gKERhdHVtKSAwOworCQlhcmctPmlzbnVsbCA9IHRydWU7CisJfQorfQogCi0JcmV0 dXJuIERhdHVtR2V0Qm9vbChkYXQpOworLyoKKyAqIENvbnZlbmllbmNlIHJvdXRpbmUgZm9yIHNl dHRpbmcgb3B0aW9uYWwgZmxvYXRbXSBhcmd1bWVudHMKKyAqLworc3RhdGljIHZvaWQKK3NldF9m bG9hdGFycl9hcmcoTnVsbGFibGVEYXR1bSAqYXJnLCBjb25zdCBjaGFyICpzKQoreworCWlmIChz KQorCXsKKwkJRm1nckluZm8JZmxpbmZvOworCQlEYXR1bQkJdmFsOworCisJCWZtZ3JfaW5mbyhG X0FSUkFZX0lOLCAmZmxpbmZvKTsKKwkJdmFsID0gSW5wdXRGdW5jdGlvbkNhbGwoJmZsaW5mbywg KGNoYXIgKikgcywgRkxPQVQ0T0lELCAtMSk7CisKKwkJYXJnLT52YWx1ZSA9IHZhbDsKKwkJYXJn LT5pc251bGwgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJYXJnLT52YWx1ZSA9IChEYXR1bSkg MDsKKwkJYXJnLT5pc251bGwgPSB0cnVlOworCX0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsIGIvY29udHJpYi9wb3N0Z3Jlc19m ZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKaW5kZXggZGZjNThiZWIwZDIuLjBkMDYyMmIzMWNlIDEw MDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbAorKysg Yi9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbApAQCAtNDU4NCw2ICs0 NTg0LDM0IEBAIEFOQUxZWkUgZHRlc3RfdGFibGU7CiAKIEFOQUxZWkUgVkVSQk9TRSBkdGVzdF9m dGFibGU7ICAgICAgICAgICAgIC0tIHNob3VsZCB3b3JrCiAKKy0tIGR0ZXN0X2Z0YWJsZSdzIHN0 YXRzIHNob3VsZCBub3cgZXhhY3RseSBtYXRjaCBkdGVzdF90YWJsZSdzCistLSBjb21wYXJlIHZh bHVlcywgc2hvdWxkIG1hdGNoCitTRUxFQ1QgcmVscGFnZXMsIHJlbHR1cGxlcyBGUk9NIHBnX2Ns YXNzCitXSEVSRSBvaWQgPSAncHVibGljLmR0ZXN0X3RhYmxlJzo6cmVnY2xhc3MKK0VYQ0VQVAor U0VMRUNUIHJlbHBhZ2VzLCByZWx0dXBsZXMgRlJPTSBwZ19jbGFzcworV0hFUkUgb2lkID0gJ3B1 YmxpYy5kdGVzdF9mdGFibGUnOjpyZWdjbGFzczsKKworLS0gY29tcGFyZSB0aGUgcm93Y291bnRz LCBzaG91bGQgZ2V0IDAgcm93cyBiYWNrCitTRUxFQ1QgQ09VTlQoKikgRlJPTSBwZ19zdGF0cwor V0hFUkUgc2NoZW1hbmFtZSA9ICdwdWJsaWMnIEFORCB0YWJsZW5hbWUgPSAnZHRlc3RfdGFibGUn CitFWENFUFQKK1NFTEVDVCBDT1VOVCgqKSBGUk9NIHBnX3N0YXRzCitXSEVSRSBzY2hlbWFuYW1l ID0gJ3B1YmxpYycgQU5EIHRhYmxlbmFtZSA9ICdkdGVzdF9mdGFibGUnOworCistLSB0ZXN0IG9u bHkgYSBmZXcgc3RhdHMgY29sdW1ucyBjb21tb24gdG8gaW50ZWdlciB0eXBlcworU0VMRUNUIGF0 dG5hbWUsIGluaGVyaXRlZCwgbnVsbF9mcmFjLCBhdmdfd2lkdGgsIG5fZGlzdGluY3QsCisgIG1v c3RfY29tbW9uX3ZhbHM6OnRleHQgYXMgbWN2LCBtb3N0X2NvbW1vbl9mcmVxcywKKyAgaGlzdG9n cmFtX2JvdW5kczo6dGV4dCBhcyBoYiwgY29ycmVsYXRpb24KK0ZST00gcGdfc3RhdHMKK1dIRVJF IHNjaGVtYW5hbWUgPSAncHVibGljJyBBTkQgdGFibGVuYW1lID0gJ2R0ZXN0X3RhYmxlJworRVhD RVBUCitTRUxFQ1QgYXR0bmFtZSwgaW5oZXJpdGVkLCBudWxsX2ZyYWMsIGF2Z193aWR0aCwgbl9k aXN0aW5jdCwKKyAgbW9zdF9jb21tb25fdmFsczo6dGV4dCBhcyBtY3YsIG1vc3RfY29tbW9uX2Zy ZXFzLAorICBoaXN0b2dyYW1fYm91bmRzOjp0ZXh0IGFzIGhiLCBjb3JyZWxhdGlvbgorRlJPTSBw Z19zdGF0cworV0hFUkUgc2NoZW1hbmFtZSA9ICdwdWJsaWMnIEFORCB0YWJsZW5hbWUgPSAnZHRl c3RfZnRhYmxlJzsKKwogLS0gY2xlYW51cAogRFJPUCBGT1JFSUdOIFRBQkxFIHNpbXBvcnRfZnRh YmxlOwogRFJPUCBGT1JFSUdOIFRBQkxFIHNpbXBvcnRfZnZpZXc7CmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9zdGF0aXN0aWNzL2F0dHJpYnV0ZV9zdGF0cy5jIGIvc3JjL2JhY2tlbmQvc3RhdGlz dGljcy9hdHRyaWJ1dGVfc3RhdHMuYwppbmRleCAxY2M0ZDY1NzIzMS4uMGQ4OGUxODA5NmIgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvYXR0cmlidXRlX3N0YXRzLmMKKysrIGIv c3JjL2JhY2tlbmQvc3RhdGlzdGljcy9hdHRyaWJ1dGVfc3RhdHMuYwpAQCAtNjg4LDMgKzY4OCw2 NyBAQCBwZ19yZXN0b3JlX2F0dHJpYnV0ZV9zdGF0cyhQR19GVU5DVElPTl9BUkdTKQogCiAJUEdf UkVUVVJOX0JPT0wocmVzdWx0KTsKIH0KKworLyoKKyAqIEltcG9ydCBhdHRyaWJ1dGUgc3RhdGlz dGljcyBmcm9tIE51bGxhYmxlRGF0dW0gaW5wdXRzIGZvciBhbGwgc3RhdGl0aWNhbAorICogdmFs dWVzLgorICovCitib29sCitpbXBvcnRfYXR0cmlidXRlX3N0YXRpc3RpY3MoUmVsYXRpb24gcmVs LCBBdHRyTnVtYmVyIGF0dG51bSwgYm9vbCBpbmhlcml0ZWQsCisJCQkJCQkJTnVsbGFibGVEYXR1 bSAqbnVsbF9mcmFjLAorCQkJCQkJCU51bGxhYmxlRGF0dW0gKmF2Z193aWR0aCwKKwkJCQkJCQlO dWxsYWJsZURhdHVtICpuX2Rpc3RpbmN0LAorCQkJCQkJCU51bGxhYmxlRGF0dW0gKm1vc3RfY29t bW9uX3ZhbHMsCisJCQkJCQkJTnVsbGFibGVEYXR1bSAqbW9zdF9jb21tb25fZnJlcXMsCisJCQkJ CQkJTnVsbGFibGVEYXR1bSAqaGlzdG9ncmFtX2JvdW5kcywKKwkJCQkJCQlOdWxsYWJsZURhdHVt ICpjb3JyZWxhdGlvbiwKKwkJCQkJCQlOdWxsYWJsZURhdHVtICptb3N0X2NvbW1vbl9lbGVtcywK KwkJCQkJCQlOdWxsYWJsZURhdHVtICptb3N0X2NvbW1vbl9lbGVtX2ZyZXFzLAorCQkJCQkJCU51 bGxhYmxlRGF0dW0gKmVsZW1fY291bnRfaGlzdG9ncmFtLAorCQkJCQkJCU51bGxhYmxlRGF0dW0g KnJhbmdlX2xlbmd0aF9oaXN0b2dyYW0sCisJCQkJCQkJTnVsbGFibGVEYXR1bSAqcmFuZ2VfZW1w dHlfZnJhYywKKwkJCQkJCQlOdWxsYWJsZURhdHVtICpyYW5nZV9ib3VuZHNfaGlzdG9ncmFtKQor eworCUxPQ0FMX0ZDSU5GTyhuZXdmY2luZm8sIE5VTV9BVFRSSUJVVEVfU1RBVFNfQVJHUyk7CisK KwlJbml0RnVuY3Rpb25DYWxsSW5mb0RhdGEoKm5ld2ZjaW5mbywgTlVMTCwgTlVNX0FUVFJJQlVU RV9TVEFUU19BUkdTLAorCQkJCQkJCSBJbnZhbGlkT2lkLCBOVUxMLCBOVUxMKTsKKworCW5ld2Zj aW5mby0+YXJnc1tBVFRSRUxTQ0hFTUFfQVJHXS52YWx1ZSA9CisJCUNTdHJpbmdHZXRUZXh0RGF0 dW0oZ2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCkpKTsKKwluZXdm Y2luZm8tPmFyZ3NbQVRUUkVMU0NIRU1BX0FSR10uaXNudWxsID0gZmFsc2U7CisJbmV3ZmNpbmZv LT5hcmdzW0FUVFJFTE5BTUVfQVJHXS52YWx1ZSA9CisJCUNTdHJpbmdHZXRUZXh0RGF0dW0oUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisJbmV3ZmNpbmZvLT5hcmdzW0FUVFJFTE5BTUVf QVJHXS5pc251bGwgPSBmYWxzZTsKKwluZXdmY2luZm8tPmFyZ3NbQVRUTkFNRV9BUkddLnZhbHVl ID0gKERhdHVtKSAwOworCW5ld2ZjaW5mby0+YXJnc1tBVFROQU1FX0FSR10uaXNudWxsID0gdHJ1 ZTsKKwluZXdmY2luZm8tPmFyZ3NbQVRUTlVNX0FSR10udmFsdWUgPSBJbnQxNkdldERhdHVtKGF0 dG51bSk7CisJbmV3ZmNpbmZvLT5hcmdzW0FUVE5VTV9BUkddLmlzbnVsbCA9IGZhbHNlOworCW5l d2ZjaW5mby0+YXJnc1tJTkhFUklURURfQVJHXS52YWx1ZSA9IEJvb2xHZXREYXR1bShpbmhlcml0 ZWQpOworCW5ld2ZjaW5mby0+YXJnc1tJTkhFUklURURfQVJHXS5pc251bGwgPSBmYWxzZTsKKwor CW5ld2ZjaW5mby0+YXJnc1tOVUxMX0ZSQUNfQVJHXSA9ICpudWxsX2ZyYWM7CisJbmV3ZmNpbmZv LT5hcmdzW0FWR19XSURUSF9BUkddID0gKmF2Z193aWR0aDsKKwluZXdmY2luZm8tPmFyZ3NbTl9E SVNUSU5DVF9BUkddID0gKm5fZGlzdGluY3Q7CisJbmV3ZmNpbmZvLT5hcmdzW01PU1RfQ09NTU9O X1ZBTFNfQVJHXSA9ICptb3N0X2NvbW1vbl92YWxzOworCW5ld2ZjaW5mby0+YXJnc1tNT1NUX0NP TU1PTl9GUkVRU19BUkddID0gKm1vc3RfY29tbW9uX2ZyZXFzOworCW5ld2ZjaW5mby0+YXJnc1tI SVNUT0dSQU1fQk9VTkRTX0FSR10gPSAqaGlzdG9ncmFtX2JvdW5kczsKKwluZXdmY2luZm8tPmFy Z3NbQ09SUkVMQVRJT05fQVJHXSA9ICpjb3JyZWxhdGlvbjsKKwluZXdmY2luZm8tPmFyZ3NbTU9T VF9DT01NT05fRUxFTVNfQVJHXSA9ICptb3N0X2NvbW1vbl9lbGVtczsKKwluZXdmY2luZm8tPmFy Z3NbTU9TVF9DT01NT05fRUxFTV9GUkVRU19BUkddID0gKm1vc3RfY29tbW9uX2VsZW1fZnJlcXM7 CisJbmV3ZmNpbmZvLT5hcmdzW0VMRU1fQ09VTlRfSElTVE9HUkFNX0FSR10gPSAqZWxlbV9jb3Vu dF9oaXN0b2dyYW07CisJbmV3ZmNpbmZvLT5hcmdzW1JBTkdFX0xFTkdUSF9ISVNUT0dSQU1fQVJH XSA9ICpyYW5nZV9sZW5ndGhfaGlzdG9ncmFtOworCW5ld2ZjaW5mby0+YXJnc1tSQU5HRV9FTVBU WV9GUkFDX0FSR10gPSAqcmFuZ2VfZW1wdHlfZnJhYzsKKwluZXdmY2luZm8tPmFyZ3NbUkFOR0Vf Qk9VTkRTX0hJU1RPR1JBTV9BUkddID0gKnJhbmdlX2JvdW5kc19oaXN0b2dyYW07CisKKwlyZXR1 cm4gYXR0cmlidXRlX3N0YXRpc3RpY3NfdXBkYXRlKG5ld2ZjaW5mbyk7Cit9CisKKy8qCisgKiBE ZWxldGUgYXR0cmlidXRlIHN0YXRpc3RpY3MuCisgKi8KK2Jvb2wKK2RlbGV0ZV9hdHRyaWJ1dGVf c3RhdGlzdGljcyhSZWxhdGlvbiByZWwsIEF0dHJOdW1iZXIgYXR0bnVtLCBib29sIGluaGVyaXRl ZCkKK3sKKwlyZXR1cm4gZGVsZXRlX3BnX3N0YXRpc3RpYyhSZWxhdGlvbkdldFJlbGlkKHJlbCks IGF0dG51bSwgaW5oZXJpdGVkKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0YXRpc3Rp Y3MvcmVsYXRpb25fc3RhdHMuYyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvcmVsYXRpb25fc3Rh dHMuYwppbmRleCBkNjYzMWU5YTlhNC4uMWJkNGI2ZTBkYmEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3N0YXRpc3RpY3MvcmVsYXRpb25fc3RhdHMuYworKysgYi9zcmMvYmFja2VuZC9zdGF0aXN0 aWNzL3JlbGF0aW9uX3N0YXRzLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJjYXRhbG9n L2luZGV4aW5nLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9uYW1lc3BhY2UuaCIKICNpbmNsdWRlICJu b2Rlcy9tYWtlZnVuY3MuaCIKKyNpbmNsdWRlICJzdGF0aXN0aWNzL3N0YXRpc3RpY3MuaCIKICNp bmNsdWRlICJzdGF0aXN0aWNzL3N0YXRfdXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlu cy5oIgogI2luY2x1ZGUgInV0aWxzL2ZtZ3JvaWRzLmgiCkBAIC0yNDEsMyArMjQyLDM0IEBAIHBn X3Jlc3RvcmVfcmVsYXRpb25fc3RhdHMoUEdfRlVOQ1RJT05fQVJHUykKIAogCVBHX1JFVFVSTl9C T09MKHJlc3VsdCk7CiB9CisKKy8qCisgKiBJbXBvcnQgcmVsYXRpb24gc3RhdGlzdGljcyBmcm9t IE51bGxhYmxlRGF0dW0gaW5wdXRzIGZvciBhbGwgc3RhdGl0aWNhbAorICogdmFsdWVzLgorICov Citib29sCitpbXBvcnRfcmVsYXRpb25fc3RhdGlzdGljcyhSZWxhdGlvbiByZWwsCisJCQkJCQkg ICBOdWxsYWJsZURhdHVtICpyZWxwYWdlcywKKwkJCQkJCSAgIE51bGxhYmxlRGF0dW0gKnJlbHR1 cGxlcywKKwkJCQkJCSAgIE51bGxhYmxlRGF0dW0gKnJlbGFsbHZpc2libGUsCisJCQkJCQkgICBO dWxsYWJsZURhdHVtICpyZWxhbGxmcm96ZW4pCit7CisJTE9DQUxfRkNJTkZPKG5ld2ZjaW5mbywg TlVNX1JFTEFUSU9OX1NUQVRTX0FSR1MpOworCisJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpu ZXdmY2luZm8sIE5VTEwsIE5VTV9SRUxBVElPTl9TVEFUU19BUkdTLAorCQkJCQkJCSBJbnZhbGlk T2lkLCBOVUxMLCBOVUxMKTsKKworCW5ld2ZjaW5mby0+YXJnc1tSRUxTQ0hFTUFfQVJHXS52YWx1 ZSA9CisJCUNTdHJpbmdHZXRUZXh0RGF0dW0oZ2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0 TmFtZXNwYWNlKHJlbCkpKTsKKwluZXdmY2luZm8tPmFyZ3NbUkVMU0NIRU1BX0FSR10uaXNudWxs ID0gZmFsc2U7CisJbmV3ZmNpbmZvLT5hcmdzW1JFTE5BTUVfQVJHXS52YWx1ZSA9CisJCUNTdHJp bmdHZXRUZXh0RGF0dW0oUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisJbmV3ZmNpbmZv LT5hcmdzW1JFTE5BTUVfQVJHXS5pc251bGwgPSBmYWxzZTsKKworCW5ld2ZjaW5mby0+YXJnc1tS RUxQQUdFU19BUkddID0gKnJlbHBhZ2VzOworCW5ld2ZjaW5mby0+YXJnc1tSRUxUVVBMRVNfQVJH XSA9ICpyZWx0dXBsZXM7CisJbmV3ZmNpbmZvLT5hcmdzW1JFTEFMTFZJU0lCTEVfQVJHXSA9ICpy ZWxhbGx2aXNpYmxlOworCW5ld2ZjaW5mby0+YXJnc1tSRUxBTExGUk9aRU5fQVJHXSA9ICpyZWxh bGxmcm96ZW47CisKKwlyZXR1cm4gcmVsYXRpb25fc3RhdGlzdGljc191cGRhdGUobmV3ZmNpbmZv KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdGlzdGljcy5oIGIv c3JjL2luY2x1ZGUvc3RhdGlzdGljcy9zdGF0aXN0aWNzLmgKaW5kZXggOGY5YjlkMjM3ZmQuLmI2 MWI4NTg1OGZmIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3Mu aAorKysgYi9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3MuaApAQCAtMTI4LDQgKzEy OCwyNyBAQCBleHRlcm4gU3RhdGlzdGljRXh0SW5mbyAqY2hvb3NlX2Jlc3Rfc3RhdGlzdGljcyhM aXN0ICpzdGF0cywgY2hhciByZXF1aXJlZGtpbmQsCiAJCQkJCQkJCQkJCQlpbnQgbmNsYXVzZXMp OwogZXh0ZXJuIEhlYXBUdXBsZSBzdGF0ZXh0X2V4cHJlc3Npb25zX2xvYWQoT2lkIHN0eG9pZCwg Ym9vbCBpbmgsIGludCBpZHgpOwogCitleHRlcm4gYm9vbCBpbXBvcnRfcmVsYXRpb25fc3RhdGlz dGljcyhSZWxhdGlvbiByZWwsCisJCQkJCQkJCQkgICBOdWxsYWJsZURhdHVtICpyZWxwYWdlcywK KwkJCQkJCQkJCSAgIE51bGxhYmxlRGF0dW0gKnJlbHR1cGxlcywKKwkJCQkJCQkJCSAgIE51bGxh YmxlRGF0dW0gKnJlbGFsbHZpc2libGUsCisJCQkJCQkJCQkgICBOdWxsYWJsZURhdHVtICpyZWxh bGxmcm96ZW4pOworZXh0ZXJuIGJvb2wgaW1wb3J0X2F0dHJpYnV0ZV9zdGF0aXN0aWNzKFJlbGF0 aW9uIHJlbCwKKwkJCQkJCQkJCQlBdHRyTnVtYmVyIGF0dG51bSwgYm9vbCBpbmhlcml0ZWQsCisJ CQkJCQkJCQkJTnVsbGFibGVEYXR1bSAqbnVsbF9mcmFjLAorCQkJCQkJCQkJCU51bGxhYmxlRGF0 dW0gKmF2Z193aWR0aCwKKwkJCQkJCQkJCQlOdWxsYWJsZURhdHVtICpuX2Rpc3RpbmN0LAorCQkJ CQkJCQkJCU51bGxhYmxlRGF0dW0gKm1vc3RfY29tbW9uX3ZhbHMsCisJCQkJCQkJCQkJTnVsbGFi bGVEYXR1bSAqbW9zdF9jb21tb25fZnJlcXMsCisJCQkJCQkJCQkJTnVsbGFibGVEYXR1bSAqaGlz dG9ncmFtX2JvdW5kcywKKwkJCQkJCQkJCQlOdWxsYWJsZURhdHVtICpjb3JyZWxhdGlvbiwKKwkJ CQkJCQkJCQlOdWxsYWJsZURhdHVtICptb3N0X2NvbW1vbl9lbGVtcywKKwkJCQkJCQkJCQlOdWxs YWJsZURhdHVtICptb3N0X2NvbW1vbl9lbGVtX2ZyZXFzLAorCQkJCQkJCQkJCU51bGxhYmxlRGF0 dW0gKmVsZW1fY291bnRfaGlzdG9ncmFtLAorCQkJCQkJCQkJCU51bGxhYmxlRGF0dW0gKnJhbmdl X2xlbmd0aF9oaXN0b2dyYW0sCisJCQkJCQkJCQkJTnVsbGFibGVEYXR1bSAqcmFuZ2VfZW1wdHlf ZnJhYywKKwkJCQkJCQkJCQlOdWxsYWJsZURhdHVtICpyYW5nZV9ib3VuZHNfaGlzdG9ncmFtKTsK K2V4dGVybiBib29sIGRlbGV0ZV9hdHRyaWJ1dGVfc3RhdGlzdGljcyhSZWxhdGlvbiByZWwsCisJ CQkJCQkJCQkJQXR0ck51bWJlciBhdHRudW0sIGJvb2wgaW5oZXJpdGVkKTsKKwogI2VuZGlmCQkJ CQkJCS8qIFNUQVRJU1RJQ1NfSCAqLwo= --000000000000863525065577bc37--