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 1w6ROD-004Iz5-03 for pgsql-hackers@arkaria.postgresql.org; Sat, 28 Mar 2026 10:59:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w6ROB-00E24G-0D for pgsql-hackers@arkaria.postgresql.org; Sat, 28 Mar 2026 10:59:35 +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 1w6ROA-00E247-1A for pgsql-hackers@lists.postgresql.org; Sat, 28 Mar 2026 10:59:35 +0000 Received: from mail-qt1-x835.google.com ([2607:f8b0:4864:20::835]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w6RO8-00000001Tqc-21fN for pgsql-hackers@lists.postgresql.org; Sat, 28 Mar 2026 10:59:33 +0000 Received: by mail-qt1-x835.google.com with SMTP id d75a77b69052e-509069a7a7fso344801cf.0 for ; Sat, 28 Mar 2026 03:59:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774695572; cv=none; d=google.com; s=arc-20240605; b=Dw7ltIQuuhf2u7uDt/T6JYqDQC5MLLGL/H/rHMDMVCKla9uYZ7uchnPeUFHLMT+g+f ohQEqUDm+PbolAggUkvClKujWGGjnhz1r0EXcb4VusXaj+kjC+i2Tr+vdPUc7wUC9Ib4 B+UN2Wgh6TT4Fp5kVkUgloAk1vSYu16BFMegxbmXz2yiATNNK6U2drbKMPdSWKvVPeRr Lvdl2nW9dOl6kiXA3vBa16J4nJC8iSUU4QrspgqoHCQqHna7vYdv/UO350X2v0NUuANt K8AMd/O8SAqeQRny+D6WfItAv+zhZfd9n6+4yhfoiz9X1YvO4JU1fBBTL29AVdCthFP0 05Ew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=8Ns+gM0/zuYazJn8JMhpKo5SDhiVGoYDhkIE5E4y0z4=; fh=I6MOvScW0XvWBKb3mizHPkR3vuCw3VjNQmydzLvkxdc=; b=f/ZBLeUIT5YIzTq51BfofRbSqHZhiFx4vLGZCCWu+nIuf6Sm7Bfr87HAXv4D+jSl2Z GXyNhYKE6bSsdqxoum2plP2mtkWlzT5ovEXLFzcnpEg9AATcDlF8QEToJjrETX//Wiv9 K3CiDHA3t2dQP9bhVp90KBjo1iUoBssFcfvB6UjwBY7FWU19qux87gMuPrkBhJDG363V gdaJutlG1exsu1DmV72yU8NUjKbQp1VwPBUbmsyBy7f04XoxiQtu5lxjowp4MB2E3ZUl w5AZcO4L7DXi8hg8QCa1xXDS1qjGK2+wIVPvfQEFBVdQIyTFojW5ypJRYjWNm1ptB9V4 0dcA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774695572; x=1775300372; darn=lists.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=8Ns+gM0/zuYazJn8JMhpKo5SDhiVGoYDhkIE5E4y0z4=; b=OGul04iKlZo97W1qg2gR/jDQBnkLaKxsw6JunpEyMH/QQ/O7v8Y4ZyzffjYBwC3O1P MLPx2Bn9phDET/iF1s2Xbq7bsDTpkDHMlyLqdp1wf/l3m66rPy/fT6tPaSQCLRjBt7d6 CkBTBstZyZpqGB6X9JT/Ool2d/yAwo20gBe4eZwy5rlK2d8kiGbKU+1siV7BQBdL0HC5 P+yaHqAdXTqtQGaRaw7iXOGjI+l2BJ2kZlZ0FVrNcM7PuTngKZBK9rLp+Q7dvHGj/UaV mvt70f7tFbv+41VReENJ8bjhEebTg4d1o9eHM2qOw2Ro0mrSMfYp/rwZuMMxJNEwd13r fyVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774695572; x=1775300372; 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=8Ns+gM0/zuYazJn8JMhpKo5SDhiVGoYDhkIE5E4y0z4=; b=sTMgoxSPe+7RIk2FteIWsJ7ZAwfC4aOb4VnZeZ5gVP3siDBYfM3TaVvknpWDnH3Bm6 gggu7zbqbVPvTVy8YM12zT4s8a/OQhNY7IZ43Jtju54STb8E0JZLu83EA4NnVDGvyJEt CMHZd455hmkKlLgI9Xrv+RXNA94I2VE1tYqIaGJQmQmOgpVDfQvNjR06uO6uCTojaWHm dfWZxGApE8LPqZuQoj1jCuaK0vUwfd+PRy+kU+sjMQU+yDHUaooe3inM93YOof7pIUpF xpuGtNOIzgD0J4G80K+FSnL9+3Cp0ATBuCfLZPGfTdS0HPJ8iaFwAnY5vcEpHO5pOLL9 6XCA== X-Forwarded-Encrypted: i=1; AJvYcCUmoRYiaCSV8UfJU0AD/G+hVTN7Zf8FVMn4CNUBfsvcd2gctnou7MKWT6srndXzUs/klqzSLe60F8JkEVQq@lists.postgresql.org X-Gm-Message-State: AOJu0Yx+aZ+ufWIAtAZmTTxDUsBC3jPlvIMdUkm96356zL3CNrLkG7xX biXqeHbaaD4jFpeswyRH3ZonS8AF+N+mKn2L/TmNz2piZW34N6RbOV4BDiJADjOZtOd7YWiAFcB Y/0N9idQm8onW2Oa3d5ErsUrAJBDFFLyyEGYXzFgY X-Gm-Gg: ATEYQzyQewwMH7apmxahepXCgmg+Ky15/M+iTet/whp24ykZOOvOttHSpobATvLKpWs GuZdC41cL/4R9jCKWQAum3T1nJjVJVxka5UxK56Xy3c5LCOZlrg4IUFBW/27MFJ5+JcrNYTiWcE pFqY8yixxakp75+qiUMVYOG7V7/wvzPwNgSTd3dkf7YAJrXWsAbjvPZB1DeXGQrJMOXyYgm8EJB RPRarh9MmMEZKpYcsqCn+vwc2WplCltpw0dmyWbo9r4/J9LTS5TBciAYUNZP+FF91v2W17RkqBJ LrHmOiTT1yFs2y0lPxzR6HTa/YiDBeTw5K/tcYsWj5sEfZoocS7S3ZiLCnPkHyMaOjNXEUEDFJv 4uISQlA0= X-Received: by 2002:ac8:7198:0:b0:50b:beac:df1 with SMTP id d75a77b69052e-50bbeac39efmr99531cf.16.1774695571065; Sat, 28 Mar 2026 03:59:31 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Hannu Krosing Date: Sat, 28 Mar 2026 11:59:18 +0100 X-Gm-Features: AQROBzCK8aBoKnr3oWRWmNQMwhdRBNuXpJ-2SDAz9k1i051N6to9CUg2GREb42U Message-ID: Subject: Re: Patch: dumping tables data in multiple chunks in pg_dump To: Zsolt Parragi , Dilip Kumar Cc: David Rowley , Ashutosh Bapat , PostgreSQL Hackers , Nathan Bossart Content-Type: multipart/mixed; boundary="0000000000001a293e064e1383be" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000001a293e064e1383be Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Zsolt and Dilip, Thanks for review and useful comments! On Tue, Feb 3, 2026 at 10:10=E2=80=AFPM Zsolt Parragi wrote: > > Hello! > > I did some testing with this patch, and I think there are some issues > during restoration: > > 1. Isn't there a possible race / scheduling mistake during restore > because of missing dependencies? The code now prints out "TABLE DATA > (pages %u:%u)", while the restore code checks for the explicit "TABLE > DATA" string for dependency tracking (pg_backup_archiver.c:2013 and a > few other places). This causes POST DATA to have no dependency on the > table data, and can be scheduled before we load all table data. I have resolved this by adding a second array to the reverse dependencies mechanism in buildTocEntryArrays() for chunked dump where I collect arrays of ids in AH->tableDataChunkIds. For this I extracted the list management part from DumpableObject typedef struct _DependencyList { DumpId *dependencies; /* dumpIds of objects this one depends on */ int nDeps; /* number of valid dependencies */ int allocDeps; /* allocated size of dependencies[] */ } DependencyList; And added addStandaloneDependency() based addObjectDependency() I simplified it to always use realloc, as it can handle the NULL case void addStandaloneDependency(DependencyList *dobj, DumpId refId) { if (dobj->nDeps >=3D dobj->allocDeps) { dobj->allocDeps =3D (dobj->allocDeps <=3D 0) ? 16 : dobj->allocDeps * 2; dobj->dependencies =3D pg_realloc_array(dobj->dependencies, DumpId, dobj->allocDeps); } dobj->dependencies[dobj->nDeps++] =3D refId; } And then I use AH->tableDataChunkIds in repoint_table_dependencies() to - replace the dependency on table def with dependency on first chunk - add the remaining cunks at the end of dependency list. > I was able to verify the scheduling issue with an index: the INDEX > part is scheduled too early, before all TABLE DATA completes, but then > locking prevents it from progressing, so everything completed fine in > the end. Even if that's guaranteed, which I'm not 100% sure of, it's > still based on luck and not proper logic, and takes up a slot (or > multiple), reducing parallelism. > > 2. Fixing the TABLE DATA strcmp checks solves the scheduling issue, > but it's not that simple, because then it causes truncation issues > during restore, which needs additional changes in the restore code. I > did a quick fix for that by adding an additional condition to the > created flag, and with that it seems to restore everything properly, > and with proper ordering, only starting index/constraint/etc after all > table data is completed. However this was definitely just a quick test > fix, this needs a proper better solution. > > Other issues I see are more minor, but numerous: I collect the chunk dependencies in a separate array, which should solve the truncation issue. Can you advise a good check to add to tap tests for verifying? > 3. The patch still has lots of debug output (pg_log_WARNING("CHUNKING > ...")); Is this intended? Shouldn't these be behind some verbose > check, and maybe use info instead of warning? This left in for easing initial reviewing. I have either removed them or turned them into pg_log_debug() > 4. The is_segment macro should have () around the use of tdiptr Thanks, fixed. > 5. There's still a 32000 magic constant, shouldn't that have some > descriptive name / explanatory comment? I turned this into "ctid < (pagenr+1, 0)" for clarity and futureproofing, as it is not entirely impossible that we could have at some point more than 32000 items per page. > 6. formatting issues at multiple places, mostly missing spaces after > if/while/for statements My hope was that the pre-release automatic formatting run takes care of this. I will eyeball to see if I find theem, but I don't think I have a good way to detect them all. Suggestions very much welcome! > 7. inconsistent error messages (not in range vs must be in range) > 8. There's a remaining TODO that seems stale, current_chunk_start is > already uint64 Removed. > 9. typo: "the computed from pog_relation_size" -> "then computed from > pg_relation_size" Fixed. On Thu, Feb 12, 2026 at 7:13=E2=80=AFAM Dilip Kumar = wrote: > > On Wed, Jan 28, 2026 at 11:00=E2=80=AFPM Hannu Krosing wrote: > > > > v13 has added a proper test comparing original and restored table data > > > I was reviewing v13 and here are some initial comments I have > > 1. IMHO the commit message details about the work progress instead of > a high level idea about what it actually does and how. > Suggestion: > > SUBJECT: Add --max-table-segment-pages option to pg_dump for parallel > table dumping. > > This patch introduces the ability to split large heap tables into segment= s > based on a specified number of pages. These segments can then be dumped i= n > parallel using the existing jobs infrastructure, significantly reducing > the time required to dump very large tables. > > The implementation uses ctid-based range queries (e.g., WHERE ctid >=3D > '(start,1)' > AND ctid <=3D '(end,32000)') to extract specific chunks of the relation. > > SUBJECT: Add --max-table-segment-pages option to pg_dump for parallel table dumping. This patch introduces the ability to split large heap tables into segments based on a specified number of pages. These segments can then be dumped in parallel using the existing jobs infrastructure, significantly reducing the time required to dump very large tables. This --max-table-segment-pages number specifically applies to main table pages which does not guarantee anything about output size. The output could be empty if there are no live tuples in the page range. Or it can be almost 200 GB if the page has just pointers to 1GB TOAST items= . The implementation uses ctid-based range queries (e.g., WHERE ctid >=3D '(startPage,1)' AND ctid <=3D '(endPage+1,0)') to extract specific chunks o= f the relation. This is only effectively supported for PostgreSQL version 14+ though it doe= s work inefficiently on earlier versions The patch only supports "heap" access method as others may not even have th= e ctid column > 2. > + pg_log_warning("CHUNKING: set dopt.max_table_segment_pages to [%u]", > dopt.max_table_segment_pages); > + break; > > IMHO we don't need to place warning here while processing the input param= eters Either removed or turned to pg_log_debug() > 3. > + printf(_(" --max-table-segment-pages=3DNUMPAGES\n" > + " Number of main table pages > above which data is \n" > + " copied out in chunks, also > determines the chunk size\n")); > > Check the comment formatting, all the parameter description starts > with lower case, so better we start with "number" rather than "Number" Fixed > 4. > + if (is_segment(tdinfo)) > + { > + appendPQExpBufferStr(q, tdinfo->filtercond?" AND ":" WHERE "); > + if(tdinfo->startPage =3D=3D 0) > + appendPQExpBuffer(q, "ctid <=3D '(%u,32000)'", tdinfo->endPage); > + else if(tdinfo->endPage !=3D InvalidBlockNumber) > + appendPQExpBuffer(q, "ctid BETWEEN '(%u,1)' AND '(%u,32000)'", > + tdinfo->startPage, tdinfo->endPage); > + else > + appendPQExpBuffer(q, "ctid >=3D '(%u,1)'", tdinfo->startPage); > + pg_log_warning("CHUNKING: pages [%u:%u]",tdinfo->startPage, tdinfo->end= Page); > + } > > IMHO we should explain this chunking logic in the comment above this code= block? I added the comment. I also changed the chunk end logic to "ctid < '(LastPage+1,0)'" for clarity= and future-proofing. ---- Best Regards Hannu --0000000000001a293e064e1383be Content-Type: application/x-patch; name="v14-0001-SUBJECT-Add-max-table-segment-pages-option-to-pg.patch" Content-Disposition: attachment; filename="v14-0001-SUBJECT-Add-max-table-segment-pages-option-to-pg.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mna7w8ja0 RnJvbSBkOTQ0MmViNjQ3NmJhMjdlMGYzZGVlMDg1ZTQ4ZGUyZWZiYjQ0NWQ2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYW5udSBLcm9zaW5nIDxoYW5udWtAZ29vZ2xlLmNvbT4KRGF0 ZTogU2F0LCAyOCBNYXIgMjAyNiAxMTo1MzozOSArMDEwMApTdWJqZWN0OiBbUEFUQ0ggdjE0XSBT VUJKRUNUOiBBZGQgLS1tYXgtdGFibGUtc2VnbWVudC1wYWdlcyBvcHRpb24gdG8gcGdfZHVtcAog Zm9yIHBhcmFsbGVsIHRhYmxlIGR1bXBpbmcuCgpUaGlzIHBhdGNoIGludHJvZHVjZXMgdGhlIGFi aWxpdHkgdG8gc3BsaXQgbGFyZ2UgaGVhcCB0YWJsZXMgaW50byBzZWdtZW50cwpiYXNlZCBvbiBh IHNwZWNpZmllZCBudW1iZXIgb2YgcGFnZXMuIFRoZXNlIHNlZ21lbnRzIGNhbiB0aGVuIGJlIGR1 bXBlZCBpbgpwYXJhbGxlbCB1c2luZyB0aGUgZXhpc3Rpbmcgam9icyBpbmZyYXN0cnVjdHVyZSwg c2lnbmlmaWNhbnRseSByZWR1Y2luZwp0aGUgdGltZSByZXF1aXJlZCB0byBkdW1wIHZlcnkgbGFy Z2UgdGFibGVzLgoKVGhpcyAtLW1heC10YWJsZS1zZWdtZW50LXBhZ2VzIG51bWJlciBzcGVjaWZp Y2FsbHkgYXBwbGllcyB0byBtYWluIHRhYmxlCnBhZ2VzIHdoaWNoIGRvZXMgbm90IGd1YXJhbnRl ZSBhbnl0aGluZyBhYm91dCBvdXRwdXQgc2l6ZS4KVGhlIG91dHB1dCBjb3VsZCBiZSBlbXB0eSBp ZiB0aGVyZSBhcmUgbm8gbGl2ZSB0dXBsZXMgaW4gdGhlIHBhZ2UgcmFuZ2UuCk9yIGl0IGNhbiBi ZSBhbG1vc3QgMjAwIEdCIGlmIHRoZSBwYWdlIGhhcyBqdXN0IHBvaW50ZXJzIHRvIDFHQiBUT0FT VCBpdGVtcy4KClRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGN0aWQtYmFzZWQgcmFuZ2UgcXVlcmll cyAoZS5nLiwgV0hFUkUgY3RpZCA+PQonKHN0YXJ0UGFnZSwxKScgQU5EIGN0aWQgPCAnKGVuZFBh Z2UrMSwwKScpIHRvIGV4dHJhY3Qgc3BlY2lmaWMgY2h1bmtzIG9mCnRoZSByZWxhdGlvbi4KClRo aXMgaXMgb25seSBlZmZlY3RpdmVseSBzdXBwb3J0ZWQgZm9yIFBvc3RncmVTUUwgdmVyc2lvbiAx NCsgdGhvdWdoIGl0IGRvZXMKd29yayBpbmVmZmljaWVudGx5IG9uIGVhcmxpZXIgdmVyc2lvbnMK ClRoZSBwYXRjaCBvbmx5IHN1cHBvcnRzICJoZWFwIiBhY2Nlc3MgbWV0aG9kIGFzIG90aGVycyBt YXkgbm90IGV2ZW4gaGF2ZSB0aGUKY3RpZCBjb2x1bW4KLS0tCiBkb2Mvc3JjL3NnbWwvcmVmL3Bn X2R1bXAuc2dtbCAgICAgICAgICAgICB8ICAyNCArKysKIHNyYy9iaW4vcGdfZHVtcC9wZ19iYWNr dXAuaCAgICAgICAgICAgICAgIHwgICAyICsKIHNyYy9iaW4vcGdfZHVtcC9wZ19iYWNrdXBfYXJj aGl2ZXIuYyAgICAgIHwgIDg0ICsrKysrKysrKy0KIHNyYy9iaW4vcGdfZHVtcC9wZ19iYWNrdXBf YXJjaGl2ZXIuaCAgICAgIHwgIDEyICstCiBzcmMvYmluL3BnX2R1bXAvcGdfZHVtcC5jICAgICAg ICAgICAgICAgICB8IDE3NyArKysrKysrKysrKysrKysrKy0tLS0tCiBzcmMvYmluL3BnX2R1bXAv cGdfZHVtcC5oICAgICAgICAgICAgICAgICB8ICAyMiArKy0KIHNyYy9iaW4vcGdfZHVtcC90LzAw NF9wZ19kdW1wX3BhcmFsbGVsLnBsIHwgIDMxICsrKysKIHNyYy9mZV91dGlscy9vcHRpb25fdXRp bHMuYyAgICAgICAgICAgICAgIHwgIDU1ICsrKysrKysKIHNyYy9pbmNsdWRlL2ZlX3V0aWxzL29w dGlvbl91dGlscy5oICAgICAgIHwgICAzICsKIDkgZmlsZXMgY2hhbmdlZCwgMzY0IGluc2VydGlv bnMoKyksIDQ2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9yZWYvcGdf ZHVtcC5zZ21sIGIvZG9jL3NyYy9zZ21sL3JlZi9wZ19kdW1wLnNnbWwKaW5kZXggN2Y1MzhlOTAx OTQuLjVmMDU2YmI0YWY2IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvcmVmL3BnX2R1bXAuc2dt bAorKysgYi9kb2Mvc3JjL3NnbWwvcmVmL3BnX2R1bXAuc2dtbApAQCAtMTA2Niw2ICsxMDY2LDMw IEBAIFBvc3RncmVTUUwgZG9jdW1lbnRhdGlvbgogICAgICAgPC9saXN0aXRlbT4KICAgICAgPC92 YXJsaXN0ZW50cnk+CiAKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+ LS1tYXgtdGFibGUtc2VnbWVudC1wYWdlcz08cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ bnBhZ2VzPC9yZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+Cisg ICAgICAgPHBhcmE+CisgICAgICAgIER1bXAgZGF0YSBpbiBzZWdtZW50cyBiYXNlZCBvbiBudW1i ZXIgb2YgcGFnZXMgaW4gdGhlIG1haW4gcmVsYXRpb24uCisgICAgICAgIElmIHRoZSBudW1iZXIg b2YgZGF0YSBwYWdlcyBpbiB0aGUgcmVsYXRpb24gaXMgbW9yZSB0aGFuIDxyZXBsYWNlYWJsZSBj bGFzcz0icGFyYW1ldGVyIj5ucGFnZXM8L3JlcGxhY2VhYmxlPiAKKyAgICAgICAgdGhlIGRhdGEg aXMgc3BsaXQgaW50byBzZWdtZW50cyBiYXNlZCBvbiB0aGF0IG51bWJlciBvZiBwYWdlcy4KKyAg ICAgICAgSW5kaXZpZHVhbCBzZWdtZW50cyBjYW4gYmUgZHVtcGVkIGluIHBhcmFsbGVsLgorICAg ICAgIDwvcGFyYT4KKworICAgICAgIDxub3RlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgIFRo ZSBvcHRpb24gPG9wdGlvbj4tLW1heC10YWJsZS1zZWdtZW50LXBhZ2VzPC9vcHRpb24+IGlzIGFw cGxpZWQgdG8gb25seSBwYWdlcworICAgICAgICAgaW4gdGhlIG1haW4gaGVhcCBhbmQgaWYgdGhl IHRhYmxlIGhhcyBhIGxhcmdlIFRPQVNUZWQgcGFydCB0aGlzIGhhcyB0byBiZQorICAgICAgICAg dGFrZW4gaW50byBhY2NvdW50IHdoZW4gZGVjaWRpbmcgb24gdGhlIG51bWJlciBvZiBwYWdlcyB0 byB1c2UuCisgICAgICAgICBJbiB0aGUgZXh0cmVtZSBjYXNlIGEgc2luZ2xlIDhrQiBoZWFwIHBh Z2UgY2FuIGhhdmUgfjIwMCB0b2FzdCBwb2ludGVycyBlYWNoIAorICAgICAgICAgY29ycmVzcG9u ZGluZyB0byAxR0Igb2YgZGF0YS4gSWYgdGhpcyBkYXRhIGlzIGFsc28gbm9uLWNvbXByZXNzaWJs ZSB0aGVuIGEgCisgICAgICAgICBzaW5nbGUtcGFnZSBzZWdtZW50IGNhbiBkdW1wIGFzIDIwMEdC IGZpbGUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICA8L25vdGU+CisKKyAgICAgIDwvbGlzdGl0 ZW0+CisgICAgIDwvdmFybGlzdGVudHJ5PgorCiAgICAgIDx2YXJsaXN0ZW50cnk+CiAgICAgICA8 dGVybT48b3B0aW9uPi0tbm8tY29tbWVudHM8L29wdGlvbj48L3Rlcm0+CiAgICAgICA8bGlzdGl0 ZW0+CmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2R1bXAvcGdfYmFja3VwLmggYi9zcmMvYmluL3Bn X2R1bXAvcGdfYmFja3VwLmgKaW5kZXggZmRhOTEyYmEwYTkuLjExODYzYTE5MTVmIDEwMDY0NAot LS0gYS9zcmMvYmluL3BnX2R1bXAvcGdfYmFja3VwLmgKKysrIGIvc3JjL2Jpbi9wZ19kdW1wL3Bn X2JhY2t1cC5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiY29tbW9uL2ZpbGVfdXRpbHMu aCIKICNpbmNsdWRlICJmZV91dGlscy9zaW1wbGVfbGlzdC5oIgogI2luY2x1ZGUgImxpYnBxLWZl LmgiCisjaW5jbHVkZSAic3RvcmFnZS9ibG9jay5oIgogCiAKIHR5cGVkZWYgZW51bSB0cml2YWx1 ZQpAQCAtMTc5LDYgKzE4MCw3IEBAIHR5cGVkZWYgc3RydWN0IF9kdW1wT3B0aW9ucwogCWJvb2wJ CWFjbHNTa2lwOwogCWNvbnN0IGNoYXIgKmxvY2tXYWl0VGltZW91dDsKIAlpbnQJCQlkdW1wX2lu c2VydHM7CS8qIDAgPSBDT1BZLCBvdGhlcndpc2Ugcm93cyBwZXIgSU5TRVJUICovCisJQmxvY2tO dW1iZXIJbWF4X3RhYmxlX3NlZ21lbnRfcGFnZXM7IC8qIGNodW5rIHdoZW4gcmVscGFnZXMgaXMg YWJvdmUgdGhpcyAqLwogCiAJLyogZmxhZ3MgZm9yIHZhcmlvdXMgY29tbWFuZC1saW5lIGxvbmcg b3B0aW9ucyAqLwogCWludAkJCWRpc2FibGVfZG9sbGFyX3F1b3Rpbmc7CmRpZmYgLS1naXQgYS9z cmMvYmluL3BnX2R1bXAvcGdfYmFja3VwX2FyY2hpdmVyLmMgYi9zcmMvYmluL3BnX2R1bXAvcGdf YmFja3VwX2FyY2hpdmVyLmMKaW5kZXggMjcxYTJjM2U0ODEuLjM4NGFkZDA3MTNiIDEwMDY0NAot LS0gYS9zcmMvYmluL3BnX2R1bXAvcGdfYmFja3VwX2FyY2hpdmVyLmMKKysrIGIvc3JjL2Jpbi9w Z19kdW1wL3BnX2JhY2t1cF9hcmNoaXZlci5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSAi cGdfYmFja3VwX2FyY2hpdmVyLmgiCiAjaW5jbHVkZSAicGdfYmFja3VwX2RiLmgiCiAjaW5jbHVk ZSAicGdfYmFja3VwX3V0aWxzLmgiCisjaW5jbHVkZSAic3RvcmFnZS9ibG9jay5oIgogCiAjZGVm aW5lIFRFWFRfRFVNUF9IRUFERVIgIi0tXG4tLSBQb3N0Z3JlU1FMIGRhdGFiYXNlIGR1bXBcbi0t XG5cbiIKICNkZWZpbmUgVEVYVF9EVU1QQUxMX0hFQURFUiAiLS1cbi0tIFBvc3RncmVTUUwgZGF0 YWJhc2UgY2x1c3RlciBkdW1wXG4tLVxuXG4iCkBAIC0xNTQsNiArMTU1LDcgQEAgSW5pdER1bXBP cHRpb25zKER1bXBPcHRpb25zICpvcHRzKQogCW9wdHMtPmR1bXBTY2hlbWEgPSB0cnVlOwogCW9w dHMtPmR1bXBEYXRhID0gdHJ1ZTsKIAlvcHRzLT5kdW1wU3RhdGlzdGljcyA9IGZhbHNlOworCW9w dHMtPm1heF90YWJsZV9zZWdtZW50X3BhZ2VzID0gSW52YWxpZEJsb2NrTnVtYmVyOwogfQogCiAv KgpAQCAtMTk5NSw2ICsxOTk3LDI4IEBAIF9tb3ZlQmVmb3JlKFRvY0VudHJ5ICpwb3MsIFRvY0Vu dHJ5ICp0ZSkKIAlwb3MtPnByZXYgPSB0ZTsKIH0KIAorLyoKKyAqIEFkZCBhIGRlcGVuZGVuY3kg aWQgdG8gYSBEZXBlbmRlbmN5TGlzdCBvYmplY3QKKyAqIFRoaXMgaXMgY3VycmVudGx5IHVzZWQg Zm9yIGNvbGxlY3RpbmcgcmV2ZXJzZSAKKyAqIGRlcGVuZGVuY2llcyBmb3IgY2h1bmtlZCBkYXRh IGR1bXAgCisgKgorICogTm90ZTogZHVwbGljYXRlIGRlcGVuZGVuY2llcyBhcmUgY3VycmVudGx5 IG5vdCBlbGltaW5hdGVkCisgKi8KK3ZvaWQKK2FkZFN0YW5kYWxvbmVEZXBlbmRlbmN5KERlcGVu ZGVuY3lMaXN0ICpkb2JqLCBEdW1wSWQgcmVmSWQpCit7CisJcGdfbG9nX3dhcm5pbmcoIkFkZGlu ZyBkZXA6IGxpc3QgJXAgKyBkZXAgJXUiLCAodm9pZCAqKSBkb2JqLT5kZXBlbmRlbmNpZXMsIHJl ZklkKTsKKwlpZiAoZG9iai0+bkRlcHMgPj0gZG9iai0+YWxsb2NEZXBzKQorCXsKKwkJZG9iai0+ YWxsb2NEZXBzID0gKGRvYmotPmFsbG9jRGVwcyA8PSAwKSA/IDE2IDogZG9iai0+YWxsb2NEZXBz ICogMjsKKwkJZG9iai0+ZGVwZW5kZW5jaWVzID0gcGdfcmVhbGxvY19hcnJheShkb2JqLT5kZXBl bmRlbmNpZXMsCisJCQkJCQkJCQkJCSAgRHVtcElkLCBkb2JqLT5hbGxvY0RlcHMpOworCQlwZ19s b2dfd2FybmluZygiUmVhbGxvY2VkIGxpc3QgJXAgdG8gc2l6ZSAlZCIsICh2b2lkICopIGRvYmot PmRlcGVuZGVuY2llcywgZG9iai0+YWxsb2NEZXBzKTsKKwl9CisJcGdfbG9nX3dhcm5pbmcoIkFk ZGVkIGRlcDogbGlzdCAlcCArIGRlcCAldSIsICh2b2lkICopIGRvYmotPmRlcGVuZGVuY2llcywg cmVmSWQpOworCWRvYmotPmRlcGVuZGVuY2llc1tkb2JqLT5uRGVwcysrXSA9IHJlZklkOworfQor CiAvKgogICogQnVpbGQgaW5kZXggYXJyYXlzIGZvciB0aGUgVE9DIGxpc3QKICAqCkBAIC0yMDE0 LDYgKzIwMzgsNyBAQCBidWlsZFRvY0VudHJ5QXJyYXlzKEFyY2hpdmVIYW5kbGUgKkFIKQogCiAJ QUgtPnRvY3NCeUR1bXBJZCA9IHBnX21hbGxvYzBfYXJyYXkoVG9jRW50cnkgKiwgKG1heER1bXBJ ZCArIDEpKTsKIAlBSC0+dGFibGVEYXRhSWQgPSBwZ19tYWxsb2MwX2FycmF5KER1bXBJZCwgKG1h eER1bXBJZCArIDEpKTsKKwlBSC0+dGFibGVEYXRhQ2h1bmtJZHMgPSBwZ19tYWxsb2MwX2FycmF5 KERlcGVuZGVuY3lMaXN0LCAobWF4RHVtcElkICsgMSkpOwogCiAJZm9yICh0ZSA9IEFILT50b2Mt Pm5leHQ7IHRlICE9IEFILT50b2M7IHRlID0gdGUtPm5leHQpCiAJewpAQCAtMjAyOSw4ICsyMDU0 LDEyIEBAIGJ1aWxkVG9jRW50cnlBcnJheXMoQXJjaGl2ZUhhbmRsZSAqQUgpCiAJCSAqIFRPQyBl bnRyeSB0aGF0IGhhcyBhIERBVEEgaXRlbS4gIFdlIGNvbXB1dGUgdGhpcyBieSByZXZlcnNpbmcg dGhlCiAJCSAqIFRBQkxFIERBVEEgaXRlbSdzIGRlcGVuZGVuY3ksIGtub3dpbmcgdGhhdCBhIFRB QkxFIERBVEEgaXRlbSBoYXMKIAkJICoganVzdCBvbmUgZGVwZW5kZW5jeSBhbmQgaXQgaXMgdGhl IFRBQkxFIGl0ZW0uCisJCSAqCisJCSAqIEZvciBjaHVua2VkIHRhYmxlIGRhdGEsIHRoZSBUQUJM RSBEQVRBIGl0ZW0gaGFzIGEgZGVzY3JpcHRpb24gbGlrZQorCQkgKiAiVEFCTEUgREFUQSAocGFn ZXMgMTAwOjE5OSkiLCBhbmQgd2UgY29sbGVjdCBhbGwgc3VjaCBpdGVtcyBhcworCQkgKiByZXZl cnNlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHBhcmVudCB0YWJsZSdzIGVudHJ5IGluIHRhYmxlRGF0 YUNodW5rSWRzLgogCQkgKi8KLQkJaWYgKHN0cmNtcCh0ZS0+ZGVzYywgIlRBQkxFIERBVEEiKSA9 PSAwICYmIHRlLT5uRGVwcyA+IDApCisJCWlmIChzdHJuY21wKHRlLT5kZXNjLCAiVEFCTEUgREFU QSIsIDEwKSA9PSAwICYmIHRlLT5uRGVwcyA+IDApCiAJCXsKIAkJCUR1bXBJZAkJdGFibGVJZCA9 IHRlLT5kZXBlbmRlbmNpZXNbMF07CiAKQEAgLTIwNDIsNyArMjA3MSwxNCBAQCBidWlsZFRvY0Vu dHJ5QXJyYXlzKEFyY2hpdmVIYW5kbGUgKkFIKQogCQkJaWYgKHRhYmxlSWQgPD0gMCB8fCB0YWJs ZUlkID4gbWF4RHVtcElkKQogCQkJCXBnX2ZhdGFsKCJiYWQgdGFibGUgZHVtcElkIGZvciBUQUJM RSBEQVRBIGl0ZW0iKTsKIAotCQkJQUgtPnRhYmxlRGF0YUlkW3RhYmxlSWRdID0gdGUtPmR1bXBJ ZDsKKwkJCWlmICh0ZS0+ZGVzY1sxMF0gPT0gJ1wwJykgLyogdGUtPmRlc2MgPT0gIlRBQkxFIERB VEEiICovCisJCQkJQUgtPnRhYmxlRGF0YUlkW3RhYmxlSWRdID0gdGUtPmR1bXBJZDsKKwkJCWVs c2UKKwkJCXsKKwkJCQkvKiBDaHVua2VkIHRhYmxlIGRhdGEsIHRoZSBkZXNjcmlwdGlvbiBpcyAi VEFCTEUgREFUQSAocGFnZXMgJXU6JXUpIiAqLworCQkJCWFkZFN0YW5kYWxvbmVEZXBlbmRlbmN5 KCYoQUgtPnRhYmxlRGF0YUNodW5rSWRzW3RhYmxlSWRdKSwgdGUtPmR1bXBJZCk7CisJCQkJcGdf bG9nX2RlYnVnKCJBZGRlZCBjaHVua2VkIHRhYmxlIGRhdGEgZGVwZW5kZW5jeTogdGFibGVJZCAl dSArIGNodW5rSWQgJXUiLAorCQkJCQkJCSB0YWJsZUlkLCB0ZS0+ZHVtcElkKTt9CiAJCX0KIAl9 CiB9CkBAIC01MDE3LDYgKzUwNTMsMTIgQEAgZml4X2RlcGVuZGVuY2llcyhBcmNoaXZlSGFuZGxl ICpBSCkKICAqIHRoYXQgcGFyYWxsZWwgcmVzdG9yZSB3aWxsIHByaW9yaXRpemUgbGFyZ2VyIGpv YnMgKGluZGV4IGJ1aWxkcywgRksKICAqIGNvbnN0cmFpbnQgY2hlY2tzLCBldGMpIG92ZXIgc21h bGxlciBvbmVzLCBhdm9pZGluZyBzaXR1YXRpb25zIHdoZXJlIHdlCiAgKiBlbmQgYSByZXN0b3Jl IHdpdGggb25seSBvbmUgYWN0aXZlIGpvYiB3b3JraW5nIG9uIGEgbGFyZ2UgdGFibGUuCisgKgor ICogSW4gY2FzZSBvZiBjaHVua2VkIGR1bXBzLCB3ZSBjaGFuZ2UgdGhlIGRlcGVuZW5jeSBvbiB0 YWJsZSB3aXRoIGRlcGVkZW5jeQorICogb24gdGhlIGZpcnN0IGNodW5rIG9mIGRhdGEgYW5kIGFk ZCB0aGUgcmVtYWluZ2kgY2h1bmsgaWRzLCBpZiBhbnksIHRvIHRoZSAKKyAqIGVuZCBvZiBkZXBl bmNlbmN5IGxpc3QKKyAqIHdlIGFsc28gY2FsY3VsYXRlIHRoZSBmdWxsRGF0YUxlbmd0aCBhcyB0 aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIGNodW5rCisgKiBkYXRhIGl0ZW1zIGFuZCB1c2UgdGhh dCB0byBzZXQgdGhlIGl0ZW0ncyBkYXRhTGVuZ3RoLgogICovCiBzdGF0aWMgdm9pZAogcmVwb2lu dF90YWJsZV9kZXBlbmRlbmNpZXMoQXJjaGl2ZUhhbmRsZSAqQUgpCkBAIC01MDMyLDggKzUwNzQs OSBAQCByZXBvaW50X3RhYmxlX2RlcGVuZGVuY2llcyhBcmNoaXZlSGFuZGxlICpBSCkKIAkJZm9y IChpID0gMDsgaSA8IHRlLT5uRGVwczsgaSsrKQogCQl7CiAJCQlvbGRkZXAgPSB0ZS0+ZGVwZW5k ZW5jaWVzW2ldOwotCQkJaWYgKG9sZGRlcCA8PSBBSC0+bWF4RHVtcElkICYmCi0JCQkJQUgtPnRh YmxlRGF0YUlkW29sZGRlcF0gIT0gMCkKKwkJCWlmIChvbGRkZXAgPiBBSC0+bWF4RHVtcElkKQor CQkJCWNvbnRpbnVlOworCQkJaWYgKEFILT50YWJsZURhdGFJZFtvbGRkZXBdICE9IDApCiAJCQl7 CiAJCQkJRHVtcElkCQl0YWJsZWRhdGFpZCA9IEFILT50YWJsZURhdGFJZFtvbGRkZXBdOwogCQkJ CVRvY0VudHJ5ICAgKnRhYmxlZGF0YXRlID0gQUgtPnRvY3NCeUR1bXBJZFt0YWJsZWRhdGFpZF07 CkBAIC01MDQzLDYgKzUwODYsMzkgQEAgcmVwb2ludF90YWJsZV9kZXBlbmRlbmNpZXMoQXJjaGl2 ZUhhbmRsZSAqQUgpCiAJCQkJcGdfbG9nX2RlYnVnKCJ0cmFuc2ZlcnJpbmcgZGVwZW5kZW5jeSAl ZCAtPiAlZCB0byAlZCIsCiAJCQkJCQkJIHRlLT5kdW1wSWQsIG9sZGRlcCwgdGFibGVkYXRhaWQp OwogCQkJfQorCQkJZWxzZSBpZiAoQUgtPnRhYmxlRGF0YUNodW5rSWRzW29sZGRlcF0ubkRlcHMg PiAwKQorCQkJeworCQkJCWludAkJCWo7CisJCQkJRHVtcElkCQljaHVua2RhdGFpZDsKKwkJCQl1 aW50NjQJCWZ1bGxEYXRhTGVuZ3RoOworCQkJCURlcGVuZGVuY3lMaXN0ICpkZXBsaXN0ID0gJkFI LT50YWJsZURhdGFDaHVua0lkc1tvbGRkZXBdOworCisJCQkJLyogZmlyc3QgaW4gbGlzdCByZXBs YWNlcyB0aGUgZGVwZW5kZW5jeSBvbiB0YWJsZSAqLworCQkJCWNodW5rZGF0YWlkID0gZGVwbGlz dC0+ZGVwZW5kZW5jaWVzWzBdOworCQkJCXRlLT5kZXBlbmRlbmNpZXNbaV0gPSBjaHVua2RhdGFp ZDsKKwkJCQlmdWxsRGF0YUxlbmd0aCA9IEFILT50b2NzQnlEdW1wSWRbY2h1bmtkYXRhaWRdLT5k YXRhTGVuZ3RoOworCQkJCXBnX2xvZ19kZWJ1ZygidHJhbnNmZXJyaW5nIGNodW5rIGxpc3QgJWQg LT4gJWQgdG8gJWQiLAorCQkJCQkJCSB0ZS0+ZHVtcElkLCBvbGRkZXAsIGNodW5rZGF0YWlkKTsK KworCQkJCWlmIChkZXBsaXN0LT5uRGVwcyA+IDEpCisJCQkJeworCQkJCQkvKiBtYWtlIHNwYWNl ICovCisJCQkJCXRlLT5kZXBlbmRlbmNpZXMgPSBwZ19yZWFsbG9jX2FycmF5KHRlLT5kZXBlbmRl bmNpZXMsCisJCQkJCQkJCQkJCQkgIER1bXBJZCwKKwkJCQkJCQkJCQkJCSAgdGUtPm5EZXBzICsg ZGVwbGlzdC0+bkRlcHMgLSAxKTsKKworCQkJCQkvKiB0aGUgcmVzdCBhcmUgYXBwZW5kZWQgdG8g ZGVwZW5kZW5jaWVzICovCisJCQkJCWZvciAoaiA9IDE7IGogPCBkZXBsaXN0LT5uRGVwczsgaisr KQorCQkJCQl7CisJCQkJCQljaHVua2RhdGFpZCA9IGRlcGxpc3QtPmRlcGVuZGVuY2llc1tqXTsK KwkJCQkJCXRlLT5kZXBlbmRlbmNpZXNbdGUtPm5EZXBzICsgal0gPSBjaHVua2RhdGFpZDsKKwkJ CQkJCWZ1bGxEYXRhTGVuZ3RoICs9IEFILT50b2NzQnlEdW1wSWRbY2h1bmtkYXRhaWRdLT5kYXRh TGVuZ3RoOworCQkJCQkJcGdfbG9nX2RlYnVnKCJhZGRpbmcgY2h1bmsgbGlzdCAlZCAtPiAlZCB0 byAlZCIsCisJCQkJCQkJCQl0ZS0+ZHVtcElkLCBvbGRkZXAsIGNodW5rZGF0YWlkKTsKKwkJCQkJ fQorCQkJCX0KKwkJCQl0ZS0+ZGF0YUxlbmd0aCA9IE1heCh0ZS0+ZGF0YUxlbmd0aCwgZnVsbERh dGFMZW5ndGgpOworCQkJfQogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19kdW1w L3BnX2JhY2t1cF9hcmNoaXZlci5oIGIvc3JjL2Jpbi9wZ19kdW1wL3BnX2JhY2t1cF9hcmNoaXZl ci5oCmluZGV4IDM2NTA3M2IzZWFlLi5jZmEzZWExYmJkNiAxMDA2NDQKLS0tIGEvc3JjL2Jpbi9w Z19kdW1wL3BnX2JhY2t1cF9hcmNoaXZlci5oCisrKyBiL3NyYy9iaW4vcGdfZHVtcC9wZ19iYWNr dXBfYXJjaGl2ZXIuaApAQCAtMTc5LDYgKzE3OSwxMyBAQCB0eXBlZGVmIGVudW0KIAlPVVRQVVRf T1RIRVJEQVRBLAkJCS8qIHdyaXRpbmcgZGF0YSBhcyBJTlNFUlQgY29tbWFuZHMgKi8KIH0gQXJj aGl2ZXJPdXRwdXQ7CiAKK3R5cGVkZWYgc3RydWN0IF9EZXBlbmRlbmN5TGlzdAoreworCUR1bXBJ ZAkgICAqZGVwZW5kZW5jaWVzOwkvKiBkdW1wSWRzIG9mIG9iamVjdHMgdGhpcyBvbmUgZGVwZW5k cyBvbiAqLworCWludAkJCW5EZXBzOwkJCS8qIG51bWJlciBvZiB2YWxpZCBkZXBlbmRlbmNpZXMg Ki8KKwlpbnQJCQlhbGxvY0RlcHM7CQkvKiBhbGxvY2F0ZWQgc2l6ZSBvZiBkZXBlbmRlbmNpZXNb XSAqLworfSBEZXBlbmRlbmN5TGlzdDsKKwogLyoKICAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMs IEFDTCBpdGVtcyBhcmUgaW50ZXJzcGVyc2VkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluCiAgKiBh IGR1bXAgZmlsZSdzIFRPQzsgdHlwaWNhbGx5IHRoZXkncmUgcmlnaHQgYWZ0ZXIgdGhlIG9iamVj dCB0aGV5J3JlIGZvci4KQEAgLTMxMSw2ICszMTgsNyBAQCBzdHJ1Y3QgX2FyY2hpdmVIYW5kbGUK IAkvKiBhcnJheXMgY3JlYXRlZCBhZnRlciB0aGUgVE9DIGxpc3QgaXMgY29tcGxldGU6ICovCiAJ c3RydWN0IF90b2NFbnRyeSAqKnRvY3NCeUR1bXBJZDsJLyogVE9DcyBpbmRleGVkIGJ5IGR1bXBJ ZCAqLwogCUR1bXBJZAkgICAqdGFibGVEYXRhSWQ7CS8qIFRBQkxFIERBVEEgaWRzLCBpbmRleGVk IGJ5IHRhYmxlIGR1bXBJZCAqLworCURlcGVuZGVuY3lMaXN0ICp0YWJsZURhdGFDaHVua0lkczsg LyogZGVwZW5kZW5jaWVzIGluZGV4ZWQgYnkgZHVtcElkICovCiAKIAlzdHJ1Y3QgX3RvY0VudHJ5 ICpjdXJyVG9jOwkvKiBVc2VkIHdoZW4gZHVtcGluZyBkYXRhICovCiAJcGdfY29tcHJlc3Nfc3Bl Y2lmaWNhdGlvbiBjb21wcmVzc2lvbl9zcGVjOyAvKiBSZXF1ZXN0ZWQgc3BlY2lmaWNhdGlvbiBm b3IKQEAgLTM3Nyw3ICszODUsNyBAQCBzdHJ1Y3QgX3RvY0VudHJ5CiAJc2l6ZV90CQlkZWZuTGVu OwkJLyogbGVuZ3RoIG9mIGR1bXBlZCBkZWZpbml0aW9uICovCiAKIAkvKiB3b3JraW5nIHN0YXRl IHdoaWxlIGR1bXBpbmcvcmVzdG9yaW5nICovCi0JcGdvZmZfdAkJZGF0YUxlbmd0aDsJCS8qIGl0 ZW0ncyBkYXRhIHNpemU7IDAgaWYgbm9uZSBvciB1bmtub3duICovCisJdWludDY0CQlkYXRhTGVu Z3RoOwkJLyogaXRlbSdzIGRhdGEgc2l6ZTsgMCBpZiBub25lIG9yIHVua25vd24gKi8KIAlpbnQJ CQlyZXFzOwkJCS8qIGRvIHdlIG5lZWQgc2NoZW1hIGFuZC9vciBkYXRhIG9mIG9iamVjdAogCQkJ CQkJCQkgKiAoUkVRXyogYml0IG1hc2spICovCiAJYm9vbAkJY3JlYXRlZDsJCS8qIHNldCBmb3Ig REFUQSBtZW1iZXIgaWYgVEFCTEUgd2FzIGNyZWF0ZWQgKi8KQEAgLTQzNyw2ICs0NDUsOCBAQCBl eHRlcm4gaW50CVRvY0lEUmVxdWlyZWQoQXJjaGl2ZUhhbmRsZSAqQUgsIER1bXBJZCBpZCk7CiBU b2NFbnRyeSAgICpnZXRUb2NFbnRyeUJ5RHVtcElkKEFyY2hpdmVIYW5kbGUgKkFILCBEdW1wSWQg aWQpOwogZXh0ZXJuIGJvb2wgY2hlY2tTZWVrKEZJTEUgKmZwKTsKIAorZXh0ZXJuIHZvaWQgYWRk U3RhbmRhbG9uZURlcGVuZGVuY3koRGVwZW5kZW5jeUxpc3QgKmRvYmosIER1bXBJZCByZWZJZCk7 CisKICNkZWZpbmUgYXBwZW5kU3RyaW5nTGl0ZXJhbEFIWChidWYsc3RyLEFIKSBcCiAJYXBwZW5k U3RyaW5nTGl0ZXJhbChidWYsIHN0ciwgKEFIKS0+cHVibGljLmVuY29kaW5nLCAoQUgpLT5wdWJs aWMuc3RkX3N0cmluZ3MpCiAKZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfZHVtcC9wZ19kdW1wLmMg Yi9zcmMvYmluL3BnX2R1bXAvcGdfZHVtcC5jCmluZGV4IDVkMWY3NjgyZjExLi4xZTdkOWEzZjdm MyAxMDA2NDQKLS0tIGEvc3JjL2Jpbi9wZ19kdW1wL3BnX2R1bXAuYworKysgYi9zcmMvYmluL3Bn X2R1bXAvcGdfZHVtcC5jCkBAIC01MzUsNiArNTM1LDcgQEAgbWFpbihpbnQgYXJnYywgY2hhciAq KmFyZ3YpCiAJCXsiZXhjbHVkZS1leHRlbnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwg MTd9LAogCQl7InNlcXVlbmNlLWRhdGEiLCBub19hcmd1bWVudCwgJmRvcHQuc2VxdWVuY2VfZGF0 YSwgMX0sCiAJCXsicmVzdHJpY3Qta2V5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIDI1fSwK KwkJeyJtYXgtdGFibGUtc2VnbWVudC1wYWdlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAy Nn0sCiAKIAkJe05VTEwsIDAsIE5VTEwsIDB9CiAJfTsKQEAgLTc5OSw2ICs4MDAsMTIgQEAgbWFp bihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQkJZG9wdC5yZXN0cmljdF9rZXkgPSBwZ19zdHJk dXAob3B0YXJnKTsKIAkJCQlicmVhazsKIAorCQkJY2FzZSAyNjoKKwkJCQlpZiAoIW9wdGlvbl9w YXJzZV91aW50MzIob3B0YXJnLCAiLS1tYXgtdGFibGUtc2VnbWVudC1wYWdlcyIsIDEsIE1heEJs b2NrTnVtYmVyLAorCQkJCQkJCQkJICAmZG9wdC5tYXhfdGFibGVfc2VnbWVudF9wYWdlcykpCisJ CQkJCWV4aXRfbmljZWx5KDEpOworCQkJCWJyZWFrOworCiAJCQlkZWZhdWx0OgogCQkJCS8qIGdl dG9wdF9sb25nIGFscmVhZHkgZW1pdHRlZCBhIGNvbXBsYWludCAqLwogCQkJCXBnX2xvZ19lcnJv cl9oaW50KCJUcnkgXCIlcyAtLWhlbHBcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iLCBwcm9nbmFt ZSk7CkBAIC0xMzQ0LDYgKzEzNTEsOSBAQCBoZWxwKGNvbnN0IGNoYXIgKnByb2duYW1lKQogCXBy aW50ZihfKCIgIC0tZXh0cmEtZmxvYXQtZGlnaXRzPU5VTSAgICAgb3ZlcnJpZGUgZGVmYXVsdCBz ZXR0aW5nIGZvciBleHRyYV9mbG9hdF9kaWdpdHNcbiIpKTsKIAlwcmludGYoXygiICAtLWZpbHRl cj1GSUxFTkFNRSAgICAgICAgICAgIGluY2x1ZGUgb3IgZXhjbHVkZSBvYmplY3RzIGFuZCBkYXRh IGZyb20gZHVtcFxuIgogCQkJICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQg b24gZXhwcmVzc2lvbnMgaW4gRklMRU5BTUVcbiIpKTsKKwlwcmludGYoXygiICAtLW1heC10YWJs ZS1zZWdtZW50LXBhZ2VzPU5VTVBBR0VTXG4iCisJCSAgICAgIiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBudW1iZXIgb2YgbWFpbiB0YWJsZSBwYWdlcyBhYm92ZSB3aGljaCBkYXRhIGlz IFxuIgorCQkJICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkIG91dCBpbiBj aHVua3MsIGFsc28gZGV0ZXJtaW5lcyB0aGUgY2h1bmsgc2l6ZVxuIikpOwogCXByaW50ZihfKCIg IC0taWYtZXhpc3RzICAgICAgICAgICAgICAgICAgdXNlIElGIEVYSVNUUyB3aGVuIGRyb3BwaW5n IG9iamVjdHNcbiIpKTsKIAlwcmludGYoXygiICAtLWluY2x1ZGUtZm9yZWlnbi1kYXRhPVBBVFRF Uk5cbiIKIAkJCSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZGF0YSBv ZiBmb3JlaWduIHRhYmxlcyBvbiBmb3JlaWduXG4iCkBAIC0yMzk2LDcgKzI0MDYsNyBAQCBkdW1w VGFibGVEYXRhX2NvcHkoQXJjaGl2ZSAqZm91dCwgY29uc3Qgdm9pZCAqZGNvbnRleHQpCiAJICog ZHVtcGluZyBhbiBvbGQgcGdfbGFyZ2VvYmplY3RfbWV0YWRhdGEgZGVmaW5lZCBXSVRIIE9JRFMu ICBGb3Igb3RoZXIKIAkgKiBjYXNlcyBhIHNpbXBsZSBDT1BZIHN1ZmZpY2VzLgogCSAqLwotCWlm ICh0ZGluZm8tPmZpbHRlcmNvbmQgfHwgdGJpbmZvLT5yZWxraW5kID09IFJFTEtJTkRfRk9SRUlH Tl9UQUJMRSB8fAorCWlmICh0ZGluZm8tPmZpbHRlcmNvbmQgfHwgaXNfc2VnbWVudCh0ZGluZm8p IHx8IHRiaW5mby0+cmVsa2luZCA9PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUgfHwKIAkJKGZvdXQt PmRvcHQtPmJpbmFyeV91cGdyYWRlICYmIGZvdXQtPnJlbW90ZVZlcnNpb24gPCAxMjAwMDAgJiYK IAkJIHRiaW5mby0+ZG9iai5jYXRJZC5vaWQgPT0gTGFyZ2VPYmplY3RNZXRhZGF0YVJlbGF0aW9u SWQpKQogCXsKQEAgLTI0MTQsOSArMjQyNCwzNyBAQCBkdW1wVGFibGVEYXRhX2NvcHkoQXJjaGl2 ZSAqZm91dCwgY29uc3Qgdm9pZCAqZGNvbnRleHQpCiAJCWVsc2UKIAkJCWFwcGVuZFBRRXhwQnVm ZmVyU3RyKHEsICIqICIpOwogCi0JCWFwcGVuZFBRRXhwQnVmZmVyKHEsICJGUk9NICVzICVzKSBU TyBzdGRvdXQ7IiwKKwkJYXBwZW5kUFFFeHBCdWZmZXIocSwgIkZST00gJXMgJXMiLAogCQkJCQkJ ICBmbXRRdWFsaWZpZWREdW1wYWJsZSh0YmluZm8pLAogCQkJCQkJICB0ZGluZm8tPmZpbHRlcmNv bmQgPyB0ZGluZm8tPmZpbHRlcmNvbmQgOiAiIik7CisJCS8qIElmIGl0J3MgYSBzZWdtZW50LCB3 ZSBuZWVkIHRvIGFkZCBhIGZpbHRlciBjb25kaXRpb24gdG8gc2VsZWN0IHRoZQorCQkgKiByaWdo dCBwYWdlIHJhbmdlIAorCQkgKiAtIGZvciBmaXJzdCBzZWdtZW50IHdlIGFkZCAiY3RpZCA8IChl bmRQYWdlKzEsIDApIiAKKwkJICogICBmaXJzdCBzZWdtZW50IGlzIHRoZSBvbmUgd2l0aCBzdGFy dFBhZ2UgPT0gMAorCQkgKiAtIGZvciBsYXN0IHNlZ21lbnQgd2UgYWRkICJjdGlkID49IChzdGFy dFBhZ2UsIDEpIgorCQkgKiAgIGxhc3Qgc2VnbWVudCBpcyB0aGUgb25lIHdpdGggZW5kUGFnZSA9 PSBJbnZhbGlkQmxvY2tOdW1iZXIKKwkJICogICB3ZSBsZWF2ZSB0byB1cHBlciBib3VuZCBvcGVu IGZvciB0aGUgY2FzZSB3aGVyZSBtb3JlIHBhZ2VzIAorCQkgKiAgIHdlcmUgYWRkZWQgYWZ0ZXIg d2UgbWVhc3VyZWQgCisJCSAqIC0gZm9yIG1pZGRsZSBzZWdtZW50cyB3ZSBhZGQgCisJCSAqICAg ImN0aWQgPj0gKHN0YXJ0UGFnZSwgMSkgQU5EIGN0aWQgPCAoZW5kUGFnZSsxLCAwKSIKKwkJICoK KwkJICogImN0aWQgPCAoZW5kUGFnZSsxLCAwKSIgaW5zdGVhZCBvZiAiY3RpZCA8PSAoZW5kUGFn ZSwgbWF4dHVwbGUpIgorCQkgKiB3YXMgY2hvc2VuIGFzIHJhbmdlIGVuZCBzbyB0aGF0IHdlIGRv IG5vdCBoYXZlIHRvIGVzdGltYXRlIHRoZSBtYXh0dXBsZQorCQkgKiAKKwkJICovCisJCWlmIChp c19zZWdtZW50KHRkaW5mbykpCisJCXsKKwkJCWFwcGVuZFBRRXhwQnVmZmVyU3RyKHEsIHRkaW5m by0+ZmlsdGVyY29uZD8iIEFORCAiOiIgV0hFUkUgIik7CisJCQlpZih0ZGluZm8tPnN0YXJ0UGFn ZSA9PSAwKQorCQkJCWFwcGVuZFBRRXhwQnVmZmVyKHEsICJjdGlkIDwgJygldSwwKSciLCB0ZGlu Zm8tPmVuZFBhZ2UrMSk7CQkJCisJCQllbHNlIGlmKHRkaW5mby0+ZW5kUGFnZSAhPSBJbnZhbGlk QmxvY2tOdW1iZXIpCisJCQkJYXBwZW5kUFFFeHBCdWZmZXIocSwgImN0aWQgPj0gJygldSwxKScg QU5EIGN0aWQgPCAnKCV1LDApJyIsCisJCQkJCQkJCSB0ZGluZm8tPnN0YXJ0UGFnZSwgdGRpbmZv LT5lbmRQYWdlKzEpOworCQkJZWxzZQorCQkJCWFwcGVuZFBRRXhwQnVmZmVyKHEsICJjdGlkID49 ICcoJXUsMSknIiwgdGRpbmZvLT5zdGFydFBhZ2UpOworCQl9CisKKwkJYXBwZW5kUFFFeHBCdWZm ZXIocSwgIikgVE8gc3Rkb3V0OyIpOwogCX0KIAllbHNlCiAJewpAQCAtMjQyNCw2ICsyNDYyLDEw IEBAIGR1bXBUYWJsZURhdGFfY29weShBcmNoaXZlICpmb3V0LCBjb25zdCB2b2lkICpkY29udGV4 dCkKIAkJCQkJCSAgZm10UXVhbGlmaWVkRHVtcGFibGUodGJpbmZvKSwKIAkJCQkJCSAgY29sdW1u X2xpc3QpOwogCX0KKworCWlmIChpc19zZWdtZW50KHRkaW5mbykpCisJCXBnX2xvZ19kZWJ1Zygi Q0hVTktJTkc6IGRhdGEgcXVlcnk6ICVzIiwgcS0+ZGF0YSk7CisJCiAJcmVzID0gRXhlY3V0ZVNx bFF1ZXJ5KGZvdXQsIHEtPmRhdGEsIFBHUkVTX0NPUFlfT1VUKTsKIAlQUWNsZWFyKHJlcyk7CiAJ ZGVzdHJveVBRRXhwQnVmZmVyKGNsaXN0QnVmKTsKQEAgLTI5MTksNDIgKzI5NjEsODkgQEAgZHVt cFRhYmxlRGF0YShBcmNoaXZlICpmb3V0LCBjb25zdCBUYWJsZURhdGFJbmZvICp0ZGluZm8pCiAJ ewogCQlUb2NFbnRyeSAgICp0ZTsKIAotCQl0ZSA9IEFyY2hpdmVFbnRyeShmb3V0LCB0ZGluZm8t PmRvYmouY2F0SWQsIHRkaW5mby0+ZG9iai5kdW1wSWQsCi0JCQkJCQkgIEFSQ0hJVkVfT1BUUygu dGFnID0gdGJpbmZvLT5kb2JqLm5hbWUsCi0JCQkJCQkJCQkgICAubmFtZXNwYWNlID0gdGJpbmZv LT5kb2JqLm5hbWVzcGFjZS0+ZG9iai5uYW1lLAotCQkJCQkJCQkJICAgLm93bmVyID0gdGJpbmZv LT5yb2xuYW1lLAotCQkJCQkJCQkJICAgLmRlc2NyaXB0aW9uID0gIlRBQkxFIERBVEEiLAotCQkJ CQkJCQkJICAgLnNlY3Rpb24gPSBTRUNUSU9OX0RBVEEsCi0JCQkJCQkJCQkgICAuY3JlYXRlU3Rt dCA9IHRkRGVmbiwKLQkJCQkJCQkJCSAgIC5jb3B5U3RtdCA9IGNvcHlTdG10LAotCQkJCQkJCQkJ ICAgLmRlcHMgPSAmKHRiaW5mby0+ZG9iai5kdW1wSWQpLAotCQkJCQkJCQkJICAgLm5EZXBzID0g MSwKLQkJCQkJCQkJCSAgIC5kdW1wRm4gPSBkdW1wRm4sCi0JCQkJCQkJCQkgICAuZHVtcEFyZyA9 IHRkaW5mbykpOwotCi0JCS8qCi0JCSAqIFNldCB0aGUgVG9jRW50cnkncyBkYXRhTGVuZ3RoIGlu IGNhc2Ugd2UgYXJlIGRvaW5nIGEgcGFyYWxsZWwgZHVtcAotCQkgKiBhbmQgd2FudCB0byBvcmRl ciBkdW1wIGpvYnMgYnkgdGFibGUgc2l6ZS4gIFdlIGNob29zZSB0byBtZWFzdXJlCi0JCSAqIGRh dGFMZW5ndGggaW4gdGFibGUgcGFnZXMgKGluY2x1ZGluZyBUT0FTVCBwYWdlcykgZHVyaW5nIGR1 bXAsIHNvCi0JCSAqIG5vIHNjYWxpbmcgaXMgbmVlZGVkLgotCQkgKgotCQkgKiBIb3dldmVyLCBy ZWxwYWdlcyBpcyBkZWNsYXJlZCBhcyAiaW50ZWdlciIgaW4gcGdfY2xhc3MsIGFuZCBoZW5jZQot CQkgKiBhbHNvIGluIFRhYmxlSW5mbywgYnV0IGl0J3MgcmVhbGx5IEJsb2NrTnVtYmVyIGEvay9h IHVuc2lnbmVkIGludC4KLQkJICogQ2FzdCBzbyB0aGF0IHdlIGdldCB0aGUgcmlnaHQgaW50ZXJw cmV0YXRpb24gb2YgdGFibGUgc2l6ZXMKLQkJICogZXhjZWVkaW5nIElOVF9NQVggcGFnZXMuCisJ CS8qIGRhdGEgY2h1bmtpbmcgd29ya3Mgb2ZmIHJlbHBhZ2VzLCB3aGljaCBhcmUgY29tcHV0ZWQg ZXhhY3RseSB1c2luZworCQkgKiBwZ19yZWxhdGlvbl9zaXplKCkgd2hlbiAtLW1heC10YWJsZS1z ZWdtZW50LXBhZ2VzIHdhcyBzZXQKKwkJICogCisJCSAqIFdlIGFsc28gZG9uJ3QgY2h1bmsgaWYg dGFibGUgYWNjZXNzIG1ldGhvZCBpcyBub3QgImhlYXAiCisJCSAqIFRPRE86IHdlIG1heSBhZGQg Y2h1bmtpbmcgZm9yIG90aGVyIGFjY2VzcyBtZXRob2RzIGxhdGVyLCBtYXliZSAKKwkJICogYmFz ZWQgb24gcHJpbWFyeSBrZXkgdHJhbmdlcwogCQkgKi8KLQkJdGUtPmRhdGFMZW5ndGggPSAoQmxv Y2tOdW1iZXIpIHRiaW5mby0+cmVscGFnZXM7Ci0JCXRlLT5kYXRhTGVuZ3RoICs9IChCbG9ja051 bWJlcikgdGJpbmZvLT50b2FzdHBhZ2VzOworCQlpZiAodGJpbmZvLT5yZWxwYWdlcyA8PSBkb3B0 LT5tYXhfdGFibGVfc2VnbWVudF9wYWdlcyB8fCAKKwkJCXN0cmNtcCh0YmluZm8tPmFtbmFtZSwg ImhlYXAiKSAhPSAwKQorCQl7CisJCQl0ZSA9IEFyY2hpdmVFbnRyeShmb3V0LCB0ZGluZm8tPmRv YmouY2F0SWQsIHRkaW5mby0+ZG9iai5kdW1wSWQsCisJCQkJCQkJQVJDSElWRV9PUFRTKC50YWcg PSB0YmluZm8tPmRvYmoubmFtZSwKKwkJCQkJCQkJCQkubmFtZXNwYWNlID0gdGJpbmZvLT5kb2Jq Lm5hbWVzcGFjZS0+ZG9iai5uYW1lLAorCQkJCQkJCQkJCS5vd25lciA9IHRiaW5mby0+cm9sbmFt ZSwKKwkJCQkJCQkJCQkuZGVzY3JpcHRpb24gPSAiVEFCTEUgREFUQSIsCisJCQkJCQkJCQkJLnNl Y3Rpb24gPSBTRUNUSU9OX0RBVEEsCisJCQkJCQkJCQkJLmNyZWF0ZVN0bXQgPSB0ZERlZm4sCisJ CQkJCQkJCQkJLmNvcHlTdG10ID0gY29weVN0bXQsCisJCQkJCQkJCQkJLmRlcHMgPSAmKHRiaW5m by0+ZG9iai5kdW1wSWQpLAorCQkJCQkJCQkJCS5uRGVwcyA9IDEsCisJCQkJCQkJCQkJLmR1bXBG biA9IGR1bXBGbiwKKwkJCQkJCQkJCQkuZHVtcEFyZyA9IHRkaW5mbykpOwogCi0JCS8qCi0JCSAq IElmIHBnb2ZmX3QgaXMgb25seSAzMiBiaXRzIHdpZGUsIHRoZSBhYm92ZSByZWZpbmVtZW50IGlz IHVzZWxlc3MsCi0JCSAqIGFuZCBpbnN0ZWFkIHdlJ2QgYmV0dGVyIHdvcnJ5IGFib3V0IGludGVn ZXIgb3ZlcmZsb3cuICBDbGFtcCB0bwotCQkgKiBJTlRfTUFYIGlmIHRoZSBjb3JyZWN0IHJlc3Vs dCBleGNlZWRzIHRoYXQuCi0JCSAqLwotCQlpZiAoc2l6ZW9mKHRlLT5kYXRhTGVuZ3RoKSA9PSA0 ICYmCi0JCQkodGJpbmZvLT5yZWxwYWdlcyA8IDAgfHwgdGJpbmZvLT50b2FzdHBhZ2VzIDwgMCB8 fAotCQkJIHRlLT5kYXRhTGVuZ3RoIDwgMCkpCi0JCQl0ZS0+ZGF0YUxlbmd0aCA9IElOVF9NQVg7 CisJCQkvKgorCQkJICogU2V0IHRoZSBUb2NFbnRyeSdzIGRhdGFMZW5ndGggaW4gY2FzZSB3ZSBh cmUgZG9pbmcgYSBwYXJhbGxlbCBkdW1wCisJCQkgKiBhbmQgd2FudCB0byBvcmRlciBkdW1wIGpv YnMgYnkgdGFibGUgc2l6ZS4gIFdlIGNob29zZSB0byBtZWFzdXJlCisJCQkgKiBkYXRhTGVuZ3Ro IGluIHRhYmxlIHBhZ2VzIChpbmNsdWRpbmcgVE9BU1QgcGFnZXMpIGR1cmluZyBkdW1wLCBzbwor CQkJICogbm8gc2NhbGluZyBpcyBuZWVkZWQuCisJCQkgKgorCQkJICogV2hpbGUgcGdfY2xhc3Mu cmVscGFnZXMgd2hpY2ggc3RvcmVzIEJsb2NrTnVtYmVyLCBhL2svYSB1bnNpZ25lZCBpbnQsCisJ CQkgKiBpcyBkZWNsYXJlZCBhcyAiaW50ZWdlciIgd2UgY29udmVydCBpdCBiYWNrIGFuZCBzdG9y ZSBpdCBhcyAKKwkJCSAqIEJsb2NrTnVtYmVyIGluIFRhYmxlSW5mby4KKwkJCSAqIEFuZCBkYXRh TGVuZ2h0IGlzIHBnb2ZmX3QgKGxvbmcgaW50KSBzbyBkb2VzIG5vdyBvdmVyZmxvdyBmb3IKKwkJ CSAqIDIgeCBVSU5UMzJfTUFYIAorCQkJICovCisJCQl0ZS0+ZGF0YUxlbmd0aCA9IHRiaW5mby0+ cmVscGFnZXM7CisJCQl0ZS0+ZGF0YUxlbmd0aCArPSB0YmluZm8tPnRvYXN0cGFnZXM7CisJCX0K KwkJZWxzZQorCQl7CisJCQl1aW50NjQgY3VycmVudF9jaHVua19zdGFydCA9IDA7CisJCQlQUUV4 cEJ1ZmZlciBjaHVua19kZXNjID0gY3JlYXRlUFFFeHBCdWZmZXIoKTsKKworCQkJd2hpbGUgKGN1 cnJlbnRfY2h1bmtfc3RhcnQgPCB0YmluZm8tPnJlbHBhZ2VzKQorCQkJeworCQkJCVRhYmxlRGF0 YUluZm8gKmNodW5rX3RkaW5mbyA9IChUYWJsZURhdGFJbmZvICopIHBnX21hbGxvYyhzaXplb2Yo VGFibGVEYXRhSW5mbykpOworCisJCQkJbWVtY3B5KGNodW5rX3RkaW5mbywgdGRpbmZvLCBzaXpl b2YoVGFibGVEYXRhSW5mbykpOworCQkJCUFzc2lnbkR1bXBJZCgmY2h1bmtfdGRpbmZvLT5kb2Jq KTsKKwkJCQlhZGRPYmplY3REZXBlbmRlbmN5KCZjaHVua190ZGluZm8tPmRvYmosIHRiaW5mby0+ ZG9iai5kdW1wSWQpOworCQkJCWNodW5rX3RkaW5mby0+c3RhcnRQYWdlID0gKEJsb2NrTnVtYmVy KSBjdXJyZW50X2NodW5rX3N0YXJ0OworCQkJCWNodW5rX3RkaW5mby0+ZW5kUGFnZSA9IGNodW5r X3RkaW5mby0+c3RhcnRQYWdlICsgZG9wdC0+bWF4X3RhYmxlX3NlZ21lbnRfcGFnZXMgLSAxOwor CQkJCQorCQkJCWN1cnJlbnRfY2h1bmtfc3RhcnQgKz0gZG9wdC0+bWF4X3RhYmxlX3NlZ21lbnRf cGFnZXM7CisJCQkJaWYgKGN1cnJlbnRfY2h1bmtfc3RhcnQgPj0gdGJpbmZvLT5yZWxwYWdlcykK KwkJCQkJY2h1bmtfdGRpbmZvLT5lbmRQYWdlID0gSW52YWxpZEJsb2NrTnVtYmVyOyAvKiBsYXN0 IGNodW5rIGlzIGZvciAiYWxsIHRoZSByZXN0IiAqLworCisJCQkJcHJpbnRmUFFFeHBCdWZmZXIo Y2h1bmtfZGVzYywgIlRBQkxFIERBVEEgKHBhZ2VzICV1OiV1KSIsIGNodW5rX3RkaW5mby0+c3Rh cnRQYWdlLCBjaHVua190ZGluZm8tPmVuZFBhZ2UpOworCisJCQkJdGUgPSBBcmNoaXZlRW50cnko Zm91dCwgY2h1bmtfdGRpbmZvLT5kb2JqLmNhdElkLCBjaHVua190ZGluZm8tPmRvYmouZHVtcElk LAorCQkJCQkJCUFSQ0hJVkVfT1BUUygudGFnID0gdGJpbmZvLT5kb2JqLm5hbWUsCisJCQkJCQkJ CQkJLm5hbWVzcGFjZSA9IHRiaW5mby0+ZG9iai5uYW1lc3BhY2UtPmRvYmoubmFtZSwKKwkJCQkJ CQkJCQkub3duZXIgPSB0YmluZm8tPnJvbG5hbWUsCisJCQkJCQkJCQkJLmRlc2NyaXB0aW9uID0g Y2h1bmtfZGVzYy0+ZGF0YSwKKwkJCQkJCQkJCQkuc2VjdGlvbiA9IFNFQ1RJT05fREFUQSwKKwkJ CQkJCQkJCQkuY3JlYXRlU3RtdCA9IHRkRGVmbiwKKwkJCQkJCQkJCQkuY29weVN0bXQgPSBjb3B5 U3RtdCwKKwkJCQkJCQkJCQkuZGVwcyA9ICYodGJpbmZvLT5kb2JqLmR1bXBJZCksCisJCQkJCQkJ CQkJLm5EZXBzID0gMSwKKwkJCQkJCQkJCQkuZHVtcEZuID0gZHVtcEZuLAorCQkJCQkJCQkJCS5k dW1wQXJnID0gY2h1bmtfdGRpbmZvKSk7CisKKwkJCQlpZihjaHVua190ZGluZm8tPmVuZFBhZ2Ug PT0gSW52YWxpZEJsb2NrTnVtYmVyKQorCQkJCQl0ZS0+ZGF0YUxlbmd0aCA9IHRiaW5mby0+cmVs cGFnZXMgLSBjaHVua190ZGluZm8tPnN0YXJ0UGFnZTsKKwkJCQllbHNlCisJCQkJCXRlLT5kYXRh TGVuZ3RoID0gZG9wdC0+bWF4X3RhYmxlX3NlZ21lbnRfcGFnZXM7CisJCQkJLyogbGV0J3MgYXNz dW1lIHRvYXN0IHBhZ2VzIGRpc3RyaWJ1dGUgZXZlbmx5IGFtb25nIGNodW5rcyAqLworCQkJCWlm KHRiaW5mby0+cmVscGFnZXMpCisJCQkJCXRlLT5kYXRhTGVuZ3RoICs9IHRlLT5kYXRhTGVuZ3Ro ICogdGJpbmZvLT50b2FzdHBhZ2VzIC8gdGJpbmZvLT5yZWxwYWdlczsKKwkJCX0KKworCQkJZGVz dHJveVBRRXhwQnVmZmVyKGNodW5rX2Rlc2MpOworCQl9CiAJfQogCiAJZGVzdHJveVBRRXhwQnVm ZmVyKGNvcHlCdWYpOwpAQCAtMzA4MSw2ICszMTcwLDggQEAgbWFrZVRhYmxlRGF0YUluZm8oRHVt cE9wdGlvbnMgKmRvcHQsIFRhYmxlSW5mbyAqdGJpbmZvKQogCXRkaW5mby0+ZG9iai5uYW1lc3Bh Y2UgPSB0YmluZm8tPmRvYmoubmFtZXNwYWNlOwogCXRkaW5mby0+dGR0YWJsZSA9IHRiaW5mbzsK IAl0ZGluZm8tPmZpbHRlcmNvbmQgPSBOVUxMOwkvKiBtaWdodCBnZXQgc2V0IGxhdGVyICovCisJ dGRpbmZvLT5zdGFydFBhZ2UgPSBJbnZhbGlkQmxvY2tOdW1iZXI7IC8qIHdlIHVzZSB0aGlzIGFz IGluZGljYXRpb24gdGhhdCBubyBjaHVua2luZyBpcyBuZWVkZWQgKi8KKwl0ZGluZm8tPmVuZFBh Z2UgPSBJbnZhbGlkQmxvY2tOdW1iZXI7CiAJYWRkT2JqZWN0RGVwZW5kZW5jeSgmdGRpbmZvLT5k b2JqLCB0YmluZm8tPmRvYmouZHVtcElkKTsKIAogCS8qIEEgVGFibGVEYXRhSW5mbyBjb250YWlu cyBkYXRhLCBvZiBjb3Vyc2UgKi8KQEAgLTczNDcsOCArNzQzOCwxNiBAQCBnZXRUYWJsZXMoQXJj aGl2ZSAqZm91dCwgaW50ICpudW1UYWJsZXMpCiAJCQkJCQkgImMucmVsbmFtZXNwYWNlLCBjLnJl bGtpbmQsIGMucmVsdHlwZSwgIgogCQkJCQkJICJjLnJlbG93bmVyLCAiCiAJCQkJCQkgImMucmVs Y2hlY2tzLCAiCi0JCQkJCQkgImMucmVsaGFzaW5kZXgsIGMucmVsaGFzcnVsZXMsIGMucmVscGFn ZXMsICIKLQkJCQkJCSAiYy5yZWx0dXBsZXMsIGMucmVsYWxsdmlzaWJsZSwgIik7CisJCQkJCQkg ImMucmVsaGFzaW5kZXgsIGMucmVsaGFzcnVsZXMsICIpOworCisJLyogZmV0Y2ggY3VycmVudCBy ZWxhdGlvbiBzaXplIGlmIGNodW5raW5nIGlzIHJlcXVlc3RlZCAqLworCWlmKGRvcHQtPm1heF90 YWJsZV9zZWdtZW50X3BhZ2VzICE9IEludmFsaWRCbG9ja051bWJlcikKKwkJYXBwZW5kUFFFeHBC dWZmZXJTdHIocXVlcnksICJwZ19yZWxhdGlvbl9zaXplKGMub2lkKS9jdXJyZW50X3NldHRpbmco J2Jsb2NrX3NpemUnKTo6aW50IEFTIHJlbHBhZ2VzLCAiKTsKKwllbHNlCisJCS8qIHBnX2NsYXNz LnJlbHBhZ2VzIHN0b3JlcyBCbG9ja051bWJlciAodWludDMyKSBpbiBhbiBpbnQgZmllbGQsIGNv bnZlcnQgdG8gb2lkIHRvIGdldCB1bnNpZ25lZCBpbnQgb3V0ICovCisJCWFwcGVuZFBRRXhwQnVm ZmVyU3RyKHF1ZXJ5LCAiYy5yZWxwYWdlczo6b2lkLCAiKTsKKworCWFwcGVuZFBRRXhwQnVmZmVy U3RyKHF1ZXJ5LCAiYy5yZWx0dXBsZXMsIGMucmVsYWxsdmlzaWJsZSwgIik7CiAKIAlpZiAoZm91 dC0+cmVtb3RlVmVyc2lvbiA+PSAxODAwMDApCiAJCWFwcGVuZFBRRXhwQnVmZmVyU3RyKHF1ZXJ5 LCAiYy5yZWxhbGxmcm96ZW4sICIpOwpAQCAtNzU4OSw3ICs3Njg4LDcgQEAgZ2V0VGFibGVzKEFy Y2hpdmUgKmZvdXQsIGludCAqbnVtVGFibGVzKQogCQl0YmxpbmZvW2ldLm5jaGVjayA9IGF0b2ko UFFnZXR2YWx1ZShyZXMsIGksIGlfcmVsY2hlY2tzKSk7CiAJCXRibGluZm9baV0uaGFzaW5kZXgg PSAoc3RyY21wKFBRZ2V0dmFsdWUocmVzLCBpLCBpX3JlbGhhc2luZGV4KSwgInQiKSA9PSAwKTsK IAkJdGJsaW5mb1tpXS5oYXNydWxlcyA9IChzdHJjbXAoUFFnZXR2YWx1ZShyZXMsIGksIGlfcmVs aGFzcnVsZXMpLCAidCIpID09IDApOwotCQl0YmxpbmZvW2ldLnJlbHBhZ2VzID0gYXRvaShQUWdl dHZhbHVlKHJlcywgaSwgaV9yZWxwYWdlcykpOworCQl0YmxpbmZvW2ldLnJlbHBhZ2VzID0gc3Ry dG91bChQUWdldHZhbHVlKHJlcywgaSwgaV9yZWxwYWdlcyksIE5VTEwsIDEwKTsKIAkJaWYgKFBR Z2V0aXNudWxsKHJlcywgaSwgaV90b2FzdHBhZ2VzKSkKIAkJCXRibGluZm9baV0udG9hc3RwYWdl cyA9IDA7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfZHVtcC9wZ19kdW1wLmggYi9z cmMvYmluL3BnX2R1bXAvcGdfZHVtcC5oCmluZGV4IDVhNjcyNmQ4YjEyLi44NGU2ODJkNTg1ZiAx MDA2NDQKLS0tIGEvc3JjL2Jpbi9wZ19kdW1wL3BnX2R1bXAuaAorKysgYi9zcmMvYmluL3BnX2R1 bXAvcGdfZHVtcC5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlICJwZ19iYWNrdXAuaCIK ICNpbmNsdWRlICJjYXRhbG9nL3BnX3B1YmxpY2F0aW9uX2QuaCIKKyNpbmNsdWRlICJzdG9yYWdl L2Jsb2NrLmgiCiAKIAogI2RlZmluZSBvaWRjbXAoeCx5KSAoICgoeCkgPCAoeSkgPyAtMSA6ICgo eCkgPiAoeSkpID8gIDEgOiAwKSApCkBAIC0zMzUsNyArMzM2LDExIEBAIHR5cGVkZWYgc3RydWN0 IF90YWJsZUluZm8KIAlPaWQJCQlvd25pbmdfdGFiOwkJLyogT0lEIG9mIHRhYmxlIG93bmluZyBz ZXF1ZW5jZSAqLwogCWludAkJCW93bmluZ19jb2w7CQkvKiBhdHRyICMgb2YgY29sdW1uIG93bmlu ZyBzZXF1ZW5jZSAqLwogCWJvb2wJCWlzX2lkZW50aXR5X3NlcXVlbmNlOwotCWludDMyCQlyZWxw YWdlczsJCS8qIHRhYmxlJ3Mgc2l6ZSBpbiBwYWdlcyAoZnJvbSBwZ19jbGFzcykgKi8KKwlCbG9j a051bWJlcglyZWxwYWdlczsJCS8qIHRhYmxlJ3Mgc2l6ZSBpbiBwYWdlcyAoZnJvbSBwZ19jbGFz cykgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbnZlcnRlZCB0byB1bnNpZ25l ZCBpbnRlZ2VyCisJCQkJCQkJCSAqIHdoZW4gLS1tYXgtdGFibGUtc2VnbWVudC1wYWdlcyBpcyBz ZXQKKwkJCQkJCQkJICogdGhlIGNvbXB1dGVkIGZyb20gcGdfcmVsYXRpb25fc2l6ZSgpCisJICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCWludAkJCXRvYXN0cGFnZXM7CQkvKiB0b2Fz dCB0YWJsZSdzIHNpemUgaW4gcGFnZXMsIGlmIGFueSAqLwogCiAJYm9vbAkJaW50ZXJlc3Rpbmc7 CS8qIHRydWUgaWYgbmVlZCB0byBjb2xsZWN0IG1vcmUgZGF0YSAqLwpAQCAtNDEzLDggKzQxOCwy MSBAQCB0eXBlZGVmIHN0cnVjdCBfdGFibGVEYXRhSW5mbwogCUR1bXBhYmxlT2JqZWN0IGRvYmo7 CiAJVGFibGVJbmZvICAqdGR0YWJsZTsJCS8qIGxpbmsgdG8gdGFibGUgdG8gZHVtcCAqLwogCWNo YXIJICAgKmZpbHRlcmNvbmQ7CQkvKiBXSEVSRSBjb25kaXRpb24gdG8gbGltaXQgcm93cyBkdW1w ZWQgKi8KKwkvKiBzdGFydFBhZ2UgYW5kIGVuZFBhZ2UgdG8gc3VwcG9ydCBzZWdtZW50ZWQgZHVt cCAqLworCUJsb2NrTnVtYmVyCXN0YXJ0UGFnZTsJCS8qIEFzIHdlIGFsd2F5cyBrbm93IHRoZSBs b3dlc3Qgc2VnbWVudCBwYWdlCisJCQkJCQkJCSAqIG51bWJlciB3ZSBjYW4gdXNlIEludmFsaWRC bG9ja051bWJlciBoZXJlCisJCQkJCQkJCSAqIHRvIHJlY29nbml6ZSBubyBzZWdtZW50aW5nIGNh c2UuCisJCQkJCQkJCSAqIFdoZW4gMCBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgZmlyc3QKKwkJCQkJ CQkJICogc2VnbWVudCB3ZSBjYW4gb21pdCBpbiByYW5nZSBxdWVyeSAqLworCUJsb2NrTnVtYmVy CWVuZFBhZ2U7CQkvKiBsYXN0IHBhZ2UgaW4gc2VnbWVudCBmb3IgcGFnZS1yYW5nZSBkdW1wLAor CSAgICAgICAgICAgICAgICAgICAgCQkgKiBzdGFydFBhZ2UrbWF4X3RhYmxlX3NlZ21lbnRfcGFn ZXMtMSBmb3IgCisJCQkJCQkJCSAqIG1vc3Qgc2VnbWVudHMsIGJ1dCBJbnZhbGlkQmxvY2tOdW1i ZXIgZm9yCisJCQkJCQkJCSAqIHRoZSBsYXN0IG9uZSB0byBpbmRpY2F0ZSBvcGVuIHJhbmdlCisJ CQkJCQkJCSAqLwogfSBUYWJsZURhdGFJbmZvOwogCisjZGVmaW5lIGlzX3NlZ21lbnQodGRpcHRy KSAoKHRkaXB0ciktPnN0YXJ0UGFnZSAhPSBJbnZhbGlkQmxvY2tOdW1iZXIpCisKIHR5cGVkZWYg c3RydWN0IF9pbmR4SW5mbwogewogCUR1bXBhYmxlT2JqZWN0IGRvYmo7CkBAIC00NDksNyArNDY3 LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgX3JlbFN0YXRzSW5mbwogewogCUR1bXBhYmxlT2JqZWN0IGRv Ymo7CiAJT2lkCQkJcmVsaWQ7Ci0JaW50MzIJCXJlbHBhZ2VzOworCUJsb2NrTnVtYmVyCXJlbHBh Z2VzOwogCWNoYXIJICAgKnJlbHR1cGxlczsKIAlpbnQzMgkJcmVsYWxsdmlzaWJsZTsKIAlpbnQz MgkJcmVsYWxsZnJvemVuOwpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19kdW1wL3QvMDA0X3BnX2R1 bXBfcGFyYWxsZWwucGwgYi9zcmMvYmluL3BnX2R1bXAvdC8wMDRfcGdfZHVtcF9wYXJhbGxlbC5w bAppbmRleCA3MzhmMzRiMWMxYi4uNGYzNWFlZWQ5YjkgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdf ZHVtcC90LzAwNF9wZ19kdW1wX3BhcmFsbGVsLnBsCisrKyBiL3NyYy9iaW4vcGdfZHVtcC90LzAw NF9wZ19kdW1wX3BhcmFsbGVsLnBsCkBAIC0xMSw2ICsxMSw3IEBAIHVzZSBUZXN0OjpNb3JlOwog bXkgJGRibmFtZTEgPSAncmVncmVzc2lvbl9zcmMnOwogbXkgJGRibmFtZTIgPSAncmVncmVzc2lv bl9kZXN0MSc7CiBteSAkZGJuYW1lMyA9ICdyZWdyZXNzaW9uX2Rlc3QyJzsKK215ICRkYm5hbWU0 ID0gJ3JlZ3Jlc3Npb25fZGVzdDMnOwogCiBteSAkbm9kZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNs dXN0ZXItPm5ldygnbWFpbicpOwogJG5vZGUtPmluaXQ7CkBAIC0yMSw2ICsyMiw3IEBAIG15ICRi YWNrdXBkaXIgPSAkbm9kZS0+YmFja3VwX2RpcjsKICRub2RlLT5ydW5fbG9nKFsgJ2NyZWF0ZWRi JywgJGRibmFtZTEgXSk7CiAkbm9kZS0+cnVuX2xvZyhbICdjcmVhdGVkYicsICRkYm5hbWUyIF0p OwogJG5vZGUtPnJ1bl9sb2coWyAnY3JlYXRlZGInLCAkZGJuYW1lMyBdKTsKKyRub2RlLT5ydW5f bG9nKFsgJ2NyZWF0ZWRiJywgJGRibmFtZTQgXSk7CiAKICRub2RlLT5zYWZlX3BzcWwoCiAJJGRi bmFtZTEsCkBAIC04Nyw0ICs4OSwzMyBAQCAkbm9kZS0+Y29tbWFuZF9vaygKIAldLAogCSdwYXJh bGxlbCByZXN0b3JlIGFzIGluc2VydHMnKTsKIAorJG5vZGUtPmNvbW1hbmRfb2soCisJWworCQkn cGdfZHVtcCcsCisJCSctLWZvcm1hdCcgPT4gJ2RpcmVjdG9yeScsCisJCSctLW1heC10YWJsZS1z ZWdtZW50LXBhZ2VzJyA9PiAyLAorCQknLS1uby1zeW5jJywKKwkJJy0tam9icycgPT4gMiwKKwkJ Jy0tZmlsZScgPT4gIiRiYWNrdXBkaXIvZHVtcDMiLAorCQkkbm9kZS0+Y29ubnN0cigkZGJuYW1l MSksCisJXSwKKwkncGFyYWxsZWwgZHVtcCB3aXRoIGNodW5rcyBvZiB0d28gaGVhcCBwYWdlcycp OworCiskbm9kZS0+Y29tbWFuZF9vaygKKwlbCisJCSdwZ19yZXN0b3JlJywgJy0tdmVyYm9zZScs CisJCSctLWRibmFtZScgPT4gJG5vZGUtPmNvbm5zdHIoJGRibmFtZTQpLAorCQknLS1qb2JzJyA9 PiAzLAorCQkiJGJhY2t1cGRpci9kdW1wMyIsCisJXSwKKwkncGFyYWxsZWwgcmVzdG9yZSB3aXRo IGNodW5rcyBvZiB0d28gaGVhcCBwYWdlcycpOworCitteSAkdGFibGUgPSAndHBsYWluJzsKK215 ICR0YWJsZWhhc2hfcXVlcnkgPSAiU0VMRUNUICckdGFibGUnLCBzdW0oaGFzaHRleHQodDo6dGV4 dCkpLCBjb3VudCgqKSBGUk9NICR0YWJsZSBBUyB0IjsKKworbXkgJHJlc3VsdF8xID0gJG5vZGUt PnNhZmVfcHNxbCgkZGJuYW1lMSwgJHRhYmxlaGFzaF9xdWVyeSk7CitteSAkcmVzdWx0XzQgPSAk bm9kZS0+c2FmZV9wc3FsKCRkYm5hbWU0LCAkdGFibGVoYXNoX3F1ZXJ5KTsKKworaXMoJHJlc3Vs dF80LCAkcmVzdWx0XzEsICJIYXNoIGNoZWNrIGZvciAkdGFibGU6IHJlc3RvcmVkIGRiICgkcmVz dWx0XzQpIHZzIG9yaWdpbmFsIGRiICgkcmVzdWx0XzEpIik7CisKIGRvbmVfdGVzdGluZygpOwpk aWZmIC0tZ2l0IGEvc3JjL2ZlX3V0aWxzL29wdGlvbl91dGlscy5jIGIvc3JjL2ZlX3V0aWxzL29w dGlvbl91dGlscy5jCmluZGV4IDhkMDY1OWMxMTY0Li5hNTE2ZDhjODZhOSAxMDA2NDQKLS0tIGEv c3JjL2ZlX3V0aWxzL29wdGlvbl91dGlscy5jCisrKyBiL3NyYy9mZV91dGlscy9vcHRpb25fdXRp bHMuYwpAQCAtODMsNiArODMsNjEgQEAgb3B0aW9uX3BhcnNlX2ludChjb25zdCBjaGFyICpvcHRh cmcsIGNvbnN0IGNoYXIgKm9wdG5hbWUsCiAJcmV0dXJuIHRydWU7CiB9CiAKKy8qCisgKiBvcHRp b25fcGFyc2VfdWludDMyCisgKgorICogUGFyc2UgdW5zaWduZWQgaW50ZWdlciB2YWx1ZSBmb3Ig YW4gb3B0aW9uLiAgSWYgdGhlIHBhcnNpbmcgaXMgc3VjY2Vzc2Z1bCwKKyAqIHJldHVybnMgdHJ1 ZSBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gKnJlc3VsdCBpZiB0aGF0J3MgZ2l2ZW47CisgKiBp ZiBwYXJzaW5nIGZhaWxzLCByZXR1cm5zIGZhbHNlLgorICovCitib29sCitvcHRpb25fcGFyc2Vf dWludDMyKGNvbnN0IGNoYXIgKm9wdGFyZywgY29uc3QgY2hhciAqb3B0bmFtZSwKKwkJCQkgdWlu dDMyIG1pbl9yYW5nZSwgdWludDMyIG1heF9yYW5nZSwKKwkJCQkgdWludDMyICpyZXN1bHQpCit7 CisJY2hhcgkgICAJCSplbmRwdHI7CisJdW5zaWduZWQgbG9uZwl2YWw7CisKKwkvKiBGYWlsIGlm IHRoZXJlIGlzIGEgbWludXMgc2lnbiBhdCB0aGUgc3RhcnQgb2YgdmFsdWUgKi8KKwl3aGlsZShp c3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqb3B0YXJnKSkKKwkJb3B0YXJnKys7CisJaWYoKm9wdGFy ZyA9PSAnLScpCisJeworCQlwZ19sb2dfZXJyb3IoInZhbHVlIFwiJXNcIiBmb3Igb3B0aW9uICVz IGNhbiBub3QgYmUgbmVnYXRpdmUiLAorCQkJCQlvcHRhcmcsIG9wdG5hbWUpOworCQlyZXR1cm4g ZmFsc2U7CisJfQorCisJZXJybm8gPSAwOworCXZhbCA9IHN0cnRvdWwob3B0YXJnLCAmZW5kcHRy LCAxMCk7CisKKwkvKgorCSAqIFNraXAgYW55IHRyYWlsaW5nIHdoaXRlc3BhY2U7IGlmIGFueXRo aW5nIGJ1dCB3aGl0ZXNwYWNlIHJlbWFpbnMgYmVmb3JlCisJICogdGhlIHRlcm1pbmF0aW5nIGNo YXJhY3RlciwgZmFpbC4KKwkgKi8KKwl3aGlsZSAoKmVuZHB0ciAhPSAnXDAnICYmIGlzc3BhY2Uo KHVuc2lnbmVkIGNoYXIpICplbmRwdHIpKQorCQllbmRwdHIrKzsKKworCWlmICgqZW5kcHRyICE9 ICdcMCcpCisJeworCQlwZ19sb2dfZXJyb3IoImludmFsaWQgdmFsdWUgXCIlc1wiIGZvciBvcHRp b24gJXMiLAorCQkJCQkgb3B0YXJnLCBvcHRuYW1lKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwor CS8qIGFzIG1pbl9yYW5nZSBhbmQgbWF4X3JhbmdlIGFyZSB1aW50MzIgdGhlbiB0aGUgcmFuZ2Ug Y2hlY2sgd2lsbAorCSAqIGNhdGNoIHRoZSBjYXNlIHdoZXJlIHVuc2lnbmVkIGxvbmcgdmFsIGlz IG91dHNpZGUgMzIgYml0IHJhbmdlICovCisJaWYgKGVycm5vID09IEVSQU5HRSB8fCB2YWwgPCBt aW5fcmFuZ2UgfHwgdmFsID4gbWF4X3JhbmdlKQorCXsKKwkJcGdfbG9nX2Vycm9yKCIlcyBub3Qg aW4gcmFuZ2UgJXUuLiV1Iiwgb3B0bmFtZSwgbWluX3JhbmdlLCBtYXhfcmFuZ2UpOworCQlyZXR1 cm4gZmFsc2U7CisJfQorCisJaWYgKHJlc3VsdCkKKwkJKnJlc3VsdCA9ICh1aW50MzIpIHZhbDsK KwlyZXR1cm4gdHJ1ZTsKK30KKwogLyoKICAqIFByb3ZpZGUgc3RyaWN0bHkgaGFybW9uaXplZCBo YW5kbGluZyBvZiB0aGUgLS1zeW5jLW1ldGhvZCBvcHRpb24uCiAgKi8KZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL2ZlX3V0aWxzL29wdGlvbl91dGlscy5oIGIvc3JjL2luY2x1ZGUvZmVfdXRpbHMv b3B0aW9uX3V0aWxzLmgKaW5kZXggZDk3NWRiNzdhZjIuLjY3ZmQzNjUwZDdhIDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS9mZV91dGlscy9vcHRpb25fdXRpbHMuaAorKysgYi9zcmMvaW5jbHVkZS9m ZV91dGlscy9vcHRpb25fdXRpbHMuaApAQCAtMjIsNiArMjIsOSBAQCBleHRlcm4gdm9pZCBoYW5k bGVfaGVscF92ZXJzaW9uX29wdHMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwKIGV4dGVybiBib29s IG9wdGlvbl9wYXJzZV9pbnQoY29uc3QgY2hhciAqb3B0YXJnLCBjb25zdCBjaGFyICpvcHRuYW1l LAogCQkJCQkJCSBpbnQgbWluX3JhbmdlLCBpbnQgbWF4X3JhbmdlLAogCQkJCQkJCSBpbnQgKnJl c3VsdCk7CitleHRlcm4gYm9vbCBvcHRpb25fcGFyc2VfdWludDMyKGNvbnN0IGNoYXIgKm9wdGFy ZywgY29uc3QgY2hhciAqb3B0bmFtZSwKKwkJCQkJCQkgdWludDMyIG1pbl9yYW5nZSwgdWludDMy IG1heF9yYW5nZSwKKwkJCQkJCQkgdWludDMyICpyZXN1bHQpOwogZXh0ZXJuIGJvb2wgcGFyc2Vf c3luY19tZXRob2QoY29uc3QgY2hhciAqb3B0YXJnLAogCQkJCQkJCSAgRGF0YURpclN5bmNNZXRo b2QgKnN5bmNfbWV0aG9kKTsKIGV4dGVybiB2b2lkIGNoZWNrX211dF9leGNsX29wdHNfaW50ZXJu YWwoaW50IG4sLi4uKTsKLS0gCjIuNDMuMAoK --0000000000001a293e064e1383be--