From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by sourceware.org (Postfix) with ESMTPS id 10D783858D28 for ; Wed, 24 May 2023 19:14:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 10D783858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-3f601c57d8dso1337605e9.0 for ; Wed, 24 May 2023 12:14:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1684955646; x=1687547646; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=kfcPuAhbkAHqUKoAVYoQOQg6nY3KafrP/ViAnfzVC3c=; b=YQf2TlP+ZdcFO0H85uFZPe5YWwBhDsBoceBQ9jdURVIrN/47kbnFHR7JA6z+Na9UgL GTcF2EHCjn7A59lbqKi9bWtH2TfEvpKj4Y7DbzYc2fOG2Di85fnvPEFP9py5QntDnBQ9 2MgnK+/o0GxHZsVgvw/O4FZUytc7kz/rx6WqwDfr9m/m//T947+QGHm+cnrbypFu9i4K nRzkDEs981gFHdCcDig6JOTIGONCsVIYIo2Jl68l8kMmTiXdPRCPqnKVwvBksEzTAeWg utPYmZZaUWWw8+HmaVkd3B1UOTSTm1z9qsY+DE5MN1F5QSS321/S5DuT4wBkeIDJea/s msGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684955646; x=1687547646; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=kfcPuAhbkAHqUKoAVYoQOQg6nY3KafrP/ViAnfzVC3c=; b=PN94itEILkuK1tmoMV17zZyTfq6F+rntKmXP1BunEg8mNuc3baJwxs2sYWbDLus+ST JxtmYRJFPRiB50TN4qvi4/vr2DqpYlRpmqYDh54owgmP/ueMbCQ4WnXN23FfEGqn8UNk b04mZqL9p2q54eYNjMEns2xQ/LfoV5PHeaCQNtUlLzfjiX2sYuIfxFxShAipKfUWs8Fu AM7f7cBo0RSxeQ6IZLsitTvTsBwoKux1pTaGiaQefvc/0mE3QAr6Tc6Ryf44T1OMer+r CfRAzknr6CrGGg968sTXt4kOVAT5tL7/C65uZhhn1P/EooSKF64XblW1FyIuxdtvsPFV YzbQ== X-Gm-Message-State: AC+VfDwGzUYNzvg+13qTTxEsPa1jkFpICP+qQXGM2Vl7PqQ9K1bUPS1O gIoZDgSnbsJ3qOHZoHHeV5Ct1uL2sxbbcWTaeiWLHw== X-Google-Smtp-Source: ACHHUZ6sF9Gtpa3ajRmWB+mKJMm9ILEIFC5tPeWwBtLCxmWLdxEFS8y7IRI02nTBVYMLDKgF0n7qrtBV9XVlSR7PUpo= X-Received: by 2002:a05:600c:4591:b0:3f6:11e2:b971 with SMTP id r17-20020a05600c459100b003f611e2b971mr169323wmo.20.1684955645116; Wed, 24 May 2023 12:14:05 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Prathamesh Kulkarni Date: Thu, 25 May 2023 00:43:27 +0530 Message-ID: Subject: Re: [aarch64] Code-gen for vector initialization involving constants To: Prathamesh Kulkarni , gcc Patches , richard.sandiford@arm.com Content-Type: multipart/mixed; boundary="000000000000b0eb3505fc754e53" X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000b0eb3505fc754e53 Content-Type: text/plain; charset="UTF-8" On Wed, 24 May 2023 at 15:40, Richard Sandiford wrote: > > Prathamesh Kulkarni writes: > > On Mon, 22 May 2023 at 14:18, Richard Sandiford > > wrote: > >> > >> Prathamesh Kulkarni writes: > >> > Hi Richard, > >> > Thanks for the suggestions. Does the attached patch look OK ? > >> > Boostrap+test in progress on aarch64-linux-gnu. > >> > >> Like I say, please wait for the tests to complete before sending an RFA. > >> It saves a review cycle if the tests don't in fact pass. > > Right, sorry, will post patches after completion of testing henceforth. > >> > >> > diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc > >> > index 29dbacfa917..e611a7cca25 100644 > >> > --- a/gcc/config/aarch64/aarch64.cc > >> > +++ b/gcc/config/aarch64/aarch64.cc > >> > @@ -22332,6 +22332,43 @@ aarch64_unzip_vector_init (machine_mode mode, rtx vals, bool even_p) > >> > return gen_rtx_PARALLEL (new_mode, vec); > >> > } > >> > > >> > +/* Return true if INSN is a scalar move. */ > >> > + > >> > +static bool > >> > +scalar_move_insn_p (const rtx_insn *insn) > >> > +{ > >> > + rtx set = single_set (insn); > >> > + if (!set) > >> > + return false; > >> > + rtx src = SET_SRC (set); > >> > + rtx dest = SET_DEST (set); > >> > + return is_a(GET_MODE (dest)) > >> > + && aarch64_mov_operand_p (src, GET_MODE (src)); > >> > >> Formatting: > >> > >> return (is_a(GET_MODE (dest)) > >> && aarch64_mov_operand_p (src, GET_MODE (src))); > >> > >> OK with that change if the tests pass, thanks. > > Unfortunately, the patch regressed vec-init-21.c: > > > > int8x16_t f_s8(int8_t x, int8_t y) > > { > > return (int8x16_t) { x, y, 1, 2, 3, 4, 5, 6, > > 7, 8, 9, 10, 11, 12, 13, 14 }; > > } > > > > -O3 code-gen trunk: > > f_s8: > > adrp x2, .LC0 > > ldr q0, [x2, #:lo12:.LC0] > > ins v0.b[0], w0 > > ins v0.b[1], w1 > > ret > > > > -O3 code-gen patch: > > f_s8: > > adrp x2, .LC0 > > ldr d31, [x2, #:lo12:.LC0] > > adrp x2, .LC1 > > ldr d0, [x2, #:lo12:.LC1] > > ins v31.b[0], w0 > > ins v0.b[0], w1 > > zip1 v0.16b, v31.16b, v0.16b > > ret > > > > With trunk, it chooses the fallback sequence because both fallback > > and zip1 sequence had cost = 20, however with patch applied, > > we end up with zip1 sequence cost = 24 and fallback sequence > > cost = 28. > > > > This happens because of using insn_cost instead of > > set_rtx_cost for the following expression: > > (set (reg:QI 100) > > (subreg/s/u:QI (reg/v:SI 94 [ y ]) 0)) > > set_rtx_cost returns 0 for above expression but insn_cost returns 4. > > Yeah, was wondering why you'd dropped the set_rtx_cost thing, > but decided not to question it since using insn_cost seemed > reasonable if it worked. The attached patch uses set_rtx_cost for single_set and insn_cost otherwise for non debug insns similar to seq_cost. > > > This expression template appears twice in fallback sequence, which raises > > the cost to 28 from 20, while it appears once in each half of zip1 sequence, > > which raises the cost to 24 from 20, and so it now prefers zip1 sequence > > instead. > > > > I assumed this expression would be ignored because it looks like a scalar move, > > but that doesn't seem to be the case ? > > aarch64_classify_symbolic_expression returns > > SYMBOL_FORCE_TO_MEM for (subreg/s/u:QI (reg/v:SI 94 [ y ]) 0) > > and thus aarch64_mov_operand_p returns false. > > Ah, I guess it should be aarch64_mov_operand instead. Confusing that > they're so different... Thanks, using aarch64_mov_operand worked. > > > Another issue with the zip1 sequence above is using same register x2 > > for loading another half of constant in: > > adrp x2, .LC1 > > > > I guess this will create an output dependency from adrp x2, .LC0 -> > > adrp x2, .LC1 > > and anti-dependency from ldr d31, [x2, #:lo12:.LC0] -> adrp x2, .LC1 > > essentially forcing almost the entire sequence (except ins > > instructions) to execute sequentially ? > > I'd expect modern cores to handle that via renaming. Ah right, thanks for the clarification. For some reason, it seems git diff is not formatting the patch correctly :/ Or perhaps I am doing something wrongly. For eg, it shows: + return is_a(GET_MODE (dest)) + && aarch64_mov_operand (src, GET_MODE (src)); but after applying the patch, it's formatted correctly with "&& aarch64..." right below is_a, both on column 10. Similarly, for following hunk in seq_cost_ignoring_scalar_moves: + if (NONDEBUG_INSN_P (seq) + && !scalar_move_insn_p (seq)) After applying patch, "&&" is below N, and not '('. Both N and "&&" are on col 9. And for the following just below: + { + if (rtx set = single_set (seq)) diff shows only one space difference between '{' and the following if, but after applying the patch it's formatted correctly, with two spaces after the curly brace. I have also attached the entire file aarch64.cc with patch applied. Does the formatting look OK ? Patch passes bootstrap+test on aarch64-linux-gnu with no regressions. OK to commit ? Thanks, Prathamesh > > Thanks, > Richard --000000000000b0eb3505fc754e53 Content-Type: text/plain; charset="US-ASCII"; name="ignore-scalar-move-3.txt" Content-Disposition: attachment; filename="ignore-scalar-move-3.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_li22pwd50 W2FhcmNoNjRdIElnbm9yZSBjb3N0IG9mIHNjYWxhciBtb3ZlcyBmb3Igc2VxIGluIHZlY3RvciBp bml0aWFsaXphdGlvbi4KCmdjYy9DaGFuZ2VMb2c6CgkqIGNvbmZpZy9hYXJjaDY0L2FhcmNoNjQu Y2MgKHNjYWxhcl9tb3ZlX2luc25fcCk6IE5ldyBmdW5jdGlvbi4gCgkoc2VxX2Nvc3RfaWdub3Jp bmdfc2NhbGFyX21vdmVzKTogTGlrZXdpc2UuCgkoYWFyY2g2NF9leHBhbmRfdmVjdG9yX2luaXQp OiBDYWxsIHNlcV9jb3N0X2lnbm9yaW5nX3NjYWxhcl9tb3Zlcy4KCmRpZmYgLS1naXQgYS9nY2Mv Y29uZmlnL2FhcmNoNjQvYWFyY2g2NC5jYyBiL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0LmNj CmluZGV4IGQ2ZmM5NDAxNWZhLi41OThmMmY4NjQxNyAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9h YXJjaDY0L2FhcmNoNjQuY2MKKysrIGIvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQuY2MKQEAg LTIyMzMyLDYgKzIyMzMyLDQ3IEBAIGFhcmNoNjRfdW56aXBfdmVjdG9yX2luaXQgKG1hY2hpbmVf bW9kZSBtb2RlLCBydHggdmFscywgYm9vbCBldmVuX3ApCiAgIHJldHVybiBnZW5fcnR4X1BBUkFM TEVMIChuZXdfbW9kZSwgdmVjKTsKIH0KIAorLyogUmV0dXJuIHRydWUgaWYgSU5TTiBpcyBhIHNj YWxhciBtb3ZlLiAgKi8KKworc3RhdGljIGJvb2wKK3NjYWxhcl9tb3ZlX2luc25fcCAoY29uc3Qg cnR4X2luc24gKmluc24pCit7CisgIHJ0eCBzZXQgPSBzaW5nbGVfc2V0IChpbnNuKTsKKyAgaWYg KCFzZXQpCisgICAgcmV0dXJuIGZhbHNlOworICBydHggc3JjID0gU0VUX1NSQyAoc2V0KTsKKyAg cnR4IGRlc3QgPSBTRVRfREVTVCAoc2V0KTsKKyAgcmV0dXJuIGlzX2E8c2NhbGFyX21vZGU+KEdF VF9NT0RFIChkZXN0KSkKKwkgJiYgYWFyY2g2NF9tb3Zfb3BlcmFuZCAoc3JjLCBHRVRfTU9ERSAo c3JjKSk7Cit9CisKKy8qIFNpbWlsYXIgdG8gc2VxX2Nvc3QsIGJ1dCBpZ25vcmUgY29zdCBmb3Ig c2NhbGFyIG1vdmVzLiAgVGhpcyBmdW5jdGlvbgorICAgaXMgY2FsbGVkIGZyb20gYWFyY2g2NF9l eHBhbmRfdmVjdG9yX2luaXQuICAqLworCitzdGF0aWMgdW5zaWduZWQKK3NlcV9jb3N0X2lnbm9y aW5nX3NjYWxhcl9tb3ZlcyAoY29uc3QgcnR4X2luc24gKnNlcSwgYm9vbCBzcGVlZCkKK3sKKyAg dW5zaWduZWQgY29zdCA9IDA7CisKKyAgZm9yICg7IHNlcTsgc2VxID0gTkVYVF9JTlNOIChzZXEp KQorICAgIGlmIChOT05ERUJVR19JTlNOX1AgKHNlcSkKKwkmJiAhc2NhbGFyX21vdmVfaW5zbl9w IChzZXEpKQorICAgICAgeworCWlmIChydHggc2V0ID0gc2luZ2xlX3NldCAoc2VxKSkKKwkgIGNv c3QgKz0gc2V0X3J0eF9jb3N0IChzZXQsIHNwZWVkKTsKKwllbHNlCisJICB7CisJICAgIGludCB0 aGlzX2Nvc3QgPSBpbnNuX2Nvc3QgKENPTlNUX0NBU1RfUlRYX0lOU04gKHNlcSksIHNwZWVkKTsK KwkgICAgaWYgKHRoaXNfY29zdCA+IDApCisJICAgICAgY29zdCArPSB0aGlzX2Nvc3Q7CisJICAg IGVsc2UKKwkgICAgICBjb3N0Kys7CisJICB9CisgICAgICB9CisKKyAgcmV0dXJuIGNvc3Q7Cit9 CisKIC8qIEV4cGFuZCBhIHZlY3RvciBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSwgc3VjaCB0aGF0 IFRBUkdFVCBpcwogICAgaW5pdGlhbGl6ZWQgdG8gY29udGFpbiBWQUxTLiAgKi8KIApAQCAtMjIz NjcsNyArMjI0MDgsNyBAQCBhYXJjaDY0X2V4cGFuZF92ZWN0b3JfaW5pdCAocnR4IHRhcmdldCwg cnR4IHZhbHMpCiAgICAgICBoYWx2ZXNbaV0gPSBnZW5fcnR4X1NVQlJFRyAobW9kZSwgdG1wX3Jl ZywgMCk7CiAgICAgICBydHhfaW5zbiAqcmVjX3NlcSA9IGdldF9pbnNucyAoKTsKICAgICAgIGVu ZF9zZXF1ZW5jZSAoKTsKLSAgICAgIGNvc3RzW2ldID0gc2VxX2Nvc3QgKHJlY19zZXEsICFvcHRp bWl6ZV9zaXplKTsKKyAgICAgIGNvc3RzW2ldID0gc2VxX2Nvc3RfaWdub3Jpbmdfc2NhbGFyX21v dmVzIChyZWNfc2VxLCAhb3B0aW1pemVfc2l6ZSk7CiAgICAgICBlbWl0X2luc24gKHJlY19zZXEp OwogICAgIH0KIApAQCAtMjIzODQsNyArMjI0MjUsOCBAQCBhYXJjaDY0X2V4cGFuZF92ZWN0b3Jf aW5pdCAocnR4IHRhcmdldCwgcnR4IHZhbHMpCiAgIHN0YXJ0X3NlcXVlbmNlICgpOwogICBhYXJj aDY0X2V4cGFuZF92ZWN0b3JfaW5pdF9mYWxsYmFjayAodGFyZ2V0LCB2YWxzKTsKICAgcnR4X2lu c24gKmZhbGxiYWNrX3NlcSA9IGdldF9pbnNucyAoKTsKLSAgdW5zaWduZWQgZmFsbGJhY2tfc2Vx X2Nvc3QgPSBzZXFfY29zdCAoZmFsbGJhY2tfc2VxLCAhb3B0aW1pemVfc2l6ZSk7CisgIHVuc2ln bmVkIGZhbGxiYWNrX3NlcV9jb3N0CisgICAgPSBzZXFfY29zdF9pZ25vcmluZ19zY2FsYXJfbW92 ZXMgKGZhbGxiYWNrX3NlcSwgIW9wdGltaXplX3NpemUpOwogICBlbmRfc2VxdWVuY2UgKCk7CiAK ICAgZW1pdF9pbnNuIChzZXFfdG90YWxfY29zdCA8IGZhbGxiYWNrX3NlcV9jb3N0ID8gc2VxIDog ZmFsbGJhY2tfc2VxKTsK --000000000000b0eb3505fc754e53 Content-Type: text/x-c-code; charset="US-ASCII"; name="aarch64.cc" Content-Disposition: attachment; filename="aarch64.cc" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_li22qd3r1 LyogTWFjaGluZSBkZXNjcmlwdGlvbiBmb3IgQUFyY2g2NCBhcmNoaXRlY3R1cmUuCiAgIENvcHly aWdodCAoQykgMjAwOS0yMDIzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBDb250 cmlidXRlZCBieSBBUk0gTHRkLgoKICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgoKICAgR0ND IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkg aXQKICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkKICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQogICBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIEdD QyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQK ICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVQogICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcz LiAgSWYgbm90IHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2Rl ZmluZSBJTl9UQVJHRVRfQ09ERSAxCgojZGVmaW5lIElOQ0xVREVfU1RSSU5HCiNkZWZpbmUgSU5D TFVERV9BTEdPUklUSE0KI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAic3lzdGVtLmgiCiNp bmNsdWRlICJjb3JldHlwZXMuaCIKI2luY2x1ZGUgImJhY2tlbmQuaCIKI2luY2x1ZGUgInRhcmdl dC5oIgojaW5jbHVkZSAicnRsLmgiCiNpbmNsdWRlICJ0cmVlLmgiCiNpbmNsdWRlICJtZW1tb2Rl bC5oIgojaW5jbHVkZSAiZ2ltcGxlLmgiCiNpbmNsdWRlICJjZmdob29rcy5oIgojaW5jbHVkZSAi Y2ZnbG9vcC5oIgojaW5jbHVkZSAiZGYuaCIKI2luY2x1ZGUgInRtX3AuaCIKI2luY2x1ZGUgInN0 cmluZ3Bvb2wuaCIKI2luY2x1ZGUgImF0dHJpYnMuaCIKI2luY2x1ZGUgIm9wdGFicy5oIgojaW5j bHVkZSAicmVncy5oIgojaW5jbHVkZSAiZW1pdC1ydGwuaCIKI2luY2x1ZGUgInJlY29nLmgiCiNp bmNsdWRlICJjZ3JhcGguaCIKI2luY2x1ZGUgImRpYWdub3N0aWMuaCIKI2luY2x1ZGUgImluc24t YXR0ci5oIgojaW5jbHVkZSAiYWxpYXMuaCIKI2luY2x1ZGUgImZvbGQtY29uc3QuaCIKI2luY2x1 ZGUgInN0b3ItbGF5b3V0LmgiCiNpbmNsdWRlICJjYWxscy5oIgojaW5jbHVkZSAidmFyYXNtLmgi CiNpbmNsdWRlICJvdXRwdXQuaCIKI2luY2x1ZGUgImZsYWdzLmgiCiNpbmNsdWRlICJleHBsb3cu aCIKI2luY2x1ZGUgImV4cHIuaCIKI2luY2x1ZGUgInJlbG9hZC5oIgojaW5jbHVkZSAibGFuZ2hv b2tzLmgiCiNpbmNsdWRlICJvcHRzLmgiCiNpbmNsdWRlICJnaW1wbGlmeS5oIgojaW5jbHVkZSAi ZHdhcmYyLmgiCiNpbmNsdWRlICJnaW1wbGUtaXRlcmF0b3IuaCIKI2luY2x1ZGUgInRyZWUtdmVj dG9yaXplci5oIgojaW5jbHVkZSAiYWFyY2g2NC1jb3N0LXRhYmxlcy5oIgojaW5jbHVkZSAiZHVt cGZpbGUuaCIKI2luY2x1ZGUgImJ1aWx0aW5zLmgiCiNpbmNsdWRlICJydGwtaXRlci5oIgojaW5j bHVkZSAidG0tY29uc3Rycy5oIgojaW5jbHVkZSAic2NoZWQtaW50LmgiCiNpbmNsdWRlICJ0YXJn ZXQtZ2xvYmFscy5oIgojaW5jbHVkZSAiY29tbW9uL2NvbW1vbi10YXJnZXQuaCIKI2luY2x1ZGUg ImNmZ3J0bC5oIgojaW5jbHVkZSAic2VsZnRlc3QuaCIKI2luY2x1ZGUgInNlbGZ0ZXN0LXJ0bC5o IgojaW5jbHVkZSAicnR4LXZlY3Rvci1idWlsZGVyLmgiCiNpbmNsdWRlICJpbnRsLmgiCiNpbmNs dWRlICJleHBtZWQuaCIKI2luY2x1ZGUgImZ1bmN0aW9uLWFiaS5oIgojaW5jbHVkZSAiZ2ltcGxl LXByZXR0eS1wcmludC5oIgojaW5jbHVkZSAidHJlZS1zc2EtbG9vcC1uaXRlci5oIgojaW5jbHVk ZSAiZnJhY3Rpb25hbC1jb3N0LmgiCiNpbmNsdWRlICJydGxhbmFsLmgiCiNpbmNsdWRlICJ0cmVl LWRmYS5oIgojaW5jbHVkZSAiYXNhbi5oIgojaW5jbHVkZSAiYWFyY2g2NC1mZWF0dXJlLWRlcHMu aCIKI2luY2x1ZGUgImNvbmZpZy9hcm0vYWFyY2gtY29tbW9uLmgiCiNpbmNsdWRlICJjb25maWcv YXJtL2FhcmNoLWNvbW1vbi1wcm90b3MuaCIKCi8qIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVk ZWQgbGFzdC4gICovCiNpbmNsdWRlICJ0YXJnZXQtZGVmLmgiCgovKiBEZWZpbmVkIGZvciBjb252 ZW5pZW5jZS4gICovCiNkZWZpbmUgUE9JTlRFUl9CWVRFUyAoUE9JTlRFUl9TSVpFIC8gQklUU19Q RVJfVU5JVCkKCi8qIEluZm9ybWF0aW9uIGFib3V0IGEgbGVnaXRpbWF0ZSB2ZWN0b3IgaW1tZWRp YXRlIG9wZXJhbmQuICAqLwpzdHJ1Y3Qgc2ltZF9pbW1lZGlhdGVfaW5mbwp7CiAgZW51bSBpbnNu X3R5cGUgeyBNT1YsIE1WTiwgSU5ERVgsIFBUUlVFIH07CiAgZW51bSBtb2RpZmllcl90eXBlIHsg TFNMLCBNU0wgfTsKCiAgc2ltZF9pbW1lZGlhdGVfaW5mbyAoKSB7fQogIHNpbWRfaW1tZWRpYXRl X2luZm8gKHNjYWxhcl9mbG9hdF9tb2RlLCBydHgpOwogIHNpbWRfaW1tZWRpYXRlX2luZm8gKHNj YWxhcl9pbnRfbW9kZSwgdW5zaWduZWQgSE9TVF9XSURFX0lOVCwKCQkgICAgICAgaW5zbl90eXBl ID0gTU9WLCBtb2RpZmllcl90eXBlID0gTFNMLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgPSAwKTsK ICBzaW1kX2ltbWVkaWF0ZV9pbmZvIChzY2FsYXJfbW9kZSwgcnR4LCBydHgpOwogIHNpbWRfaW1t ZWRpYXRlX2luZm8gKHNjYWxhcl9pbnRfbW9kZSwgYWFyY2g2NF9zdnBhdHRlcm4pOwoKICAvKiBU aGUgbW9kZSBvZiB0aGUgZWxlbWVudHMuICAqLwogIHNjYWxhcl9tb2RlIGVsdF9tb2RlOwoKICAv KiBUaGUgaW5zdHJ1Y3Rpb24gdG8gdXNlIHRvIG1vdmUgdGhlIGltbWVkaWF0ZSBpbnRvIGEgdmVj dG9yLiAgKi8KICBpbnNuX3R5cGUgaW5zbjsKCiAgdW5pb24KICB7CiAgICAvKiBGb3IgTU9WIGFu ZCBNVk4uICAqLwogICAgc3RydWN0CiAgICB7CiAgICAgIC8qIFRoZSB2YWx1ZSBvZiBlYWNoIGVs ZW1lbnQuICAqLwogICAgICBydHggdmFsdWU7CgogICAgICAvKiBUaGUga2luZCBvZiBzaGlmdCBt b2RpZmllciB0byB1c2UsIGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQuCgkgVGhpcyBp cyAoTFNMLCAwKSBpZiBubyBzaGlmdCBpcyBuZWVkZWQuICAqLwogICAgICBtb2RpZmllcl90eXBl IG1vZGlmaWVyOwogICAgICB1bnNpZ25lZCBpbnQgc2hpZnQ7CiAgICB9IG1vdjsKCiAgICAvKiBG b3IgSU5ERVguICAqLwogICAgc3RydWN0CiAgICB7CiAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUg Zmlyc3QgZWxlbWVudCBhbmQgdGhlIHN0ZXAgdG8gYmUgYWRkZWQgZm9yIGVhY2gKCSBzdWJzZXF1 ZW50IGVsZW1lbnQuICAqLwogICAgICBydHggYmFzZSwgc3RlcDsKICAgIH0gaW5kZXg7CgogICAg LyogRm9yIFBUUlVFLiAgKi8KICAgIGFhcmNoNjRfc3ZwYXR0ZXJuIHBhdHRlcm47CiAgfSB1Owp9 OwoKLyogQ29uc3RydWN0IGEgZmxvYXRpbmctcG9pbnQgaW1tZWRpYXRlIGluIHdoaWNoIGVhY2gg ZWxlbWVudCBoYXMgbW9kZQogICBFTFRfTU9ERV9JTiBhbmQgdmFsdWUgVkFMVUVfSU4uICAqLwpp bmxpbmUgc2ltZF9pbW1lZGlhdGVfaW5mbwo6OnNpbWRfaW1tZWRpYXRlX2luZm8gKHNjYWxhcl9m bG9hdF9tb2RlIGVsdF9tb2RlX2luLCBydHggdmFsdWVfaW4pCiAgOiBlbHRfbW9kZSAoZWx0X21v ZGVfaW4pLCBpbnNuIChNT1YpCnsKICB1Lm1vdi52YWx1ZSA9IHZhbHVlX2luOwogIHUubW92Lm1v ZGlmaWVyID0gTFNMOwogIHUubW92LnNoaWZ0ID0gMDsKfQoKLyogQ29uc3RydWN0IGFuIGludGVn ZXIgaW1tZWRpYXRlIGluIHdoaWNoIGVhY2ggZWxlbWVudCBoYXMgbW9kZSBFTFRfTU9ERV9JTgog ICBhbmQgdmFsdWUgVkFMVUVfSU4uICBUaGUgb3RoZXIgcGFyYW1ldGVycyBhcmUgYXMgZm9yIHRo ZSBzdHJ1Y3R1cmUKICAgZmllbGRzLiAgKi8KaW5saW5lIHNpbWRfaW1tZWRpYXRlX2luZm8KOjpz aW1kX2ltbWVkaWF0ZV9pbmZvIChzY2FsYXJfaW50X21vZGUgZWx0X21vZGVfaW4sCgkJICAgICAg IHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgdmFsdWVfaW4sCgkJICAgICAgIGluc25fdHlwZSBpbnNu X2luLCBtb2RpZmllcl90eXBlIG1vZGlmaWVyX2luLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgc2hp ZnRfaW4pCiAgOiBlbHRfbW9kZSAoZWx0X21vZGVfaW4pLCBpbnNuIChpbnNuX2luKQp7CiAgdS5t b3YudmFsdWUgPSBnZW5faW50X21vZGUgKHZhbHVlX2luLCBlbHRfbW9kZV9pbik7CiAgdS5tb3Yu bW9kaWZpZXIgPSBtb2RpZmllcl9pbjsKICB1Lm1vdi5zaGlmdCA9IHNoaWZ0X2luOwp9CgovKiBD b25zdHJ1Y3QgYW4gaW50ZWdlciBpbW1lZGlhdGUgaW4gd2hpY2ggZWFjaCBlbGVtZW50IGhhcyBt b2RlIEVMVF9NT0RFX0lOCiAgIGFuZCB3aGVyZSBlbGVtZW50IEkgaXMgZXF1YWwgdG8gQkFTRV9J TiArIEkgKiBTVEVQX0lOLiAgKi8KaW5saW5lIHNpbWRfaW1tZWRpYXRlX2luZm8KOjpzaW1kX2lt bWVkaWF0ZV9pbmZvIChzY2FsYXJfbW9kZSBlbHRfbW9kZV9pbiwgcnR4IGJhc2VfaW4sIHJ0eCBz dGVwX2luKQogIDogZWx0X21vZGUgKGVsdF9tb2RlX2luKSwgaW5zbiAoSU5ERVgpCnsKICB1Lmlu ZGV4LmJhc2UgPSBiYXNlX2luOwogIHUuaW5kZXguc3RlcCA9IHN0ZXBfaW47Cn0KCi8qIENvbnN0 cnVjdCBhIHByZWRpY2F0ZSB0aGF0IGNvbnRyb2xzIGVsZW1lbnRzIG9mIG1vZGUgRUxUX01PREVf SU4KICAgYW5kIGhhcyBQVFJVRSBwYXR0ZXJuIFBBVFRFUk5fSU4uICAqLwppbmxpbmUgc2ltZF9p bW1lZGlhdGVfaW5mbwo6OnNpbWRfaW1tZWRpYXRlX2luZm8gKHNjYWxhcl9pbnRfbW9kZSBlbHRf bW9kZV9pbiwKCQkgICAgICAgYWFyY2g2NF9zdnBhdHRlcm4gcGF0dGVybl9pbikKICA6IGVsdF9t b2RlIChlbHRfbW9kZV9pbiksIGluc24gKFBUUlVFKQp7CiAgdS5wYXR0ZXJuID0gcGF0dGVybl9p bjsKfQoKbmFtZXNwYWNlIHsKCi8qIERlc2NyaWJlcyB0eXBlcyB0aGF0IG1hcCB0byBQdXJlIFNj YWxhYmxlIFR5cGVzIChQU1RzKSBpbiB0aGUgQUFQQ1M2NC4gICovCmNsYXNzIHB1cmVfc2NhbGFi bGVfdHlwZV9pbmZvCnsKcHVibGljOgogIC8qIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhbmFs eXppbmcgYSB0eXBlLiAgQWxsIHZhbHVlcyBhcmUgbm9uemVybywKICAgICBpbiB0aGUgcG9zc2li bHkgZm9ybG9ybiBob3BlIHRoYXQgYWNjaWRlbnRhbCBjb252ZXJzaW9ucyB0byBib29sCiAgICAg dHJpZ2dlciBhIHdhcm5pbmcuICAqLwogIGVudW0gYW5hbHlzaXNfcmVzdWx0CiAgewogICAgLyog VGhlIHR5cGUgZG9lcyBub3QgaGF2ZSBhbiBBQkkgaWRlbnRpdHk7IGkuZS4gaXQgZG9lc24ndCBj b250YWluCiAgICAgICBhdCBsZWFzdCBvbmUgb2JqZWN0IHdob3NlIHR5cGUgaXMgYSBGdW5kYW1l bnRhbCBEYXRhIFR5cGUuICAqLwogICAgTk9fQUJJX0lERU5USVRZID0gMSwKCiAgICAvKiBUaGUg dHlwZSBpcyBkZWZpbml0ZWx5IGEgUHVyZSBTY2FsYWJsZSBUeXBlLiAgKi8KICAgIElTX1BTVCwK CiAgICAvKiBUaGUgdHlwZSBpcyBkZWZpbml0ZWx5IG5vdCBhIFB1cmUgU2NhbGFibGUgVHlwZS4g ICovCiAgICBJU05UX1BTVCwKCiAgICAvKiBJdCBkb2Vzbid0IG1hdHRlciBmb3IgUENTIHB1cnBv c2VzIHdoZXRoZXIgdGhlIHR5cGUgaXMgYSBQdXJlCiAgICAgICBTY2FsYWJsZSBUeXBlIG9yIG5v dCwgc2luY2UgdGhlIHR5cGUgd2lsbCBiZSBoYW5kbGVkIHRoZSBzYW1lCiAgICAgICB3YXkgcmVn YXJkbGVzcy4KCiAgICAgICBTcGVjaWZpY2FsbHksIHRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgdHlw ZSBpcyBhIFB1cmUgU2NhbGFibGUgVHlwZSwKICAgICAgIHRoZXJlIGFyZW4ndCBlbm91Z2ggYXJn dW1lbnQgcmVnaXN0ZXJzIHRvIGhvbGQgaXQsIGFuZCBzbyBpdCB3aWxsCiAgICAgICBuZWVkIHRv IGJlIHBhc3NlZCBvciByZXR1cm5lZCBpbiBtZW1vcnkuICBJZiB0aGUgdHlwZSBpc24ndCBhCiAg ICAgICBQdXJlIFNjYWxhYmxlIFR5cGUsIGl0J3MgdG9vIGJpZyB0byBiZSBwYXNzZWQgb3IgcmV0 dXJuZWQgaW4gY29yZQogICAgICAgb3IgU0lNRCZGUCByZWdpc3RlcnMsIGFuZCBzbyBhZ2FpbiB3 aWxsIG5lZWQgdG8gZ28gaW4gbWVtb3J5LiAgKi8KICAgIERPRVNOVF9NQVRURVIKICB9OwoKICAv KiBBZ2dyZWdhdGVzIG9mIDE3IGJ5dGVzIG9yIG1vcmUgYXJlIG5vcm1hbGx5IHBhc3NlZCBhbmQg cmV0dXJuZWQKICAgICBpbiBtZW1vcnksIHNvIGFnZ3JlZ2F0ZXMgb2YgdGhhdCBzaXplIGNhbiBz YWZlbHkgYmUgYW5hbHl6ZWQgYXMKICAgICBET0VTTlRfTUFUVEVSLiAgV2UgbmVlZCB0byBiZSBh YmxlIHRvIGNvbGxlY3QgZW5vdWdoIHBpZWNlcyB0bwogICAgIHJlcHJlc2VudCBhIFBTVCB0aGF0 IGlzIHNtYWxsZXIgdGhhbiB0aGF0LiAgU2luY2UgcHJlZGljYXRlcyBhcmUKICAgICAyIGJ5dGVz IGluIHNpemUgZm9yIC1tc3ZlLXZlY3Rvci1iaXRzPTEyOCwgdGhhdCBtZWFucyB3ZSBuZWVkIHRv IGJlCiAgICAgYWJsZSB0byBzdG9yZSBhdCBsZWFzdCA4IHBpZWNlcy4KCiAgICAgV2UgYWxzbyBu ZWVkIHRvIGJlIGFibGUgdG8gc3RvcmUgZW5vdWdoIHBpZWNlcyB0byByZXByZXNlbnQKICAgICBh IHNpbmdsZSB2ZWN0b3IgaW4gZWFjaCB2ZWN0b3IgYXJndW1lbnQgcmVnaXN0ZXIgYW5kIGEgc2lu Z2xlCiAgICAgcHJlZGljYXRlIGluIGVhY2ggcHJlZGljYXRlIGFyZ3VtZW50IHJlZ2lzdGVyLiAg VGhpcyBtZWFucyB0aGF0CiAgICAgd2UgbmVlZCBhdCBsZWFzdCAxMiBwaWVjZXMuICAqLwogIHN0 YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTUFYX1BJRUNFUyA9IE5VTV9GUF9BUkdfUkVHUyArIE5V TV9QUl9BUkdfUkVHUzsKICBzdGF0aWNfYXNzZXJ0IChNQVhfUElFQ0VTID49IDgsICJOZWVkIHRv IHN0b3JlIGF0IGxlYXN0IDggcHJlZGljYXRlcyIpOwoKICAvKiBEZXNjcmliZXMgb25lIHBpZWNl IG9mIGEgUFNULiAgRWFjaCBwaWVjZSBpcyBvbmUgb2Y6CgogICAgIC0gYSBzaW5nbGUgU2NhbGFi bGUgVmVjdG9yIFR5cGUgKFNWVCkKICAgICAtIGEgc2luZ2xlIFNjYWxhYmxlIFByZWRpY2F0ZSBU eXBlIChTUFQpCiAgICAgLSBhIFBTVCBjb250YWluaW5nIDIsIDMgb3IgNCBTVlRzLCB3aXRoIG5v IHBhZGRpbmcKCiAgICAgSXQgZWl0aGVyIHJlcHJlc2VudHMgYSBzaW5nbGUgYnVpbHQtaW4gdHlw ZSBvciBhIFBTVCBmb3JtZWQgZnJvbQogICAgIG11bHRpcGxlIGhvbW9nZW5lb3VzIGJ1aWx0LWlu IHR5cGVzLiAgKi8KICBzdHJ1Y3QgcGllY2UKICB7CiAgICBydHggZ2V0X3J0eCAodW5zaWduZWQg aW50LCB1bnNpZ25lZCBpbnQpIGNvbnN0OwoKICAgIC8qIFRoZSBudW1iZXIgb2YgdmVjdG9yIGFu ZCBwcmVkaWNhdGUgcmVnaXN0ZXJzIHRoYXQgdGhlIHBpZWNlCiAgICAgICBvY2N1cGllcy4gIE9u ZSBvZiB0aGUgdHdvIGlzIGFsd2F5cyB6ZXJvLiAgKi8KICAgIHVuc2lnbmVkIGludCBudW1fenI7 CiAgICB1bnNpZ25lZCBpbnQgbnVtX3ByOwoKICAgIC8qIFRoZSBtb2RlIG9mIHRoZSByZWdpc3Rl cnMgZGVzY3JpYmVkIGFib3ZlLiAgKi8KICAgIG1hY2hpbmVfbW9kZSBtb2RlOwoKICAgIC8qIElm IHRoaXMgcGllY2UgaXMgZm9ybWVkIGZyb20gbXVsdGlwbGUgaG9tb2dlbmVvdXMgYnVpbHQtaW4g dHlwZXMsCiAgICAgICB0aGlzIGlzIHRoZSBtb2RlIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3Ro ZXJ3aXNlIGl0IGlzIE1PREUuICAqLwogICAgbWFjaGluZV9tb2RlIG9yaWdfbW9kZTsKCiAgICAv KiBUaGUgb2Zmc2V0IGluIGJ5dGVzIG9mIHRoZSBwaWVjZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUg dHlwZS4gICovCiAgICBwb2x5X3VpbnQ2NF9wb2Qgb2Zmc2V0OwogIH07CgogIC8qIERpdmlkZXMg dHlwZXMgYW5hbHl6ZWQgYXMgSVNfUFNUIGludG8gaW5kaXZpZHVhbCBwaWVjZXMuICBUaGUgcGll Y2VzCiAgICAgYXJlIGluIG1lbW9yeSBvcmRlci4gICovCiAgYXV0b192ZWM8cGllY2UsIE1BWF9Q SUVDRVM+IHBpZWNlczsKCiAgdW5zaWduZWQgaW50IG51bV96ciAoKSBjb25zdDsKICB1bnNpZ25l ZCBpbnQgbnVtX3ByICgpIGNvbnN0OwoKICBydHggZ2V0X3J0eCAobWFjaGluZV9tb2RlIG1vZGUs IHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSBjb25zdDsKCiAgYW5hbHlzaXNfcmVzdWx0IGFu YWx5emUgKGNvbnN0X3RyZWUpOwogIGJvb2wgYW5hbHl6ZV9yZWdpc3RlcnMgKGNvbnN0X3RyZWUp OwoKcHJpdmF0ZToKICBhbmFseXNpc19yZXN1bHQgYW5hbHl6ZV9hcnJheSAoY29uc3RfdHJlZSk7 CiAgYW5hbHlzaXNfcmVzdWx0IGFuYWx5emVfcmVjb3JkIChjb25zdF90cmVlKTsKICB2b2lkIGFk ZF9waWVjZSAoY29uc3QgcGllY2UgJik7Cn07Cn0KCi8qIFRoZSBjdXJyZW50IGNvZGUgbW9kZWwu ICAqLwplbnVtIGFhcmNoNjRfY29kZV9tb2RlbCBhYXJjaDY0X2Ntb2RlbDsKCmVudW0gYWFyY2g2 NF90cF9yZWcgYWFyY2g2NF90cGlkcl9yZWdpc3RlcjsKCi8qIFRoZSBudW1iZXIgb2YgNjQtYml0 IGVsZW1lbnRzIGluIGFuIFNWRSB2ZWN0b3IuICAqLwpwb2x5X3VpbnQxNiBhYXJjaDY0X3N2ZV92 ZzsKCiNpZmRlZiBIQVZFX0FTX1RMUwojdW5kZWYgVEFSR0VUX0hBVkVfVExTCiNkZWZpbmUgVEFS R0VUX0hBVkVfVExTIDEKI2VuZGlmCgpzdGF0aWMgYm9vbCBhYXJjaDY0X2NvbXBvc2l0ZV90eXBl X3AgKGNvbnN0X3RyZWUsIG1hY2hpbmVfbW9kZSk7CnN0YXRpYyBib29sIGFhcmNoNjRfcmV0dXJu X2luX21lbW9yeV8xIChjb25zdF90cmVlKTsKc3RhdGljIGJvb2wgYWFyY2g2NF92ZnBfaXNfY2Fs bF9vcl9yZXR1cm5fY2FuZGlkYXRlIChtYWNoaW5lX21vZGUsCgkJCQkJCSAgICAgY29uc3RfdHJl ZSwKCQkJCQkJICAgICBtYWNoaW5lX21vZGUgKiwgaW50ICosCgkJCQkJCSAgICAgYm9vbCAqLCBi b29sKTsKc3RhdGljIHZvaWQgYWFyY2g2NF9lbGZfYXNtX2NvbnN0cnVjdG9yIChydHgsIGludCkg QVRUUklCVVRFX1VOVVNFRDsKc3RhdGljIHZvaWQgYWFyY2g2NF9lbGZfYXNtX2Rlc3RydWN0b3Ig KHJ0eCwgaW50KSBBVFRSSUJVVEVfVU5VU0VEOwpzdGF0aWMgdm9pZCBhYXJjaDY0X292ZXJyaWRl X29wdGlvbnNfYWZ0ZXJfY2hhbmdlICh2b2lkKTsKc3RhdGljIGJvb2wgYWFyY2g2NF92ZWN0b3Jf bW9kZV9zdXBwb3J0ZWRfcCAobWFjaGluZV9tb2RlKTsKc3RhdGljIGludCBhYXJjaDY0X2FkZHJl c3NfY29zdCAocnR4LCBtYWNoaW5lX21vZGUsIGFkZHJfc3BhY2VfdCwgYm9vbCk7CnN0YXRpYyBi b29sIGFhcmNoNjRfYnVpbHRpbl9zdXBwb3J0X3ZlY3Rvcl9taXNhbGlnbm1lbnQgKG1hY2hpbmVf bW9kZSBtb2RlLAoJCQkJCQkJIGNvbnN0X3RyZWUgdHlwZSwKCQkJCQkJCSBpbnQgbWlzYWxpZ25t ZW50LAoJCQkJCQkJIGJvb2wgaXNfcGFja2VkKTsKc3RhdGljIG1hY2hpbmVfbW9kZSBhYXJjaDY0 X3NpbWRfY29udGFpbmVyX21vZGUgKHNjYWxhcl9tb2RlLCBwb2x5X2ludDY0KTsKc3RhdGljIGJv b2wgYWFyY2g2NF9wcmludF9hZGRyZXNzX2ludGVybmFsIChGSUxFKiwgbWFjaGluZV9tb2RlLCBy dHgsCgkJCQkJICAgIGFhcmNoNjRfYWRkcl9xdWVyeV90eXBlKTsKCi8qIFRoZSBwcm9jZXNzb3Ig Zm9yIHdoaWNoIGluc3RydWN0aW9ucyBzaG91bGQgYmUgc2NoZWR1bGVkLiAgKi8KZW51bSBhYXJj aDY0X3Byb2Nlc3NvciBhYXJjaDY0X3R1bmUgPSBjb3J0ZXhhNTM7CgovKiBNYXNrIHRvIHNwZWNp Znkgd2hpY2ggaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZyBvcHRpb25zIHNob3VsZCBiZSB1c2VkLiAg Ki8KdWludDY0X3QgYWFyY2g2NF90dW5lX2ZsYWdzID0gMDsKCi8qIEdsb2JhbCBmbGFnIGZvciBQ QyByZWxhdGl2ZSBsb2Fkcy4gICovCmJvb2wgYWFyY2g2NF9wY3JlbGF0aXZlX2xpdGVyYWxfbG9h ZHM7CgovKiBHbG9iYWwgZmxhZyBmb3Igd2hldGhlciBmcmFtZSBwb2ludGVyIGlzIGVuYWJsZWQu ICAqLwpib29sIGFhcmNoNjRfdXNlX2ZyYW1lX3BvaW50ZXI7CgpjaGFyICphY2NlcHRlZF9icmFu Y2hfcHJvdGVjdGlvbl9zdHJpbmcgPSBOVUxMOwoKLyogU3VwcG9ydCBmb3IgY29tbWFuZCBsaW5l IHBhcnNpbmcgb2YgYm9vbGVhbiBmbGFncyBpbiB0aGUgdHVuaW5nCiAgIHN0cnVjdHVyZXMuICAq LwpzdHJ1Y3QgYWFyY2g2NF9mbGFnX2Rlc2MKewogIGNvbnN0IGNoYXIqIG5hbWU7CiAgdW5zaWdu ZWQgaW50IGZsYWc7Cn07CgojZGVmaW5lIEFBUkNINjRfRlVTSU9OX1BBSVIobmFtZSwgaW50ZXJu YWxfbmFtZSkgXAogIHsgbmFtZSwgQUFSQ0g2NF9GVVNFXyMjaW50ZXJuYWxfbmFtZSB9LApzdGF0 aWMgY29uc3Qgc3RydWN0IGFhcmNoNjRfZmxhZ19kZXNjIGFhcmNoNjRfZnVzaWJsZV9wYWlyc1td ID0KewogIHsgIm5vbmUiLCBBQVJDSDY0X0ZVU0VfTk9USElORyB9LAojaW5jbHVkZSAiYWFyY2g2 NC1mdXNpb24tcGFpcnMuZGVmIgogIHsgImFsbCIsIEFBUkNINjRfRlVTRV9BTEwgfSwKICB7IE5V TEwsIEFBUkNINjRfRlVTRV9OT1RISU5HIH0KfTsKCiNkZWZpbmUgQUFSQ0g2NF9FWFRSQV9UVU5J TkdfT1BUSU9OKG5hbWUsIGludGVybmFsX25hbWUpIFwKICB7IG5hbWUsIEFBUkNINjRfRVhUUkFf VFVORV8jI2ludGVybmFsX25hbWUgfSwKc3RhdGljIGNvbnN0IHN0cnVjdCBhYXJjaDY0X2ZsYWdf ZGVzYyBhYXJjaDY0X3R1bmluZ19mbGFnc1tdID0KewogIHsgIm5vbmUiLCBBQVJDSDY0X0VYVFJB X1RVTkVfTk9ORSB9LAojaW5jbHVkZSAiYWFyY2g2NC10dW5pbmctZmxhZ3MuZGVmIgogIHsgImFs bCIsIEFBUkNINjRfRVhUUkFfVFVORV9BTEwgfSwKICB7IE5VTEwsIEFBUkNINjRfRVhUUkFfVFVO RV9OT05FIH0KfTsKCi8qIFR1bmluZyBwYXJhbWV0ZXJzLiAgKi8KCnN0YXRpYyBjb25zdCBzdHJ1 Y3QgY3B1X2FkZHJjb3N0X3RhYmxlIGdlbmVyaWNfYWRkcmNvc3RfdGFibGUgPQp7CiAgICB7CiAg ICAgIDEsIC8qIGhpICAqLwogICAgICAwLCAvKiBzaSAgKi8KICAgICAgMCwgLyogZGkgICovCiAg ICAgIDEsIC8qIHRpICAqLwogICAgfSwKICAwLCAvKiBwcmVfbW9kaWZ5ICAqLwogIDAsIC8qIHBv c3RfbW9kaWZ5ICAqLwogIDAsIC8qIHBvc3RfbW9kaWZ5X2xkM19zdDMgICovCiAgMCwgLyogcG9z dF9tb2RpZnlfbGQ0X3N0NCAgKi8KICAwLCAvKiByZWdpc3Rlcl9vZmZzZXQgICovCiAgMCwgLyog cmVnaXN0ZXJfc2V4dGVuZCAgKi8KICAwLCAvKiByZWdpc3Rlcl96ZXh0ZW5kICAqLwogIDAgLyog aW1tX29mZnNldCAgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2FkZHJjb3N0X3RhYmxl IGV4eW5vc20xX2FkZHJjb3N0X3RhYmxlID0KewogICAgewogICAgICAwLCAvKiBoaSAgKi8KICAg ICAgMCwgLyogc2kgICovCiAgICAgIDAsIC8qIGRpICAqLwogICAgICAyLCAvKiB0aSAgKi8KICAg IH0sCiAgMCwgLyogcHJlX21vZGlmeSAgKi8KICAwLCAvKiBwb3N0X21vZGlmeSAgKi8KICAwLCAv KiBwb3N0X21vZGlmeV9sZDNfc3QzICAqLwogIDAsIC8qIHBvc3RfbW9kaWZ5X2xkNF9zdDQgICov CiAgMSwgLyogcmVnaXN0ZXJfb2Zmc2V0ICAqLwogIDEsIC8qIHJlZ2lzdGVyX3NleHRlbmQgICov CiAgMiwgLyogcmVnaXN0ZXJfemV4dGVuZCAgKi8KICAwLCAvKiBpbW1fb2Zmc2V0ICAqLwp9OwoK c3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfYWRkcmNvc3RfdGFibGUgeGdlbmUxX2FkZHJjb3N0X3Rh YmxlID0KewogICAgewogICAgICAxLCAvKiBoaSAgKi8KICAgICAgMCwgLyogc2kgICovCiAgICAg IDAsIC8qIGRpICAqLwogICAgICAxLCAvKiB0aSAgKi8KICAgIH0sCiAgMSwgLyogcHJlX21vZGlm eSAgKi8KICAxLCAvKiBwb3N0X21vZGlmeSAgKi8KICAxLCAvKiBwb3N0X21vZGlmeV9sZDNfc3Qz ICAqLwogIDEsIC8qIHBvc3RfbW9kaWZ5X2xkNF9zdDQgICovCiAgMCwgLyogcmVnaXN0ZXJfb2Zm c2V0ICAqLwogIDEsIC8qIHJlZ2lzdGVyX3NleHRlbmQgICovCiAgMSwgLyogcmVnaXN0ZXJfemV4 dGVuZCAgKi8KICAwLCAvKiBpbW1fb2Zmc2V0ICAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBj cHVfYWRkcmNvc3RfdGFibGUgdGh1bmRlcngydDk5X2FkZHJjb3N0X3RhYmxlID0KewogICAgewog ICAgICAxLCAvKiBoaSAgKi8KICAgICAgMSwgLyogc2kgICovCiAgICAgIDEsIC8qIGRpICAqLwog ICAgICAyLCAvKiB0aSAgKi8KICAgIH0sCiAgMCwgLyogcHJlX21vZGlmeSAgKi8KICAwLCAvKiBw b3N0X21vZGlmeSAgKi8KICAwLCAvKiBwb3N0X21vZGlmeV9sZDNfc3QzICAqLwogIDAsIC8qIHBv c3RfbW9kaWZ5X2xkNF9zdDQgICovCiAgMiwgLyogcmVnaXN0ZXJfb2Zmc2V0ICAqLwogIDMsIC8q IHJlZ2lzdGVyX3NleHRlbmQgICovCiAgMywgLyogcmVnaXN0ZXJfemV4dGVuZCAgKi8KICAwLCAv KiBpbW1fb2Zmc2V0ICAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfYWRkcmNvc3RfdGFi bGUgdGh1bmRlcngzdDExMF9hZGRyY29zdF90YWJsZSA9CnsKICAgIHsKICAgICAgMSwgLyogaGkg ICovCiAgICAgIDEsIC8qIHNpICAqLwogICAgICAxLCAvKiBkaSAgKi8KICAgICAgMiwgLyogdGkg ICovCiAgICB9LAogIDAsIC8qIHByZV9tb2RpZnkgICovCiAgMCwgLyogcG9zdF9tb2RpZnkgICov CiAgMCwgLyogcG9zdF9tb2RpZnlfbGQzX3N0MyAgKi8KICAwLCAvKiBwb3N0X21vZGlmeV9sZDRf c3Q0ICAqLwogIDIsIC8qIHJlZ2lzdGVyX29mZnNldCAgKi8KICAzLCAvKiByZWdpc3Rlcl9zZXh0 ZW5kICAqLwogIDMsIC8qIHJlZ2lzdGVyX3pleHRlbmQgICovCiAgMCwgLyogaW1tX29mZnNldCAg Ki8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2FkZHJjb3N0X3RhYmxlIHRzdjExMF9hZGRy Y29zdF90YWJsZSA9CnsKICAgIHsKICAgICAgMSwgLyogaGkgICovCiAgICAgIDAsIC8qIHNpICAq LwogICAgICAwLCAvKiBkaSAgKi8KICAgICAgMSwgLyogdGkgICovCiAgICB9LAogIDAsIC8qIHBy ZV9tb2RpZnkgICovCiAgMCwgLyogcG9zdF9tb2RpZnkgICovCiAgMCwgLyogcG9zdF9tb2RpZnlf bGQzX3N0MyAgKi8KICAwLCAvKiBwb3N0X21vZGlmeV9sZDRfc3Q0ICAqLwogIDAsIC8qIHJlZ2lz dGVyX29mZnNldCAgKi8KICAxLCAvKiByZWdpc3Rlcl9zZXh0ZW5kICAqLwogIDEsIC8qIHJlZ2lz dGVyX3pleHRlbmQgICovCiAgMCwgLyogaW1tX29mZnNldCAgKi8KfTsKCnN0YXRpYyBjb25zdCBz dHJ1Y3QgY3B1X2FkZHJjb3N0X3RhYmxlIHFkZjI0eHhfYWRkcmNvc3RfdGFibGUgPQp7CiAgICB7 CiAgICAgIDEsIC8qIGhpICAqLwogICAgICAxLCAvKiBzaSAgKi8KICAgICAgMSwgLyogZGkgICov CiAgICAgIDIsIC8qIHRpICAqLwogICAgfSwKICAxLCAvKiBwcmVfbW9kaWZ5ICAqLwogIDEsIC8q IHBvc3RfbW9kaWZ5ICAqLwogIDEsIC8qIHBvc3RfbW9kaWZ5X2xkM19zdDMgICovCiAgMSwgLyog cG9zdF9tb2RpZnlfbGQ0X3N0NCAgKi8KICAzLCAvKiByZWdpc3Rlcl9vZmZzZXQgICovCiAgMywg LyogcmVnaXN0ZXJfc2V4dGVuZCAgKi8KICAzLCAvKiByZWdpc3Rlcl96ZXh0ZW5kICAqLwogIDIs IC8qIGltbV9vZmZzZXQgICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9hZGRyY29zdF90 YWJsZSBhNjRmeF9hZGRyY29zdF90YWJsZSA9CnsKICAgIHsKICAgICAgMSwgLyogaGkgICovCiAg ICAgIDEsIC8qIHNpICAqLwogICAgICAxLCAvKiBkaSAgKi8KICAgICAgMiwgLyogdGkgICovCiAg ICB9LAogIDAsIC8qIHByZV9tb2RpZnkgICovCiAgMCwgLyogcG9zdF9tb2RpZnkgICovCiAgMCwg LyogcG9zdF9tb2RpZnlfbGQzX3N0MyAgKi8KICAwLCAvKiBwb3N0X21vZGlmeV9sZDRfc3Q0ICAq LwogIDIsIC8qIHJlZ2lzdGVyX29mZnNldCAgKi8KICAzLCAvKiByZWdpc3Rlcl9zZXh0ZW5kICAq LwogIDMsIC8qIHJlZ2lzdGVyX3pleHRlbmQgICovCiAgMCwgLyogaW1tX29mZnNldCAgKi8KfTsK CnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2FkZHJjb3N0X3RhYmxlIG5lb3ZlcnNldjFfYWRkcmNv c3RfdGFibGUgPQp7CiAgICB7CiAgICAgIDEsIC8qIGhpICAqLwogICAgICAwLCAvKiBzaSAgKi8K ICAgICAgMCwgLyogZGkgICovCiAgICAgIDEsIC8qIHRpICAqLwogICAgfSwKICAwLCAvKiBwcmVf bW9kaWZ5ICAqLwogIDAsIC8qIHBvc3RfbW9kaWZ5ICAqLwogIDMsIC8qIHBvc3RfbW9kaWZ5X2xk M19zdDMgICovCiAgMywgLyogcG9zdF9tb2RpZnlfbGQ0X3N0NCAgKi8KICAwLCAvKiByZWdpc3Rl cl9vZmZzZXQgICovCiAgMCwgLyogcmVnaXN0ZXJfc2V4dGVuZCAgKi8KICAwLCAvKiByZWdpc3Rl cl96ZXh0ZW5kICAqLwogIDAgLyogaW1tX29mZnNldCAgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1 Y3QgY3B1X2FkZHJjb3N0X3RhYmxlIG5lb3ZlcnNlbjJfYWRkcmNvc3RfdGFibGUgPQp7CiAgICB7 CiAgICAgIDEsIC8qIGhpICAqLwogICAgICAwLCAvKiBzaSAgKi8KICAgICAgMCwgLyogZGkgICov CiAgICAgIDEsIC8qIHRpICAqLwogICAgfSwKICAwLCAvKiBwcmVfbW9kaWZ5ICAqLwogIDAsIC8q IHBvc3RfbW9kaWZ5ICAqLwogIDIsIC8qIHBvc3RfbW9kaWZ5X2xkM19zdDMgICovCiAgMiwgLyog cG9zdF9tb2RpZnlfbGQ0X3N0NCAgKi8KICAwLCAvKiByZWdpc3Rlcl9vZmZzZXQgICovCiAgMCwg LyogcmVnaXN0ZXJfc2V4dGVuZCAgKi8KICAwLCAvKiByZWdpc3Rlcl96ZXh0ZW5kICAqLwogIDAg LyogaW1tX29mZnNldCAgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2FkZHJjb3N0X3Rh YmxlIG5lb3ZlcnNldjJfYWRkcmNvc3RfdGFibGUgPQp7CiAgICB7CiAgICAgIDEsIC8qIGhpICAq LwogICAgICAwLCAvKiBzaSAgKi8KICAgICAgMCwgLyogZGkgICovCiAgICAgIDEsIC8qIHRpICAq LwogICAgfSwKICAwLCAvKiBwcmVfbW9kaWZ5ICAqLwogIDAsIC8qIHBvc3RfbW9kaWZ5ICAqLwog IDIsIC8qIHBvc3RfbW9kaWZ5X2xkM19zdDMgICovCiAgMiwgLyogcG9zdF9tb2RpZnlfbGQ0X3N0 NCAgKi8KICAwLCAvKiByZWdpc3Rlcl9vZmZzZXQgICovCiAgMCwgLyogcmVnaXN0ZXJfc2V4dGVu ZCAgKi8KICAwLCAvKiByZWdpc3Rlcl96ZXh0ZW5kICAqLwogIDAgLyogaW1tX29mZnNldCAgKi8K fTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X3JlZ21vdmVfY29zdCBnZW5lcmljX3JlZ21vdmVf Y29zdCA9CnsKICAxLCAvKiBHUDJHUCAgKi8KICAvKiBBdm9pZCB0aGUgdXNlIG9mIHNsb3cgaW50 PC0+ZnAgbW92ZXMgZm9yIHNwaWxsaW5nIGJ5IHNldHRpbmcKICAgICB0aGVpciBjb3N0IGhpZ2hl ciB0aGFuIG1lbW1vdl9jb3N0LiAgKi8KICA1LCAvKiBHUDJGUCAgKi8KICA1LCAvKiBGUDJHUCAg Ki8KICAyIC8qIEZQMkZQICAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfcmVnbW92ZV9j b3N0IGNvcnRleGE1N19yZWdtb3ZlX2Nvc3QgPQp7CiAgMSwgLyogR1AyR1AgICovCiAgLyogQXZv aWQgdGhlIHVzZSBvZiBzbG93IGludDwtPmZwIG1vdmVzIGZvciBzcGlsbGluZyBieSBzZXR0aW5n CiAgICAgdGhlaXIgY29zdCBoaWdoZXIgdGhhbiBtZW1tb3ZfY29zdC4gICovCiAgNSwgLyogR1Ay RlAgICovCiAgNSwgLyogRlAyR1AgICovCiAgMiAvKiBGUDJGUCAgKi8KfTsKCnN0YXRpYyBjb25z dCBzdHJ1Y3QgY3B1X3JlZ21vdmVfY29zdCBjb3J0ZXhhNTNfcmVnbW92ZV9jb3N0ID0KewogIDEs IC8qIEdQMkdQICAqLwogIC8qIEF2b2lkIHRoZSB1c2Ugb2Ygc2xvdyBpbnQ8LT5mcCBtb3ZlcyBm b3Igc3BpbGxpbmcgYnkgc2V0dGluZwogICAgIHRoZWlyIGNvc3QgaGlnaGVyIHRoYW4gbWVtbW92 X2Nvc3QuICAqLwogIDUsIC8qIEdQMkZQICAqLwogIDUsIC8qIEZQMkdQICAqLwogIDIgLyogRlAy RlAgICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9yZWdtb3ZlX2Nvc3QgZXh5bm9zbTFf cmVnbW92ZV9jb3N0ID0KewogIDEsIC8qIEdQMkdQICAqLwogIC8qIEF2b2lkIHRoZSB1c2Ugb2Yg c2xvdyBpbnQ8LT5mcCBtb3ZlcyBmb3Igc3BpbGxpbmcgYnkgc2V0dGluZwogICAgIHRoZWlyIGNv c3QgaGlnaGVyIHRoYW4gbWVtbW92X2Nvc3QgKGFjdHVhbCwgNCBhbmQgOSkuICAqLwogIDksIC8q IEdQMkZQICAqLwogIDksIC8qIEZQMkdQICAqLwogIDEgLyogRlAyRlAgICovCn07CgpzdGF0aWMg Y29uc3Qgc3RydWN0IGNwdV9yZWdtb3ZlX2Nvc3QgdGh1bmRlcnhfcmVnbW92ZV9jb3N0ID0Kewog IDIsIC8qIEdQMkdQICAqLwogIDIsIC8qIEdQMkZQICAqLwogIDYsIC8qIEZQMkdQICAqLwogIDQg LyogRlAyRlAgICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9yZWdtb3ZlX2Nvc3QgeGdl bmUxX3JlZ21vdmVfY29zdCA9CnsKICAxLCAvKiBHUDJHUCAgKi8KICAvKiBBdm9pZCB0aGUgdXNl IG9mIHNsb3cgaW50PC0+ZnAgbW92ZXMgZm9yIHNwaWxsaW5nIGJ5IHNldHRpbmcKICAgICB0aGVp ciBjb3N0IGhpZ2hlciB0aGFuIG1lbW1vdl9jb3N0LiAgKi8KICA4LCAvKiBHUDJGUCAgKi8KICA4 LCAvKiBGUDJHUCAgKi8KICAyIC8qIEZQMkZQICAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBj cHVfcmVnbW92ZV9jb3N0IHFkZjI0eHhfcmVnbW92ZV9jb3N0ID0KewogIDIsIC8qIEdQMkdQICAq LwogIC8qIEF2b2lkIHRoZSB1c2Ugb2YgaW50PC0+ZnAgbW92ZXMgZm9yIHNwaWxsaW5nLiAgKi8K ICA2LCAvKiBHUDJGUCAgKi8KICA2LCAvKiBGUDJHUCAgKi8KICA0IC8qIEZQMkZQICAqLwp9OwoK c3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfcmVnbW92ZV9jb3N0IHRodW5kZXJ4MnQ5OV9yZWdtb3Zl X2Nvc3QgPQp7CiAgMSwgLyogR1AyR1AgICovCiAgLyogQXZvaWQgdGhlIHVzZSBvZiBpbnQ8LT5m cCBtb3ZlcyBmb3Igc3BpbGxpbmcuICAqLwogIDUsIC8qIEdQMkZQICAqLwogIDYsIC8qIEZQMkdQ ICAqLwogIDMsIC8qIEZQMkZQICAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfcmVnbW92 ZV9jb3N0IHRodW5kZXJ4M3QxMTBfcmVnbW92ZV9jb3N0ID0KewogIDEsIC8qIEdQMkdQICAqLwog IC8qIEF2b2lkIHRoZSB1c2Ugb2YgaW50PC0+ZnAgbW92ZXMgZm9yIHNwaWxsaW5nLiAgKi8KICA0 LCAvKiBHUDJGUCAgKi8KICA1LCAvKiBGUDJHUCAgKi8KICA0ICAvKiBGUDJGUCAgKi8KfTsKCnN0 YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X3JlZ21vdmVfY29zdCB0c3YxMTBfcmVnbW92ZV9jb3N0ID0K ewogIDEsIC8qIEdQMkdQICAqLwogIC8qIEF2b2lkIHRoZSB1c2Ugb2Ygc2xvdyBpbnQ8LT5mcCBt b3ZlcyBmb3Igc3BpbGxpbmcgYnkgc2V0dGluZwogICAgIHRoZWlyIGNvc3QgaGlnaGVyIHRoYW4g bWVtbW92X2Nvc3QuICAqLwogIDIsIC8qIEdQMkZQICAqLwogIDMsIC8qIEZQMkdQICAqLwogIDIg IC8qIEZQMkZQICAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfcmVnbW92ZV9jb3N0IGE2 NGZ4X3JlZ21vdmVfY29zdCA9CnsKICAxLCAvKiBHUDJHUCAgKi8KICAvKiBBdm9pZCB0aGUgdXNl IG9mIHNsb3cgaW50PC0+ZnAgbW92ZXMgZm9yIHNwaWxsaW5nIGJ5IHNldHRpbmcKICAgICB0aGVp ciBjb3N0IGhpZ2hlciB0aGFuIG1lbW1vdl9jb3N0LiAgKi8KICA1LCAvKiBHUDJGUCAgKi8KICA3 LCAvKiBGUDJHUCAgKi8KICAyIC8qIEZQMkZQICAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBj cHVfcmVnbW92ZV9jb3N0IG5lb3ZlcnNlbjJfcmVnbW92ZV9jb3N0ID0KewogIDEsIC8qIEdQMkdQ ICAqLwogIC8qIFNwaWxsaW5nIHRvIGludDwtPmZwIGluc3RlYWQgb2YgbWVtb3J5IGlzIHJlY29t bWVuZGVkIHNvIHNldAogICAgIHJlYWxpc3RpYyBjb3N0cyBjb21wYXJlZCB0byBtZW1tb3ZfY29z dC4gICovCiAgMywgLyogR1AyRlAgICovCiAgMiwgLyogRlAyR1AgICovCiAgMiAvKiBGUDJGUCAg Ki8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X3JlZ21vdmVfY29zdCBuZW92ZXJzZXYxX3Jl Z21vdmVfY29zdCA9CnsKICAxLCAvKiBHUDJHUCAgKi8KICAvKiBTcGlsbGluZyB0byBpbnQ8LT5m cCBpbnN0ZWFkIG9mIG1lbW9yeSBpcyByZWNvbW1lbmRlZCBzbyBzZXQKICAgICByZWFsaXN0aWMg Y29zdHMgY29tcGFyZWQgdG8gbWVtbW92X2Nvc3QuICAqLwogIDMsIC8qIEdQMkZQICAqLwogIDIs IC8qIEZQMkdQICAqLwogIDIgLyogRlAyRlAgICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGNw dV9yZWdtb3ZlX2Nvc3QgbmVvdmVyc2V2Ml9yZWdtb3ZlX2Nvc3QgPQp7CiAgMSwgLyogR1AyR1Ag ICovCiAgLyogU3BpbGxpbmcgdG8gaW50PC0+ZnAgaW5zdGVhZCBvZiBtZW1vcnkgaXMgcmVjb21t ZW5kZWQgc28gc2V0CiAgICAgcmVhbGlzdGljIGNvc3RzIGNvbXBhcmVkIHRvIG1lbW1vdl9jb3N0 LiAgKi8KICAzLCAvKiBHUDJGUCAgKi8KICAyLCAvKiBGUDJHUCAgKi8KICAyIC8qIEZQMkZQICAq Lwp9OwoKLyogR2VuZXJpYyBjb3N0cyBmb3IgQWR2YW5jZWQgU0lNRCB2ZWN0b3Igb3BlcmF0aW9u cy4gICAqLwpzdGF0aWMgY29uc3QgYWR2c2ltZF92ZWNfY29zdCBnZW5lcmljX2FkdnNpbWRfdmVj dG9yX2Nvc3QgPQp7CiAgMSwgLyogaW50X3N0bXRfY29zdCAgKi8KICAxLCAvKiBmcF9zdG10X2Nv c3QgICovCiAgMCwgLyogbGQyX3N0Ml9wZXJtdXRlX2Nvc3QgICovCiAgMCwgLyogbGQzX3N0M19w ZXJtdXRlX2Nvc3QgICovCiAgMCwgLyogbGQ0X3N0NF9wZXJtdXRlX2Nvc3QgICovCiAgMiwgLyog cGVybXV0ZV9jb3N0ICAqLwogIDIsIC8qIHJlZHVjX2k4X2Nvc3QgICovCiAgMiwgLyogcmVkdWNf aTE2X2Nvc3QgICovCiAgMiwgLyogcmVkdWNfaTMyX2Nvc3QgICovCiAgMiwgLyogcmVkdWNfaTY0 X2Nvc3QgICovCiAgMiwgLyogcmVkdWNfZjE2X2Nvc3QgICovCiAgMiwgLyogcmVkdWNfZjMyX2Nv c3QgICovCiAgMiwgLyogcmVkdWNfZjY0X2Nvc3QgICovCiAgMiwgLyogc3RvcmVfZWx0X2V4dHJh X2Nvc3QgICovCiAgMiwgLyogdmVjX3RvX3NjYWxhcl9jb3N0ICAqLwogIDEsIC8qIHNjYWxhcl90 b192ZWNfY29zdCAgKi8KICAxLCAvKiBhbGlnbl9sb2FkX2Nvc3QgICovCiAgMSwgLyogdW5hbGln bl9sb2FkX2Nvc3QgICovCiAgMSwgLyogdW5hbGlnbl9zdG9yZV9jb3N0ICAqLwogIDEgIC8qIHN0 b3JlX2Nvc3QgICovCn07CgovKiBHZW5lcmljIGNvc3RzIGZvciBTVkUgdmVjdG9yIG9wZXJhdGlv bnMuICAqLwpzdGF0aWMgY29uc3Qgc3ZlX3ZlY19jb3N0IGdlbmVyaWNfc3ZlX3ZlY3Rvcl9jb3N0 ID0KewogIHsKICAgIDEsIC8qIGludF9zdG10X2Nvc3QgICovCiAgICAxLCAvKiBmcF9zdG10X2Nv c3QgICovCiAgICAwLCAvKiBsZDJfc3QyX3Blcm11dGVfY29zdCAgKi8KICAgIDAsIC8qIGxkM19z dDNfcGVybXV0ZV9jb3N0ICAqLwogICAgMCwgLyogbGQ0X3N0NF9wZXJtdXRlX2Nvc3QgICovCiAg ICAyLCAvKiBwZXJtdXRlX2Nvc3QgICovCiAgICAyLCAvKiByZWR1Y19pOF9jb3N0ICAqLwogICAg MiwgLyogcmVkdWNfaTE2X2Nvc3QgICovCiAgICAyLCAvKiByZWR1Y19pMzJfY29zdCAgKi8KICAg IDIsIC8qIHJlZHVjX2k2NF9jb3N0ICAqLwogICAgMiwgLyogcmVkdWNfZjE2X2Nvc3QgICovCiAg ICAyLCAvKiByZWR1Y19mMzJfY29zdCAgKi8KICAgIDIsIC8qIHJlZHVjX2Y2NF9jb3N0ICAqLwog ICAgMiwgLyogc3RvcmVfZWx0X2V4dHJhX2Nvc3QgICovCiAgICAyLCAvKiB2ZWNfdG9fc2NhbGFy X2Nvc3QgICovCiAgICAxLCAvKiBzY2FsYXJfdG9fdmVjX2Nvc3QgICovCiAgICAxLCAvKiBhbGln bl9sb2FkX2Nvc3QgICovCiAgICAxLCAvKiB1bmFsaWduX2xvYWRfY29zdCAgKi8KICAgIDEsIC8q IHVuYWxpZ25fc3RvcmVfY29zdCAgKi8KICAgIDEgIC8qIHN0b3JlX2Nvc3QgICovCiAgfSwKICAy LCAvKiBjbGFzdF9jb3N0ICAqLwogIDIsIC8qIGZhZGRhX2YxNl9jb3N0ICAqLwogIDIsIC8qIGZh ZGRhX2YzMl9jb3N0ICAqLwogIDIsIC8qIGZhZGRhX2Y2NF9jb3N0ICAqLwogIDQsIC8qIGdhdGhl cl9sb2FkX3gzMl9jb3N0ICAqLwogIDIsIC8qIGdhdGhlcl9sb2FkX3g2NF9jb3N0ICAqLwogIDEg Lyogc2NhdHRlcl9zdG9yZV9lbHRfY29zdCAgKi8KfTsKCi8qIEdlbmVyaWMgY29zdHMgZm9yIHZl Y3RvciBpbnNuIGNsYXNzZXMuICAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV92ZWN0b3JfY29z dCBnZW5lcmljX3ZlY3Rvcl9jb3N0ID0KewogIDEsIC8qIHNjYWxhcl9pbnRfc3RtdF9jb3N0ICAq LwogIDEsIC8qIHNjYWxhcl9mcF9zdG10X2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX2xvYWRfY29z dCAgKi8KICAxLCAvKiBzY2FsYXJfc3RvcmVfY29zdCAgKi8KICAzLCAvKiBjb25kX3Rha2VuX2Jy YW5jaF9jb3N0ICAqLwogIDEsIC8qIGNvbmRfbm90X3Rha2VuX2JyYW5jaF9jb3N0ICAqLwogICZn ZW5lcmljX2FkdnNpbWRfdmVjdG9yX2Nvc3QsIC8qIGFkdnNpbWQgICovCiAgJmdlbmVyaWNfc3Zl X3ZlY3Rvcl9jb3N0LCAvKiBzdmUgKi8KICBudWxscHRyIC8qIGlzc3VlX2luZm8gICovCn07Cgpz dGF0aWMgY29uc3QgYWR2c2ltZF92ZWNfY29zdCBhNjRmeF9hZHZzaW1kX3ZlY3Rvcl9jb3N0ID0K ewogIDIsIC8qIGludF9zdG10X2Nvc3QgICovCiAgNSwgLyogZnBfc3RtdF9jb3N0ICAqLwogIDAs IC8qIGxkMl9zdDJfcGVybXV0ZV9jb3N0ICAqLwogIDAsIC8qIGxkM19zdDNfcGVybXV0ZV9jb3N0 ICAqLwogIDAsIC8qIGxkNF9zdDRfcGVybXV0ZV9jb3N0ICAqLwogIDMsIC8qIHBlcm11dGVfY29z dCAgKi8KICAxMywgLyogcmVkdWNfaThfY29zdCAgKi8KICAxMywgLyogcmVkdWNfaTE2X2Nvc3Qg ICovCiAgMTMsIC8qIHJlZHVjX2kzMl9jb3N0ICAqLwogIDEzLCAvKiByZWR1Y19pNjRfY29zdCAg Ki8KICAxMywgLyogcmVkdWNfZjE2X2Nvc3QgICovCiAgMTMsIC8qIHJlZHVjX2YzMl9jb3N0ICAq LwogIDEzLCAvKiByZWR1Y19mNjRfY29zdCAgKi8KICAxMywgLyogc3RvcmVfZWx0X2V4dHJhX2Nv c3QgICovCiAgMTMsIC8qIHZlY190b19zY2FsYXJfY29zdCAgKi8KICA0LCAvKiBzY2FsYXJfdG9f dmVjX2Nvc3QgICovCiAgNiwgLyogYWxpZ25fbG9hZF9jb3N0ICAqLwogIDYsIC8qIHVuYWxpZ25f bG9hZF9jb3N0ICAqLwogIDEsIC8qIHVuYWxpZ25fc3RvcmVfY29zdCAgKi8KICAxICAvKiBzdG9y ZV9jb3N0ICAqLwp9OwoKc3RhdGljIGNvbnN0IHN2ZV92ZWNfY29zdCBhNjRmeF9zdmVfdmVjdG9y X2Nvc3QgPQp7CiAgewogICAgMiwgLyogaW50X3N0bXRfY29zdCAgKi8KICAgIDUsIC8qIGZwX3N0 bXRfY29zdCAgKi8KICAgIDAsIC8qIGxkMl9zdDJfcGVybXV0ZV9jb3N0ICAqLwogICAgMCwgLyog bGQzX3N0M19wZXJtdXRlX2Nvc3QgICovCiAgICAwLCAvKiBsZDRfc3Q0X3Blcm11dGVfY29zdCAg Ki8KICAgIDMsIC8qIHBlcm11dGVfY29zdCAgKi8KICAgIDEzLCAvKiByZWR1Y19pOF9jb3N0ICAq LwogICAgMTMsIC8qIHJlZHVjX2kxNl9jb3N0ICAqLwogICAgMTMsIC8qIHJlZHVjX2kzMl9jb3N0 ICAqLwogICAgMTMsIC8qIHJlZHVjX2k2NF9jb3N0ICAqLwogICAgMTMsIC8qIHJlZHVjX2YxNl9j b3N0ICAqLwogICAgMTMsIC8qIHJlZHVjX2YzMl9jb3N0ICAqLwogICAgMTMsIC8qIHJlZHVjX2Y2 NF9jb3N0ICAqLwogICAgMTMsIC8qIHN0b3JlX2VsdF9leHRyYV9jb3N0ICAqLwogICAgMTMsIC8q IHZlY190b19zY2FsYXJfY29zdCAgKi8KICAgIDQsIC8qIHNjYWxhcl90b192ZWNfY29zdCAgKi8K ICAgIDYsIC8qIGFsaWduX2xvYWRfY29zdCAgKi8KICAgIDYsIC8qIHVuYWxpZ25fbG9hZF9jb3N0 ICAqLwogICAgMSwgLyogdW5hbGlnbl9zdG9yZV9jb3N0ICAqLwogICAgMSAgLyogc3RvcmVfY29z dCAgKi8KICB9LAogIDEzLCAvKiBjbGFzdF9jb3N0ICAqLwogIDEzLCAvKiBmYWRkYV9mMTZfY29z dCAgKi8KICAxMywgLyogZmFkZGFfZjMyX2Nvc3QgICovCiAgMTMsIC8qIGZhZGRhX2Y2NF9jb3N0 ICAqLwogIDY0LCAvKiBnYXRoZXJfbG9hZF94MzJfY29zdCAgKi8KICAzMiwgLyogZ2F0aGVyX2xv YWRfeDY0X2Nvc3QgICovCiAgMSAvKiBzY2F0dGVyX3N0b3JlX2VsdF9jb3N0ICAqLwp9OwoKc3Rh dGljIGNvbnN0IHN0cnVjdCBjcHVfdmVjdG9yX2Nvc3QgYTY0ZnhfdmVjdG9yX2Nvc3QgPQp7CiAg MSwgLyogc2NhbGFyX2ludF9zdG10X2Nvc3QgICovCiAgNSwgLyogc2NhbGFyX2ZwX3N0bXRfY29z dCAgKi8KICA0LCAvKiBzY2FsYXJfbG9hZF9jb3N0ICAqLwogIDEsIC8qIHNjYWxhcl9zdG9yZV9j b3N0ICAqLwogIDMsIC8qIGNvbmRfdGFrZW5fYnJhbmNoX2Nvc3QgICovCiAgMSwgLyogY29uZF9u b3RfdGFrZW5fYnJhbmNoX2Nvc3QgICovCiAgJmE2NGZ4X2FkdnNpbWRfdmVjdG9yX2Nvc3QsIC8q IGFkdnNpbWQgICovCiAgJmE2NGZ4X3N2ZV92ZWN0b3JfY29zdCwgLyogc3ZlICAqLwogIG51bGxw dHIgLyogaXNzdWVfaW5mbyAgKi8KfTsKCnN0YXRpYyBjb25zdCBhZHZzaW1kX3ZlY19jb3N0IHFk ZjI0eHhfYWR2c2ltZF92ZWN0b3JfY29zdCA9CnsKICAxLCAvKiBpbnRfc3RtdF9jb3N0ICAqLwog IDMsIC8qIGZwX3N0bXRfY29zdCAgKi8KICAwLCAvKiBsZDJfc3QyX3Blcm11dGVfY29zdCAgKi8K ICAwLCAvKiBsZDNfc3QzX3Blcm11dGVfY29zdCAgKi8KICAwLCAvKiBsZDRfc3Q0X3Blcm11dGVf Y29zdCAgKi8KICAyLCAvKiBwZXJtdXRlX2Nvc3QgICovCiAgMSwgLyogcmVkdWNfaThfY29zdCAg Ki8KICAxLCAvKiByZWR1Y19pMTZfY29zdCAgKi8KICAxLCAvKiByZWR1Y19pMzJfY29zdCAgKi8K ICAxLCAvKiByZWR1Y19pNjRfY29zdCAgKi8KICAxLCAvKiByZWR1Y19mMTZfY29zdCAgKi8KICAx LCAvKiByZWR1Y19mMzJfY29zdCAgKi8KICAxLCAvKiByZWR1Y19mNjRfY29zdCAgKi8KICAxLCAv KiBzdG9yZV9lbHRfZXh0cmFfY29zdCAgKi8KICAxLCAvKiB2ZWNfdG9fc2NhbGFyX2Nvc3QgICov CiAgMSwgLyogc2NhbGFyX3RvX3ZlY19jb3N0ICAqLwogIDEsIC8qIGFsaWduX2xvYWRfY29zdCAg Ki8KICAxLCAvKiB1bmFsaWduX2xvYWRfY29zdCAgKi8KICAxLCAvKiB1bmFsaWduX3N0b3JlX2Nv c3QgICovCiAgMSAgLyogc3RvcmVfY29zdCAgKi8KfTsKCi8qIFFERjI0WFggY29zdHMgZm9yIHZl Y3RvciBpbnNuIGNsYXNzZXMuICAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV92ZWN0b3JfY29z dCBxZGYyNHh4X3ZlY3Rvcl9jb3N0ID0KewogIDEsIC8qIHNjYWxhcl9pbnRfc3RtdF9jb3N0ICAq LwogIDEsIC8qIHNjYWxhcl9mcF9zdG10X2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX2xvYWRfY29z dCAgKi8KICAxLCAvKiBzY2FsYXJfc3RvcmVfY29zdCAgKi8KICAzLCAvKiBjb25kX3Rha2VuX2Jy YW5jaF9jb3N0ICAqLwogIDEsIC8qIGNvbmRfbm90X3Rha2VuX2JyYW5jaF9jb3N0ICAqLwogICZx ZGYyNHh4X2FkdnNpbWRfdmVjdG9yX2Nvc3QsIC8qIGFkdnNpbWQgICovCiAgbnVsbHB0ciwgLyog c3ZlICAqLwogIG51bGxwdHIgLyogaXNzdWVfaW5mbyAgKi8KfTsKCgpzdGF0aWMgY29uc3QgYWR2 c2ltZF92ZWNfY29zdCB0aHVuZGVyeF9hZHZzaW1kX3ZlY3Rvcl9jb3N0ID0KewogIDQsIC8qIGlu dF9zdG10X2Nvc3QgICovCiAgMSwgLyogZnBfc3RtdF9jb3N0ICAqLwogIDAsIC8qIGxkMl9zdDJf cGVybXV0ZV9jb3N0ICAqLwogIDAsIC8qIGxkM19zdDNfcGVybXV0ZV9jb3N0ICAqLwogIDAsIC8q IGxkNF9zdDRfcGVybXV0ZV9jb3N0ICAqLwogIDQsIC8qIHBlcm11dGVfY29zdCAgKi8KICAyLCAv KiByZWR1Y19pOF9jb3N0ICAqLwogIDIsIC8qIHJlZHVjX2kxNl9jb3N0ICAqLwogIDIsIC8qIHJl ZHVjX2kzMl9jb3N0ICAqLwogIDIsIC8qIHJlZHVjX2k2NF9jb3N0ICAqLwogIDIsIC8qIHJlZHVj X2YxNl9jb3N0ICAqLwogIDIsIC8qIHJlZHVjX2YzMl9jb3N0ICAqLwogIDIsIC8qIHJlZHVjX2Y2 NF9jb3N0ICAqLwogIDIsIC8qIHN0b3JlX2VsdF9leHRyYV9jb3N0ICAqLwogIDIsIC8qIHZlY190 b19zY2FsYXJfY29zdCAgKi8KICAyLCAvKiBzY2FsYXJfdG9fdmVjX2Nvc3QgICovCiAgMywgLyog YWxpZ25fbG9hZF9jb3N0ICAqLwogIDUsIC8qIHVuYWxpZ25fbG9hZF9jb3N0ICAqLwogIDUsIC8q IHVuYWxpZ25fc3RvcmVfY29zdCAgKi8KICAxICAvKiBzdG9yZV9jb3N0ICAqLwp9OwoKLyogVGh1 bmRlclggY29zdHMgZm9yIHZlY3RvciBpbnNuIGNsYXNzZXMuICAqLwpzdGF0aWMgY29uc3Qgc3Ry dWN0IGNwdV92ZWN0b3JfY29zdCB0aHVuZGVyeF92ZWN0b3JfY29zdCA9CnsKICAxLCAvKiBzY2Fs YXJfaW50X3N0bXRfY29zdCAgKi8KICAxLCAvKiBzY2FsYXJfZnBfc3RtdF9jb3N0ICAqLwogIDMs IC8qIHNjYWxhcl9sb2FkX2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX3N0b3JlX2Nvc3QgICovCiAg MywgLyogY29uZF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAzLCAvKiBjb25kX25vdF90YWtlbl9i cmFuY2hfY29zdCAgKi8KICAmdGh1bmRlcnhfYWR2c2ltZF92ZWN0b3JfY29zdCwgLyogYWR2c2lt ZCAgKi8KICBudWxscHRyLCAvKiBzdmUgICovCiAgbnVsbHB0ciAvKiBpc3N1ZV9pbmZvICAqLwp9 OwoKc3RhdGljIGNvbnN0IGFkdnNpbWRfdmVjX2Nvc3QgdHN2MTEwX2FkdnNpbWRfdmVjdG9yX2Nv c3QgPQp7CiAgMiwgLyogaW50X3N0bXRfY29zdCAgKi8KICAyLCAvKiBmcF9zdG10X2Nvc3QgICov CiAgMCwgLyogbGQyX3N0Ml9wZXJtdXRlX2Nvc3QgICovCiAgMCwgLyogbGQzX3N0M19wZXJtdXRl X2Nvc3QgICovCiAgMCwgLyogbGQ0X3N0NF9wZXJtdXRlX2Nvc3QgICovCiAgMiwgLyogcGVybXV0 ZV9jb3N0ICAqLwogIDMsIC8qIHJlZHVjX2k4X2Nvc3QgICovCiAgMywgLyogcmVkdWNfaTE2X2Nv c3QgICovCiAgMywgLyogcmVkdWNfaTMyX2Nvc3QgICovCiAgMywgLyogcmVkdWNfaTY0X2Nvc3Qg ICovCiAgMywgLyogcmVkdWNfZjE2X2Nvc3QgICovCiAgMywgLyogcmVkdWNfZjMyX2Nvc3QgICov CiAgMywgLyogcmVkdWNfZjY0X2Nvc3QgICovCiAgMywgLyogc3RvcmVfZWx0X2V4dHJhX2Nvc3Qg ICovCiAgMywgLyogdmVjX3RvX3NjYWxhcl9jb3N0ICAqLwogIDIsIC8qIHNjYWxhcl90b192ZWNf Y29zdCAgKi8KICA1LCAvKiBhbGlnbl9sb2FkX2Nvc3QgICovCiAgNSwgLyogdW5hbGlnbl9sb2Fk X2Nvc3QgICovCiAgMSwgLyogdW5hbGlnbl9zdG9yZV9jb3N0ICAqLwogIDEgIC8qIHN0b3JlX2Nv c3QgICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV92ZWN0b3JfY29zdCB0c3YxMTBfdmVj dG9yX2Nvc3QgPQp7CiAgMSwgLyogc2NhbGFyX2ludF9zdG10X2Nvc3QgICovCiAgMSwgLyogc2Nh bGFyX2ZwX3N0bXRfY29zdCAgKi8KICA1LCAvKiBzY2FsYXJfbG9hZF9jb3N0ICAqLwogIDEsIC8q IHNjYWxhcl9zdG9yZV9jb3N0ICAqLwogIDEsIC8qIGNvbmRfdGFrZW5fYnJhbmNoX2Nvc3QgICov CiAgMSwgLyogY29uZF9ub3RfdGFrZW5fYnJhbmNoX2Nvc3QgICovCiAgJnRzdjExMF9hZHZzaW1k X3ZlY3Rvcl9jb3N0LCAvKiBhZHZzaW1kICAqLwogIG51bGxwdHIsIC8qIHN2ZSAgKi8KICBudWxs cHRyIC8qIGlzc3VlX2luZm8gICovCn07CgpzdGF0aWMgY29uc3QgYWR2c2ltZF92ZWNfY29zdCBj b3J0ZXhhNTdfYWR2c2ltZF92ZWN0b3JfY29zdCA9CnsKICAyLCAvKiBpbnRfc3RtdF9jb3N0ICAq LwogIDIsIC8qIGZwX3N0bXRfY29zdCAgKi8KICAwLCAvKiBsZDJfc3QyX3Blcm11dGVfY29zdCAg Ki8KICAwLCAvKiBsZDNfc3QzX3Blcm11dGVfY29zdCAgKi8KICAwLCAvKiBsZDRfc3Q0X3Blcm11 dGVfY29zdCAgKi8KICAzLCAvKiBwZXJtdXRlX2Nvc3QgICovCiAgOCwgLyogcmVkdWNfaThfY29z dCAgKi8KICA4LCAvKiByZWR1Y19pMTZfY29zdCAgKi8KICA4LCAvKiByZWR1Y19pMzJfY29zdCAg Ki8KICA4LCAvKiByZWR1Y19pNjRfY29zdCAgKi8KICA4LCAvKiByZWR1Y19mMTZfY29zdCAgKi8K ICA4LCAvKiByZWR1Y19mMzJfY29zdCAgKi8KICA4LCAvKiByZWR1Y19mNjRfY29zdCAgKi8KICA4 LCAvKiBzdG9yZV9lbHRfZXh0cmFfY29zdCAgKi8KICA4LCAvKiB2ZWNfdG9fc2NhbGFyX2Nvc3Qg ICovCiAgOCwgLyogc2NhbGFyX3RvX3ZlY19jb3N0ICAqLwogIDQsIC8qIGFsaWduX2xvYWRfY29z dCAgKi8KICA0LCAvKiB1bmFsaWduX2xvYWRfY29zdCAgKi8KICAxLCAvKiB1bmFsaWduX3N0b3Jl X2Nvc3QgICovCiAgMSAgLyogc3RvcmVfY29zdCAgKi8KfTsKCi8qIENvcnRleC1BNTcgY29zdHMg Zm9yIHZlY3RvciBpbnNuIGNsYXNzZXMuICAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV92ZWN0 b3JfY29zdCBjb3J0ZXhhNTdfdmVjdG9yX2Nvc3QgPQp7CiAgMSwgLyogc2NhbGFyX2ludF9zdG10 X2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX2ZwX3N0bXRfY29zdCAgKi8KICA0LCAvKiBzY2FsYXJf bG9hZF9jb3N0ICAqLwogIDEsIC8qIHNjYWxhcl9zdG9yZV9jb3N0ICAqLwogIDEsIC8qIGNvbmRf dGFrZW5fYnJhbmNoX2Nvc3QgICovCiAgMSwgLyogY29uZF9ub3RfdGFrZW5fYnJhbmNoX2Nvc3Qg ICovCiAgJmNvcnRleGE1N19hZHZzaW1kX3ZlY3Rvcl9jb3N0LCAvKiBhZHZzaW1kICAqLwogIG51 bGxwdHIsIC8qIHN2ZSAgKi8KICBudWxscHRyIC8qIGlzc3VlX2luZm8gICovCn07CgpzdGF0aWMg Y29uc3QgYWR2c2ltZF92ZWNfY29zdCBleHlub3NtMV9hZHZzaW1kX3ZlY3Rvcl9jb3N0ID0Kewog IDMsIC8qIGludF9zdG10X2Nvc3QgICovCiAgMywgLyogZnBfc3RtdF9jb3N0ICAqLwogIDAsIC8q IGxkMl9zdDJfcGVybXV0ZV9jb3N0ICAqLwogIDAsIC8qIGxkM19zdDNfcGVybXV0ZV9jb3N0ICAq LwogIDAsIC8qIGxkNF9zdDRfcGVybXV0ZV9jb3N0ICAqLwogIDMsIC8qIHBlcm11dGVfY29zdCAg Ki8KICAzLCAvKiByZWR1Y19pOF9jb3N0ICAqLwogIDMsIC8qIHJlZHVjX2kxNl9jb3N0ICAqLwog IDMsIC8qIHJlZHVjX2kzMl9jb3N0ICAqLwogIDMsIC8qIHJlZHVjX2k2NF9jb3N0ICAqLwogIDMs IC8qIHJlZHVjX2YxNl9jb3N0ICAqLwogIDMsIC8qIHJlZHVjX2YzMl9jb3N0ICAqLwogIDMsIC8q IHJlZHVjX2Y2NF9jb3N0ICAqLwogIDMsIC8qIHN0b3JlX2VsdF9leHRyYV9jb3N0ICAqLwogIDMs IC8qIHZlY190b19zY2FsYXJfY29zdCAgKi8KICAzLCAvKiBzY2FsYXJfdG9fdmVjX2Nvc3QgICov CiAgNSwgLyogYWxpZ25fbG9hZF9jb3N0ICAqLwogIDUsIC8qIHVuYWxpZ25fbG9hZF9jb3N0ICAq LwogIDEsIC8qIHVuYWxpZ25fc3RvcmVfY29zdCAgKi8KICAxICAvKiBzdG9yZV9jb3N0ICAqLwp9 OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfdmVjdG9yX2Nvc3QgZXh5bm9zbTFfdmVjdG9yX2Nv c3QgPQp7CiAgMSwgLyogc2NhbGFyX2ludF9zdG10X2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX2Zw X3N0bXRfY29zdCAgKi8KICA1LCAvKiBzY2FsYXJfbG9hZF9jb3N0ICAqLwogIDEsIC8qIHNjYWxh cl9zdG9yZV9jb3N0ICAqLwogIDEsIC8qIGNvbmRfdGFrZW5fYnJhbmNoX2Nvc3QgICovCiAgMSwg LyogY29uZF9ub3RfdGFrZW5fYnJhbmNoX2Nvc3QgICovCiAgJmV4eW5vc20xX2FkdnNpbWRfdmVj dG9yX2Nvc3QsIC8qIGFkdnNpbWQgICovCiAgbnVsbHB0ciwgLyogc3ZlICAqLwogIG51bGxwdHIg LyogaXNzdWVfaW5mbyAgKi8KfTsKCnN0YXRpYyBjb25zdCBhZHZzaW1kX3ZlY19jb3N0IHhnZW5l MV9hZHZzaW1kX3ZlY3Rvcl9jb3N0ID0KewogIDIsIC8qIGludF9zdG10X2Nvc3QgICovCiAgMiwg LyogZnBfc3RtdF9jb3N0ICAqLwogIDAsIC8qIGxkMl9zdDJfcGVybXV0ZV9jb3N0ICAqLwogIDAs IC8qIGxkM19zdDNfcGVybXV0ZV9jb3N0ICAqLwogIDAsIC8qIGxkNF9zdDRfcGVybXV0ZV9jb3N0 ICAqLwogIDIsIC8qIHBlcm11dGVfY29zdCAgKi8KICA0LCAvKiByZWR1Y19pOF9jb3N0ICAqLwog IDQsIC8qIHJlZHVjX2kxNl9jb3N0ICAqLwogIDQsIC8qIHJlZHVjX2kzMl9jb3N0ICAqLwogIDQs IC8qIHJlZHVjX2k2NF9jb3N0ICAqLwogIDQsIC8qIHJlZHVjX2YxNl9jb3N0ICAqLwogIDQsIC8q IHJlZHVjX2YzMl9jb3N0ICAqLwogIDQsIC8qIHJlZHVjX2Y2NF9jb3N0ICAqLwogIDQsIC8qIHN0 b3JlX2VsdF9leHRyYV9jb3N0ICAqLwogIDQsIC8qIHZlY190b19zY2FsYXJfY29zdCAgKi8KICA0 LCAvKiBzY2FsYXJfdG9fdmVjX2Nvc3QgICovCiAgMTAsIC8qIGFsaWduX2xvYWRfY29zdCAgKi8K ICAxMCwgLyogdW5hbGlnbl9sb2FkX2Nvc3QgICovCiAgMiwgLyogdW5hbGlnbl9zdG9yZV9jb3N0 ICAqLwogIDIgIC8qIHN0b3JlX2Nvc3QgICovCn07CgovKiBHZW5lcmljIGNvc3RzIGZvciB2ZWN0 b3IgaW5zbiBjbGFzc2VzLiAgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfdmVjdG9yX2Nvc3Qg eGdlbmUxX3ZlY3Rvcl9jb3N0ID0KewogIDEsIC8qIHNjYWxhcl9pbnRfc3RtdF9jb3N0ICAqLwog IDEsIC8qIHNjYWxhcl9mcF9zdG10X2Nvc3QgICovCiAgNSwgLyogc2NhbGFyX2xvYWRfY29zdCAg Ki8KICAxLCAvKiBzY2FsYXJfc3RvcmVfY29zdCAgKi8KICAyLCAvKiBjb25kX3Rha2VuX2JyYW5j aF9jb3N0ICAqLwogIDEsIC8qIGNvbmRfbm90X3Rha2VuX2JyYW5jaF9jb3N0ICAqLwogICZ4Z2Vu ZTFfYWR2c2ltZF92ZWN0b3JfY29zdCwgLyogYWR2c2ltZCAgKi8KICBudWxscHRyLCAvKiBzdmUg ICovCiAgbnVsbHB0ciAvKiBpc3N1ZV9pbmZvICAqLwp9OwoKc3RhdGljIGNvbnN0IGFkdnNpbWRf dmVjX2Nvc3QgdGh1bmRlcngydDk5X2FkdnNpbWRfdmVjdG9yX2Nvc3QgPQp7CiAgNCwgLyogaW50 X3N0bXRfY29zdCAgKi8KICA1LCAvKiBmcF9zdG10X2Nvc3QgICovCiAgMCwgLyogbGQyX3N0Ml9w ZXJtdXRlX2Nvc3QgICovCiAgMCwgLyogbGQzX3N0M19wZXJtdXRlX2Nvc3QgICovCiAgMCwgLyog bGQ0X3N0NF9wZXJtdXRlX2Nvc3QgICovCiAgMTAsIC8qIHBlcm11dGVfY29zdCAgKi8KICA2LCAv KiByZWR1Y19pOF9jb3N0ICAqLwogIDYsIC8qIHJlZHVjX2kxNl9jb3N0ICAqLwogIDYsIC8qIHJl ZHVjX2kzMl9jb3N0ICAqLwogIDYsIC8qIHJlZHVjX2k2NF9jb3N0ICAqLwogIDYsIC8qIHJlZHVj X2YxNl9jb3N0ICAqLwogIDYsIC8qIHJlZHVjX2YzMl9jb3N0ICAqLwogIDYsIC8qIHJlZHVjX2Y2 NF9jb3N0ICAqLwogIDYsIC8qIHN0b3JlX2VsdF9leHRyYV9jb3N0ICAqLwogIDYsIC8qIHZlY190 b19zY2FsYXJfY29zdCAgKi8KICA1LCAvKiBzY2FsYXJfdG9fdmVjX2Nvc3QgICovCiAgNCwgLyog YWxpZ25fbG9hZF9jb3N0ICAqLwogIDQsIC8qIHVuYWxpZ25fbG9hZF9jb3N0ICAqLwogIDEsIC8q IHVuYWxpZ25fc3RvcmVfY29zdCAgKi8KICAxICAvKiBzdG9yZV9jb3N0ICAqLwp9OwoKLyogQ29z dHMgZm9yIHZlY3RvciBpbnNuIGNsYXNzZXMgZm9yIFZ1bGNhbi4gICovCnN0YXRpYyBjb25zdCBz dHJ1Y3QgY3B1X3ZlY3Rvcl9jb3N0IHRodW5kZXJ4MnQ5OV92ZWN0b3JfY29zdCA9CnsKICAxLCAv KiBzY2FsYXJfaW50X3N0bXRfY29zdCAgKi8KICA2LCAvKiBzY2FsYXJfZnBfc3RtdF9jb3N0ICAq LwogIDQsIC8qIHNjYWxhcl9sb2FkX2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX3N0b3JlX2Nvc3Qg ICovCiAgMiwgLyogY29uZF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAxLCAgLyogY29uZF9ub3Rf dGFrZW5fYnJhbmNoX2Nvc3QgICovCiAgJnRodW5kZXJ4MnQ5OV9hZHZzaW1kX3ZlY3Rvcl9jb3N0 LCAvKiBhZHZzaW1kICAqLwogIG51bGxwdHIsIC8qIHN2ZSAgKi8KICBudWxscHRyIC8qIGlzc3Vl X2luZm8gICovCn07CgpzdGF0aWMgY29uc3QgYWR2c2ltZF92ZWNfY29zdCB0aHVuZGVyeDN0MTEw X2FkdnNpbWRfdmVjdG9yX2Nvc3QgPQp7CiAgNSwgLyogaW50X3N0bXRfY29zdCAgKi8KICA1LCAv KiBmcF9zdG10X2Nvc3QgICovCiAgMCwgLyogbGQyX3N0Ml9wZXJtdXRlX2Nvc3QgICovCiAgMCwg LyogbGQzX3N0M19wZXJtdXRlX2Nvc3QgICovCiAgMCwgLyogbGQ0X3N0NF9wZXJtdXRlX2Nvc3Qg ICovCiAgMTAsIC8qIHBlcm11dGVfY29zdCAgKi8KICA1LCAvKiByZWR1Y19pOF9jb3N0ICAqLwog IDUsIC8qIHJlZHVjX2kxNl9jb3N0ICAqLwogIDUsIC8qIHJlZHVjX2kzMl9jb3N0ICAqLwogIDUs IC8qIHJlZHVjX2k2NF9jb3N0ICAqLwogIDUsIC8qIHJlZHVjX2YxNl9jb3N0ICAqLwogIDUsIC8q IHJlZHVjX2YzMl9jb3N0ICAqLwogIDUsIC8qIHJlZHVjX2Y2NF9jb3N0ICAqLwogIDUsIC8qIHN0 b3JlX2VsdF9leHRyYV9jb3N0ICAqLwogIDUsIC8qIHZlY190b19zY2FsYXJfY29zdCAgKi8KICA1 LCAvKiBzY2FsYXJfdG9fdmVjX2Nvc3QgICovCiAgNCwgLyogYWxpZ25fbG9hZF9jb3N0ICAqLwog IDQsIC8qIHVuYWxpZ25fbG9hZF9jb3N0ICAqLwogIDQsIC8qIHVuYWxpZ25fc3RvcmVfY29zdCAg Ki8KICA0ICAvKiBzdG9yZV9jb3N0ICAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfdmVj dG9yX2Nvc3QgdGh1bmRlcngzdDExMF92ZWN0b3JfY29zdCA9CnsKICAxLCAvKiBzY2FsYXJfaW50 X3N0bXRfY29zdCAgKi8KICA1LCAvKiBzY2FsYXJfZnBfc3RtdF9jb3N0ICAqLwogIDQsIC8qIHNj YWxhcl9sb2FkX2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX3N0b3JlX2Nvc3QgICovCiAgMiwgLyog Y29uZF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAxLCAgLyogY29uZF9ub3RfdGFrZW5fYnJhbmNo X2Nvc3QgICovCiAgJnRodW5kZXJ4M3QxMTBfYWR2c2ltZF92ZWN0b3JfY29zdCwgLyogYWR2c2lt ZCAgKi8KICBudWxscHRyLCAvKiBzdmUgICovCiAgbnVsbHB0ciAvKiBpc3N1ZV9pbmZvICAqLwp9 OwoKc3RhdGljIGNvbnN0IGFkdnNpbWRfdmVjX2Nvc3QgYW1wZXJlMV9hZHZzaW1kX3ZlY3Rvcl9j b3N0ID0KewogIDEsIC8qIGludF9zdG10X2Nvc3QgICovCiAgMywgLyogZnBfc3RtdF9jb3N0ICAq LwogIDAsIC8qIGxkMl9zdDJfcGVybXV0ZV9jb3N0ICAqLwogIDAsIC8qIGxkM19zdDNfcGVybXV0 ZV9jb3N0ICAqLwogIDAsIC8qIGxkNF9zdDRfcGVybXV0ZV9jb3N0ICAqLwogIDIsIC8qIHBlcm11 dGVfY29zdCAgKi8KICAxMiwgLyogcmVkdWNfaThfY29zdCAgKi8KICA5LCAvKiByZWR1Y19pMTZf Y29zdCAgKi8KICA2LCAvKiByZWR1Y19pMzJfY29zdCAgKi8KICA1LCAvKiByZWR1Y19pNjRfY29z dCAgKi8KICA5LCAvKiByZWR1Y19mMTZfY29zdCAgKi8KICA2LCAvKiByZWR1Y19mMzJfY29zdCAg Ki8KICA1LCAvKiByZWR1Y19mNjRfY29zdCAgKi8KICA4LCAvKiBzdG9yZV9lbHRfZXh0cmFfY29z dCAgKi8KICA2LCAvKiB2ZWNfdG9fc2NhbGFyX2Nvc3QgICovCiAgNywgLyogc2NhbGFyX3RvX3Zl Y19jb3N0ICAqLwogIDQsIC8qIGFsaWduX2xvYWRfY29zdCAgKi8KICA0LCAvKiB1bmFsaWduX2xv YWRfY29zdCAgKi8KICAxLCAvKiB1bmFsaWduX3N0b3JlX2Nvc3QgICovCiAgMSAgLyogc3RvcmVf Y29zdCAgKi8KfTsKCi8qIEFtcGVyZS0xIGNvc3RzIGZvciB2ZWN0b3IgaW5zbiBjbGFzc2VzLiAg Ki8Kc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfdmVjdG9yX2Nvc3QgYW1wZXJlMV92ZWN0b3JfY29z dCA9CnsKICAxLCAvKiBzY2FsYXJfaW50X3N0bXRfY29zdCAgKi8KICAzLCAvKiBzY2FsYXJfZnBf c3RtdF9jb3N0ICAqLwogIDQsIC8qIHNjYWxhcl9sb2FkX2Nvc3QgICovCiAgMSwgLyogc2NhbGFy X3N0b3JlX2Nvc3QgICovCiAgMSwgLyogY29uZF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAxLCAv KiBjb25kX25vdF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAmYW1wZXJlMV9hZHZzaW1kX3ZlY3Rv cl9jb3N0LCAvKiBhZHZzaW1kICAqLwogIG51bGxwdHIsIC8qIHN2ZSAgKi8KICBudWxscHRyICAv KiBpc3N1ZV9pbmZvICAqLwp9OwoKLyogR2VuZXJpYyBjb3N0cyBmb3IgYnJhbmNoIGluc3RydWN0 aW9ucy4gICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2JyYW5jaF9jb3N0IGdlbmVyaWNfYnJh bmNoX2Nvc3QgPQp7CiAgMSwgIC8qIFByZWRpY3RhYmxlLiAgKi8KICAzICAgLyogVW5wcmVkaWN0 YWJsZS4gICovCn07CgovKiBHZW5lcmljIGFwcHJveGltYXRpb24gbW9kZXMuICAqLwpzdGF0aWMg Y29uc3QgY3B1X2FwcHJveF9tb2RlcyBnZW5lcmljX2FwcHJveF9tb2RlcyA9CnsKICBBQVJDSDY0 X0FQUFJPWF9OT05FLAkvKiBkaXZpc2lvbiAgKi8KICBBQVJDSDY0X0FQUFJPWF9OT05FLAkvKiBz cXJ0ICAqLwogIEFBUkNINjRfQVBQUk9YX05PTkUJLyogcmVjaXBfc3FydCAgKi8KfTsKCi8qIEFw cHJveGltYXRpb24gbW9kZXMgZm9yIEV4eW5vcyBNMS4gICovCnN0YXRpYyBjb25zdCBjcHVfYXBw cm94X21vZGVzIGV4eW5vc20xX2FwcHJveF9tb2RlcyA9CnsKICBBQVJDSDY0X0FQUFJPWF9OT05F LAkvKiBkaXZpc2lvbiAgKi8KICBBQVJDSDY0X0FQUFJPWF9BTEwsCS8qIHNxcnQgICovCiAgQUFS Q0g2NF9BUFBST1hfQUxMCS8qIHJlY2lwX3NxcnQgICovCn07CgovKiBBcHByb3hpbWF0aW9uIG1v ZGVzIGZvciBYLUdlbmUgMS4gICovCnN0YXRpYyBjb25zdCBjcHVfYXBwcm94X21vZGVzIHhnZW5l MV9hcHByb3hfbW9kZXMgPQp7CiAgQUFSQ0g2NF9BUFBST1hfTk9ORSwJLyogZGl2aXNpb24gICov CiAgQUFSQ0g2NF9BUFBST1hfTk9ORSwJLyogc3FydCAgKi8KICBBQVJDSDY0X0FQUFJPWF9BTEwJ LyogcmVjaXBfc3FydCAgKi8KfTsKCi8qIEdlbmVyaWMgcHJlZmV0Y2ggc2V0dGluZ3MgKHdoaWNo IGRpc2FibGUgcHJlZmV0Y2gpLiAgKi8Kc3RhdGljIGNvbnN0IGNwdV9wcmVmZXRjaF90dW5lIGdl bmVyaWNfcHJlZmV0Y2hfdHVuZSA9CnsKICAwLAkJCS8qIG51bV9zbG90cyAgKi8KICAtMSwJCQkv KiBsMV9jYWNoZV9zaXplICAqLwogIC0xLAkJCS8qIGwxX2NhY2hlX2xpbmVfc2l6ZSAgKi8KICAt MSwJCQkvKiBsMl9jYWNoZV9zaXplICAqLwogIHRydWUsCQkJLyogcHJlZmV0Y2hfZHluYW1pY19z dHJpZGVzICovCiAgLTEsCQkJLyogbWluaW11bV9zdHJpZGUgKi8KICAtMQkJCS8qIGRlZmF1bHRf b3B0X2xldmVsICAqLwp9OwoKc3RhdGljIGNvbnN0IGNwdV9wcmVmZXRjaF90dW5lIGV4eW5vc20x X3ByZWZldGNoX3R1bmUgPQp7CiAgMCwJCQkvKiBudW1fc2xvdHMgICovCiAgLTEsCQkJLyogbDFf Y2FjaGVfc2l6ZSAgKi8KICA2NCwJCQkvKiBsMV9jYWNoZV9saW5lX3NpemUgICovCiAgLTEsCQkJ LyogbDJfY2FjaGVfc2l6ZSAgKi8KICB0cnVlLAkJCS8qIHByZWZldGNoX2R5bmFtaWNfc3RyaWRl cyAqLwogIC0xLAkJCS8qIG1pbmltdW1fc3RyaWRlICovCiAgLTEJCQkvKiBkZWZhdWx0X29wdF9s ZXZlbCAgKi8KfTsKCnN0YXRpYyBjb25zdCBjcHVfcHJlZmV0Y2hfdHVuZSBxZGYyNHh4X3ByZWZl dGNoX3R1bmUgPQp7CiAgNCwJCQkvKiBudW1fc2xvdHMgICovCiAgMzIsCQkJLyogbDFfY2FjaGVf c2l6ZSAgKi8KICA2NCwJCQkvKiBsMV9jYWNoZV9saW5lX3NpemUgICovCiAgNTEyLAkJCS8qIGwy X2NhY2hlX3NpemUgICovCiAgZmFsc2UsCQkvKiBwcmVmZXRjaF9keW5hbWljX3N0cmlkZXMgKi8K ICAyMDQ4LAkJCS8qIG1pbmltdW1fc3RyaWRlICovCiAgMwkJCS8qIGRlZmF1bHRfb3B0X2xldmVs ICAqLwp9OwoKc3RhdGljIGNvbnN0IGNwdV9wcmVmZXRjaF90dW5lIHRodW5kZXJ4dDg4X3ByZWZl dGNoX3R1bmUgPQp7CiAgOCwJCQkvKiBudW1fc2xvdHMgICovCiAgMzIsCQkJLyogbDFfY2FjaGVf c2l6ZSAgKi8KICAxMjgsCQkJLyogbDFfY2FjaGVfbGluZV9zaXplICAqLwogIDE2KjEwMjQsCQkv KiBsMl9jYWNoZV9zaXplICAqLwogIHRydWUsCQkJLyogcHJlZmV0Y2hfZHluYW1pY19zdHJpZGVz ICovCiAgLTEsCQkJLyogbWluaW11bV9zdHJpZGUgKi8KICAzCQkJLyogZGVmYXVsdF9vcHRfbGV2 ZWwgICovCn07CgpzdGF0aWMgY29uc3QgY3B1X3ByZWZldGNoX3R1bmUgdGh1bmRlcnhfcHJlZmV0 Y2hfdHVuZSA9CnsKICA4LAkJCS8qIG51bV9zbG90cyAgKi8KICAzMiwJCQkvKiBsMV9jYWNoZV9z aXplICAqLwogIDEyOCwJCQkvKiBsMV9jYWNoZV9saW5lX3NpemUgICovCiAgLTEsCQkJLyogbDJf Y2FjaGVfc2l6ZSAgKi8KICB0cnVlLAkJCS8qIHByZWZldGNoX2R5bmFtaWNfc3RyaWRlcyAqLwog IC0xLAkJCS8qIG1pbmltdW1fc3RyaWRlICovCiAgLTEJCQkvKiBkZWZhdWx0X29wdF9sZXZlbCAg Ki8KfTsKCnN0YXRpYyBjb25zdCBjcHVfcHJlZmV0Y2hfdHVuZSB0aHVuZGVyeDJ0OTlfcHJlZmV0 Y2hfdHVuZSA9CnsKICA4LAkJCS8qIG51bV9zbG90cyAgKi8KICAzMiwJCQkvKiBsMV9jYWNoZV9z aXplICAqLwogIDY0LAkJCS8qIGwxX2NhY2hlX2xpbmVfc2l6ZSAgKi8KICAyNTYsCQkJLyogbDJf Y2FjaGVfc2l6ZSAgKi8KICB0cnVlLAkJCS8qIHByZWZldGNoX2R5bmFtaWNfc3RyaWRlcyAqLwog IC0xLAkJCS8qIG1pbmltdW1fc3RyaWRlICovCiAgLTEJCQkvKiBkZWZhdWx0X29wdF9sZXZlbCAg Ki8KfTsKCnN0YXRpYyBjb25zdCBjcHVfcHJlZmV0Y2hfdHVuZSB0aHVuZGVyeDN0MTEwX3ByZWZl dGNoX3R1bmUgPQp7CiAgOCwJCQkvKiBudW1fc2xvdHMgICovCiAgMzIsCQkJLyogbDFfY2FjaGVf c2l6ZSAgKi8KICA2NCwJCQkvKiBsMV9jYWNoZV9saW5lX3NpemUgICovCiAgMjU2LAkJCS8qIGwy X2NhY2hlX3NpemUgICovCiAgdHJ1ZSwJCQkvKiBwcmVmZXRjaF9keW5hbWljX3N0cmlkZXMgKi8K ICAtMSwJCQkvKiBtaW5pbXVtX3N0cmlkZSAqLwogIC0xCQkJLyogZGVmYXVsdF9vcHRfbGV2ZWwg ICovCn07CgpzdGF0aWMgY29uc3QgY3B1X3ByZWZldGNoX3R1bmUgdHN2MTEwX3ByZWZldGNoX3R1 bmUgPQp7CiAgMCwgICAgICAgICAgICAgICAgICAgIC8qIG51bV9zbG90cyAgKi8KICA2NCwgICAg ICAgICAgICAgICAgICAgLyogbDFfY2FjaGVfc2l6ZSAgKi8KICA2NCwgICAgICAgICAgICAgICAg ICAgLyogbDFfY2FjaGVfbGluZV9zaXplICAqLwogIDUxMiwgICAgICAgICAgICAgICAgICAvKiBs Ml9jYWNoZV9zaXplICAqLwogIHRydWUsICAgICAgICAgICAgICAgICAvKiBwcmVmZXRjaF9keW5h bWljX3N0cmlkZXMgKi8KICAtMSwgICAgICAgICAgICAgICAgICAgLyogbWluaW11bV9zdHJpZGUg Ki8KICAtMSAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdF9vcHRfbGV2ZWwgICovCn07Cgpz dGF0aWMgY29uc3QgY3B1X3ByZWZldGNoX3R1bmUgeGdlbmUxX3ByZWZldGNoX3R1bmUgPQp7CiAg OCwJCQkvKiBudW1fc2xvdHMgICovCiAgMzIsCQkJLyogbDFfY2FjaGVfc2l6ZSAgKi8KICA2NCwJ CQkvKiBsMV9jYWNoZV9saW5lX3NpemUgICovCiAgMjU2LAkJCS8qIGwyX2NhY2hlX3NpemUgICov CiAgdHJ1ZSwgICAgICAgICAgICAgICAgIC8qIHByZWZldGNoX2R5bmFtaWNfc3RyaWRlcyAqLwog IC0xLCAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtX3N0cmlkZSAqLwogIC0xCQkJLyogZGVm YXVsdF9vcHRfbGV2ZWwgICovCn07CgpzdGF0aWMgY29uc3QgY3B1X3ByZWZldGNoX3R1bmUgYTY0 ZnhfcHJlZmV0Y2hfdHVuZSA9CnsKICA4LAkJCS8qIG51bV9zbG90cyAgKi8KICA2NCwJCQkvKiBs MV9jYWNoZV9zaXplICAqLwogIDI1NiwJCQkvKiBsMV9jYWNoZV9saW5lX3NpemUgICovCiAgMzI3 NjgsCQkvKiBsMl9jYWNoZV9zaXplICAqLwogIHRydWUsCQkJLyogcHJlZmV0Y2hfZHluYW1pY19z dHJpZGVzICovCiAgLTEsCQkJLyogbWluaW11bV9zdHJpZGUgKi8KICAtMQkJCS8qIGRlZmF1bHRf b3B0X2xldmVsICAqLwp9OwoKc3RhdGljIGNvbnN0IGNwdV9wcmVmZXRjaF90dW5lIGFtcGVyZTFf cHJlZmV0Y2hfdHVuZSA9CnsKICAwLAkJCS8qIG51bV9zbG90cyAgKi8KICA2NCwJCQkvKiBsMV9j YWNoZV9zaXplICAqLwogIDY0LAkJCS8qIGwxX2NhY2hlX2xpbmVfc2l6ZSAgKi8KICAyMDQ4LAkJ CS8qIGwyX2NhY2hlX3NpemUgICovCiAgdHJ1ZSwJCQkvKiBwcmVmZXRjaF9keW5hbWljX3N0cmlk ZXMgKi8KICAtMSwJCQkvKiBtaW5pbXVtX3N0cmlkZSAqLwogIC0xCQkJLyogZGVmYXVsdF9vcHRf bGV2ZWwgICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIGdlbmVyaWNfdHVu aW5ncyA9CnsKICAmY29ydGV4YTU3X2V4dHJhX2Nvc3RzLAogICZnZW5lcmljX2FkZHJjb3N0X3Rh YmxlLAogICZnZW5lcmljX3JlZ21vdmVfY29zdCwKICAmZ2VuZXJpY192ZWN0b3JfY29zdCwKICAm Z2VuZXJpY19icmFuY2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFX05PVF9J TVBMRU1FTlRFRCwgLyogc3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwogICAg NCwgLyogc3RvcmVfaW50LiAgKi8KICAgIDQsIC8qIGxvYWRfZnAuICAqLwogICAgNCwgLyogc3Rv cmVfZnAuICAqLwogICAgNCwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDQgLyogc3RvcmVfcHJlZC4g ICovCiAgfSwgLyogbWVtbW92X2Nvc3QuICAqLwogIDIsIC8qIGlzc3VlX3JhdGUgICovCiAgKEFB UkNINjRfRlVTRV9BRVNfQUVTTUMgfCBBQVJDSDY0X0ZVU0VfQ01QX0JSQU5DSCksIC8qIGZ1c2li bGVfb3BzICAqLwogICIxNjoxMiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8KICAiNCIsCS8qIGp1 bXBfYWxpZ24uICAqLwogICI4IiwJLyogbG9vcF9hbGlnbi4gICovCiAgMiwJLyogaW50X3JlYXNz b2Nfd2lkdGguICAqLwogIDQsCS8qIGZwX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8qIGZtYV9y ZWFzc29jX3dpZHRoLiAgKi8KICAxLAkvKiB2ZWNfcmVhc3NvY193aWR0aC4gICovCiAgMiwJLyog bWluX2Rpdl9yZWNpcF9tdWxfc2YuICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX2RmLiAg Ki8KICAwLAkvKiBtYXhfY2FzZV92YWx1ZXMuICAqLwogIHR1bmVfcGFyYW1zOjpBVVRPUFJFRkVU Q0hFUl9XRUFLLAkvKiBhdXRvcHJlZmV0Y2hlcl9tb2RlbC4gICovCiAgLyogRW5hYmxpbmcgQUFS Q0g2NF9FWFRSQV9UVU5FX0NTRV9TVkVfVkxfQ09OU1RBTlRTIHNpZ25pZmljYW50bHkgYmVuZWZp dHMKICAgICBOZW92ZXJzZSBWMS4gIEl0IGRvZXMgbm90IGhhdmUgYSBub3RpY2VhYmxlIGVmZmVj dCBvbiBBNjRGWCBhbmQgc2hvdWxkCiAgICAgaGF2ZSBhdCBtb3N0IGEgdmVyeSBtaW5vciBlZmZl Y3Qgb24gU1ZFMiBjb3Jlcy4gICovCiAgKEFBUkNINjRfRVhUUkFfVFVORV9DU0VfU1ZFX1ZMX0NP TlNUQU5UUyksCS8qIHR1bmVfZmxhZ3MuICAqLwogICZnZW5lcmljX3ByZWZldGNoX3R1bmUKfTsK CnN0YXRpYyBjb25zdCBzdHJ1Y3QgdHVuZV9wYXJhbXMgY29ydGV4YTM1X3R1bmluZ3MgPQp7CiAg JmNvcnRleGE1M19leHRyYV9jb3N0cywKICAmZ2VuZXJpY19hZGRyY29zdF90YWJsZSwKICAmY29y dGV4YTUzX3JlZ21vdmVfY29zdCwKICAmZ2VuZXJpY192ZWN0b3JfY29zdCwKICAmZ2VuZXJpY19i cmFuY2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFX05PVF9JTVBMRU1FTlRF RCwgLyogc3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwogICAgNCwgLyogc3Rv cmVfaW50LiAgKi8KICAgIDQsIC8qIGxvYWRfZnAuICAqLwogICAgNCwgLyogc3RvcmVfZnAuICAq LwogICAgNCwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDQgLyogc3RvcmVfcHJlZC4gICovCiAgfSwg LyogbWVtbW92X2Nvc3QuICAqLwogIDEsIC8qIGlzc3VlX3JhdGUgICovCiAgKEFBUkNINjRfRlVT RV9BRVNfQUVTTUMgfCBBQVJDSDY0X0ZVU0VfTU9WX01PVksgfCBBQVJDSDY0X0ZVU0VfQURSUF9B REQKICAgfCBBQVJDSDY0X0ZVU0VfTU9WS19NT1ZLIHwgQUFSQ0g2NF9GVVNFX0FEUlBfTERSKSwg LyogZnVzaWJsZV9vcHMgICovCiAgIjE2IiwJLyogZnVuY3Rpb25fYWxpZ24uICAqLwogICI0IiwJ LyoganVtcF9hbGlnbi4gICovCiAgIjgiLAkvKiBsb29wX2FsaWduLiAgKi8KICAyLAkvKiBpbnRf cmVhc3NvY193aWR0aC4gICovCiAgNCwJLyogZnBfcmVhc3NvY193aWR0aC4gICovCiAgMSwJLyog Zm1hX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8qIHZlY19yZWFzc29jX3dpZHRoLiAgKi8KICAy LAkvKiBtaW5fZGl2X3JlY2lwX211bF9zZi4gICovCiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxf ZGYuICAqLwogIDAsCS8qIG1heF9jYXNlX3ZhbHVlcy4gICovCiAgdHVuZV9wYXJhbXM6OkFVVE9Q UkVGRVRDSEVSX1dFQUssCS8qIGF1dG9wcmVmZXRjaGVyX21vZGVsLiAgKi8KICAoQUFSQ0g2NF9F WFRSQV9UVU5FX05PTkUpLAkvKiB0dW5lX2ZsYWdzLiAgKi8KICAmZ2VuZXJpY19wcmVmZXRjaF90 dW5lCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIGNvcnRleGE1M190dW5pbmdz ID0KewogICZjb3J0ZXhhNTNfZXh0cmFfY29zdHMsCiAgJmdlbmVyaWNfYWRkcmNvc3RfdGFibGUs CiAgJmNvcnRleGE1M19yZWdtb3ZlX2Nvc3QsCiAgJmdlbmVyaWNfdmVjdG9yX2Nvc3QsCiAgJmdl bmVyaWNfYnJhbmNoX2Nvc3QsCiAgJmdlbmVyaWNfYXBwcm94X21vZGVzLAogIFNWRV9OT1RfSU1Q TEVNRU5URUQsIC8qIHN2ZV93aWR0aCAgKi8KICB7IDQsIC8qIGxvYWRfaW50LiAgKi8KICAgIDQs IC8qIHN0b3JlX2ludC4gICovCiAgICA0LCAvKiBsb2FkX2ZwLiAgKi8KICAgIDQsIC8qIHN0b3Jl X2ZwLiAgKi8KICAgIDQsIC8qIGxvYWRfcHJlZC4gICovCiAgICA0IC8qIHN0b3JlX3ByZWQuICAq LwogIH0sIC8qIG1lbW1vdl9jb3N0LiAgKi8KICAyLCAvKiBpc3N1ZV9yYXRlICAqLwogIChBQVJD SDY0X0ZVU0VfQUVTX0FFU01DIHwgQUFSQ0g2NF9GVVNFX01PVl9NT1ZLIHwgQUFSQ0g2NF9GVVNF X0FEUlBfQURECiAgIHwgQUFSQ0g2NF9GVVNFX01PVktfTU9WSyB8IEFBUkNINjRfRlVTRV9BRFJQ X0xEUiksIC8qIGZ1c2libGVfb3BzICAqLwogICIxNiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8K ICAiNCIsCS8qIGp1bXBfYWxpZ24uICAqLwogICI4IiwJLyogbG9vcF9hbGlnbi4gICovCiAgMiwJ LyogaW50X3JlYXNzb2Nfd2lkdGguICAqLwogIDQsCS8qIGZwX3JlYXNzb2Nfd2lkdGguICAqLwog IDEsCS8qIGZtYV9yZWFzc29jX3dpZHRoLiAgKi8KICAxLAkvKiB2ZWNfcmVhc3NvY193aWR0aC4g ICovCiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxfc2YuICAqLwogIDIsCS8qIG1pbl9kaXZfcmVj aXBfbXVsX2RmLiAgKi8KICAwLAkvKiBtYXhfY2FzZV92YWx1ZXMuICAqLwogIHR1bmVfcGFyYW1z OjpBVVRPUFJFRkVUQ0hFUl9XRUFLLAkvKiBhdXRvcHJlZmV0Y2hlcl9tb2RlbC4gICovCiAgKEFB UkNINjRfRVhUUkFfVFVORV9OT05FKSwJLyogdHVuZV9mbGFncy4gICovCiAgJmdlbmVyaWNfcHJl ZmV0Y2hfdHVuZQp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB0dW5lX3BhcmFtcyBjb3J0ZXhhNTdf dHVuaW5ncyA9CnsKICAmY29ydGV4YTU3X2V4dHJhX2Nvc3RzLAogICZnZW5lcmljX2FkZHJjb3N0 X3RhYmxlLAogICZjb3J0ZXhhNTdfcmVnbW92ZV9jb3N0LAogICZjb3J0ZXhhNTdfdmVjdG9yX2Nv c3QsCiAgJmdlbmVyaWNfYnJhbmNoX2Nvc3QsCiAgJmdlbmVyaWNfYXBwcm94X21vZGVzLAogIFNW RV9OT1RfSU1QTEVNRU5URUQsIC8qIHN2ZV93aWR0aCAgKi8KICB7IDQsIC8qIGxvYWRfaW50LiAg Ki8KICAgIDQsIC8qIHN0b3JlX2ludC4gICovCiAgICA0LCAvKiBsb2FkX2ZwLiAgKi8KICAgIDQs IC8qIHN0b3JlX2ZwLiAgKi8KICAgIDQsIC8qIGxvYWRfcHJlZC4gICovCiAgICA0IC8qIHN0b3Jl X3ByZWQuICAqLwogIH0sIC8qIG1lbW1vdl9jb3N0LiAgKi8KICAzLCAvKiBpc3N1ZV9yYXRlICAq LwogIChBQVJDSDY0X0ZVU0VfQUVTX0FFU01DIHwgQUFSQ0g2NF9GVVNFX01PVl9NT1ZLIHwgQUFS Q0g2NF9GVVNFX0FEUlBfQURECiAgIHwgQUFSQ0g2NF9GVVNFX01PVktfTU9WSyksIC8qIGZ1c2li bGVfb3BzICAqLwogICIxNiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8KICAiNCIsCS8qIGp1bXBf YWxpZ24uICAqLwogICI4IiwJLyogbG9vcF9hbGlnbi4gICovCiAgMiwJLyogaW50X3JlYXNzb2Nf d2lkdGguICAqLwogIDQsCS8qIGZwX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8qIGZtYV9yZWFz c29jX3dpZHRoLiAgKi8KICAxLAkvKiB2ZWNfcmVhc3NvY193aWR0aC4gICovCiAgMiwJLyogbWlu X2Rpdl9yZWNpcF9tdWxfc2YuICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX2RmLiAgKi8K ICAwLAkvKiBtYXhfY2FzZV92YWx1ZXMuICAqLwogIHR1bmVfcGFyYW1zOjpBVVRPUFJFRkVUQ0hF Ul9XRUFLLAkvKiBhdXRvcHJlZmV0Y2hlcl9tb2RlbC4gICovCiAgKEFBUkNINjRfRVhUUkFfVFVO RV9SRU5BTUVfRk1BX1JFR1MpLAkvKiB0dW5lX2ZsYWdzLiAgKi8KICAmZ2VuZXJpY19wcmVmZXRj aF90dW5lCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIGNvcnRleGE3Ml90dW5p bmdzID0KewogICZjb3J0ZXhhNTdfZXh0cmFfY29zdHMsCiAgJmdlbmVyaWNfYWRkcmNvc3RfdGFi bGUsCiAgJmNvcnRleGE1N19yZWdtb3ZlX2Nvc3QsCiAgJmNvcnRleGE1N192ZWN0b3JfY29zdCwK ICAmZ2VuZXJpY19icmFuY2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFX05P VF9JTVBMRU1FTlRFRCwgLyogc3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwog ICAgNCwgLyogc3RvcmVfaW50LiAgKi8KICAgIDQsIC8qIGxvYWRfZnAuICAqLwogICAgNCwgLyog c3RvcmVfZnAuICAqLwogICAgNCwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDQgLyogc3RvcmVfcHJl ZC4gICovCiAgfSwgLyogbWVtbW92X2Nvc3QuICAqLwogIDMsIC8qIGlzc3VlX3JhdGUgICovCiAg KEFBUkNINjRfRlVTRV9BRVNfQUVTTUMgfCBBQVJDSDY0X0ZVU0VfTU9WX01PVksgfCBBQVJDSDY0 X0ZVU0VfQURSUF9BREQKICAgfCBBQVJDSDY0X0ZVU0VfTU9WS19NT1ZLKSwgLyogZnVzaWJsZV9v cHMgICovCiAgIjE2IiwJLyogZnVuY3Rpb25fYWxpZ24uICAqLwogICI0IiwJLyoganVtcF9hbGln bi4gICovCiAgIjgiLAkvKiBsb29wX2FsaWduLiAgKi8KICAyLAkvKiBpbnRfcmVhc3NvY193aWR0 aC4gICovCiAgNCwJLyogZnBfcmVhc3NvY193aWR0aC4gICovCiAgMSwJLyogZm1hX3JlYXNzb2Nf d2lkdGguICAqLwogIDEsCS8qIHZlY19yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiBtaW5fZGl2 X3JlY2lwX211bF9zZi4gICovCiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxfZGYuICAqLwogIDAs CS8qIG1heF9jYXNlX3ZhbHVlcy4gICovCiAgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVSX1dF QUssCS8qIGF1dG9wcmVmZXRjaGVyX21vZGVsLiAgKi8KICAoQUFSQ0g2NF9FWFRSQV9UVU5FX05P TkUpLAkvKiB0dW5lX2ZsYWdzLiAgKi8KICAmZ2VuZXJpY19wcmVmZXRjaF90dW5lCn07CgpzdGF0 aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIGNvcnRleGE3M190dW5pbmdzID0KewogICZjb3J0 ZXhhNTdfZXh0cmFfY29zdHMsCiAgJmdlbmVyaWNfYWRkcmNvc3RfdGFibGUsCiAgJmNvcnRleGE1 N19yZWdtb3ZlX2Nvc3QsCiAgJmNvcnRleGE1N192ZWN0b3JfY29zdCwKICAmZ2VuZXJpY19icmFu Y2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFX05PVF9JTVBMRU1FTlRFRCwg Lyogc3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwogICAgNCwgLyogc3RvcmVf aW50LiAgKi8KICAgIDQsIC8qIGxvYWRfZnAuICAqLwogICAgNCwgLyogc3RvcmVfZnAuICAqLwog ICAgNCwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDQgLyogc3RvcmVfcHJlZC4gICovCiAgfSwgLyog bWVtbW92X2Nvc3QuICAqLwogIDIsIC8qIGlzc3VlX3JhdGUuICAqLwogIChBQVJDSDY0X0ZVU0Vf QUVTX0FFU01DIHwgQUFSQ0g2NF9GVVNFX01PVl9NT1ZLIHwgQUFSQ0g2NF9GVVNFX0FEUlBfQURE CiAgIHwgQUFSQ0g2NF9GVVNFX01PVktfTU9WSyB8IEFBUkNINjRfRlVTRV9BRFJQX0xEUiksIC8q IGZ1c2libGVfb3BzICAqLwogICIxNiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8KICAiNCIsCS8q IGp1bXBfYWxpZ24uICAqLwogICI4IiwJLyogbG9vcF9hbGlnbi4gICovCiAgMiwJLyogaW50X3Jl YXNzb2Nfd2lkdGguICAqLwogIDQsCS8qIGZwX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8qIGZt YV9yZWFzc29jX3dpZHRoLiAgKi8KICAxLAkvKiB2ZWNfcmVhc3NvY193aWR0aC4gICovCiAgMiwJ LyogbWluX2Rpdl9yZWNpcF9tdWxfc2YuICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX2Rm LiAgKi8KICAwLAkvKiBtYXhfY2FzZV92YWx1ZXMuICAqLwogIHR1bmVfcGFyYW1zOjpBVVRPUFJF RkVUQ0hFUl9XRUFLLAkvKiBhdXRvcHJlZmV0Y2hlcl9tb2RlbC4gICovCiAgKEFBUkNINjRfRVhU UkFfVFVORV9OT05FKSwJLyogdHVuZV9mbGFncy4gICovCiAgJmdlbmVyaWNfcHJlZmV0Y2hfdHVu ZQp9OwoKCgpzdGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIGV4eW5vc20xX3R1bmluZ3Mg PQp7CiAgJmV4eW5vc20xX2V4dHJhX2Nvc3RzLAogICZleHlub3NtMV9hZGRyY29zdF90YWJsZSwK ICAmZXh5bm9zbTFfcmVnbW92ZV9jb3N0LAogICZleHlub3NtMV92ZWN0b3JfY29zdCwKICAmZ2Vu ZXJpY19icmFuY2hfY29zdCwKICAmZXh5bm9zbTFfYXBwcm94X21vZGVzLAogIFNWRV9OT1RfSU1Q TEVNRU5URUQsIC8qIHN2ZV93aWR0aCAgKi8KICB7IDQsIC8qIGxvYWRfaW50LiAgKi8KICAgIDQs IC8qIHN0b3JlX2ludC4gICovCiAgICA0LCAvKiBsb2FkX2ZwLiAgKi8KICAgIDQsIC8qIHN0b3Jl X2ZwLiAgKi8KICAgIDQsIC8qIGxvYWRfcHJlZC4gICovCiAgICA0IC8qIHN0b3JlX3ByZWQuICAq LwogIH0sIC8qIG1lbW1vdl9jb3N0LiAgKi8KICAzLAkvKiBpc3N1ZV9yYXRlICAqLwogIChBQVJD SDY0X0ZVU0VfQUVTX0FFU01DKSwgLyogZnVzaWJsZV9vcHMgICovCiAgIjQiLAkvKiBmdW5jdGlv bl9hbGlnbi4gICovCiAgIjQiLAkvKiBqdW1wX2FsaWduLiAgKi8KICAiNCIsCS8qIGxvb3BfYWxp Z24uICAqLwogIDIsCS8qIGludF9yZWFzc29jX3dpZHRoLiAgKi8KICA0LAkvKiBmcF9yZWFzc29j X3dpZHRoLiAgKi8KICAxLAkvKiBmbWFfcmVhc3NvY193aWR0aC4gICovCiAgMSwJLyogdmVjX3Jl YXNzb2Nfd2lkdGguICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX3NmLiAgKi8KICAyLAkv KiBtaW5fZGl2X3JlY2lwX211bF9kZi4gICovCiAgNDgsCS8qIG1heF9jYXNlX3ZhbHVlcy4gICov CiAgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVSX1dFQUssIC8qIGF1dG9wcmVmZXRjaGVyX21v ZGVsLiAgKi8KICAoQUFSQ0g2NF9FWFRSQV9UVU5FX05PTkUpLCAvKiB0dW5lX2ZsYWdzLiAgKi8K ICAmZXh5bm9zbTFfcHJlZmV0Y2hfdHVuZQp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB0dW5lX3Bh cmFtcyB0aHVuZGVyeHQ4OF90dW5pbmdzID0KewogICZ0aHVuZGVyeF9leHRyYV9jb3N0cywKICAm Z2VuZXJpY19hZGRyY29zdF90YWJsZSwKICAmdGh1bmRlcnhfcmVnbW92ZV9jb3N0LAogICZ0aHVu ZGVyeF92ZWN0b3JfY29zdCwKICAmZ2VuZXJpY19icmFuY2hfY29zdCwKICAmZ2VuZXJpY19hcHBy b3hfbW9kZXMsCiAgU1ZFX05PVF9JTVBMRU1FTlRFRCwgLyogc3ZlX3dpZHRoICAqLwogIHsgNiwg LyogbG9hZF9pbnQuICAqLwogICAgNiwgLyogc3RvcmVfaW50LiAgKi8KICAgIDYsIC8qIGxvYWRf ZnAuICAqLwogICAgNiwgLyogc3RvcmVfZnAuICAqLwogICAgNiwgLyogbG9hZF9wcmVkLiAgKi8K ICAgIDYgLyogc3RvcmVfcHJlZC4gICovCiAgfSwgLyogbWVtbW92X2Nvc3QuICAqLwogIDIsIC8q IGlzc3VlX3JhdGUgICovCiAgQUFSQ0g2NF9GVVNFX0FMVV9CUkFOQ0gsIC8qIGZ1c2libGVfb3Bz ICAqLwogICI4IiwJLyogZnVuY3Rpb25fYWxpZ24uICAqLwogICI4IiwJLyoganVtcF9hbGlnbi4g ICovCiAgIjgiLAkvKiBsb29wX2FsaWduLiAgKi8KICAyLAkvKiBpbnRfcmVhc3NvY193aWR0aC4g ICovCiAgNCwJLyogZnBfcmVhc3NvY193aWR0aC4gICovCiAgMSwJLyogZm1hX3JlYXNzb2Nfd2lk dGguICAqLwogIDEsCS8qIHZlY19yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiBtaW5fZGl2X3Jl Y2lwX211bF9zZi4gICovCiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxfZGYuICAqLwogIDAsCS8q IG1heF9jYXNlX3ZhbHVlcy4gICovCiAgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVSX09GRiwJ LyogYXV0b3ByZWZldGNoZXJfbW9kZWwuICAqLwogIChBQVJDSDY0X0VYVFJBX1RVTkVfU0xPV19V TkFMSUdORURfTERQVyksCS8qIHR1bmVfZmxhZ3MuICAqLwogICZ0aHVuZGVyeHQ4OF9wcmVmZXRj aF90dW5lCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIHRodW5kZXJ4X3R1bmlu Z3MgPQp7CiAgJnRodW5kZXJ4X2V4dHJhX2Nvc3RzLAogICZnZW5lcmljX2FkZHJjb3N0X3RhYmxl LAogICZ0aHVuZGVyeF9yZWdtb3ZlX2Nvc3QsCiAgJnRodW5kZXJ4X3ZlY3Rvcl9jb3N0LAogICZn ZW5lcmljX2JyYW5jaF9jb3N0LAogICZnZW5lcmljX2FwcHJveF9tb2RlcywKICBTVkVfTk9UX0lN UExFTUVOVEVELCAvKiBzdmVfd2lkdGggICovCiAgeyA2LCAvKiBsb2FkX2ludC4gICovCiAgICA2 LCAvKiBzdG9yZV9pbnQuICAqLwogICAgNiwgLyogbG9hZF9mcC4gICovCiAgICA2LCAvKiBzdG9y ZV9mcC4gICovCiAgICA2LCAvKiBsb2FkX3ByZWQuICAqLwogICAgNiAvKiBzdG9yZV9wcmVkLiAg Ki8KICB9LCAvKiBtZW1tb3ZfY29zdC4gICovCiAgMiwgLyogaXNzdWVfcmF0ZSAgKi8KICBBQVJD SDY0X0ZVU0VfQUxVX0JSQU5DSCwgLyogZnVzaWJsZV9vcHMgICovCiAgIjgiLAkvKiBmdW5jdGlv bl9hbGlnbi4gICovCiAgIjgiLAkvKiBqdW1wX2FsaWduLiAgKi8KICAiOCIsCS8qIGxvb3BfYWxp Z24uICAqLwogIDIsCS8qIGludF9yZWFzc29jX3dpZHRoLiAgKi8KICA0LAkvKiBmcF9yZWFzc29j X3dpZHRoLiAgKi8KICAxLAkvKiBmbWFfcmVhc3NvY193aWR0aC4gICovCiAgMSwJLyogdmVjX3Jl YXNzb2Nfd2lkdGguICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX3NmLiAgKi8KICAyLAkv KiBtaW5fZGl2X3JlY2lwX211bF9kZi4gICovCiAgMCwJLyogbWF4X2Nhc2VfdmFsdWVzLiAgKi8K ICB0dW5lX3BhcmFtczo6QVVUT1BSRUZFVENIRVJfT0ZGLAkvKiBhdXRvcHJlZmV0Y2hlcl9tb2Rl bC4gICovCiAgKEFBUkNINjRfRVhUUkFfVFVORV9TTE9XX1VOQUxJR05FRF9MRFBXCiAgIHwgQUFS Q0g2NF9FWFRSQV9UVU5FX0NIRUFQX1NISUZUX0VYVEVORCksCS8qIHR1bmVfZmxhZ3MuICAqLwog ICZ0aHVuZGVyeF9wcmVmZXRjaF90dW5lCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFy YW1zIHRzdjExMF90dW5pbmdzID0KewogICZ0c3YxMTBfZXh0cmFfY29zdHMsCiAgJnRzdjExMF9h ZGRyY29zdF90YWJsZSwKICAmdHN2MTEwX3JlZ21vdmVfY29zdCwKICAmdHN2MTEwX3ZlY3Rvcl9j b3N0LAogICZnZW5lcmljX2JyYW5jaF9jb3N0LAogICZnZW5lcmljX2FwcHJveF9tb2RlcywKICBT VkVfTk9UX0lNUExFTUVOVEVELCAvKiBzdmVfd2lkdGggICovCiAgeyA0LCAvKiBsb2FkX2ludC4g ICovCiAgICA0LCAvKiBzdG9yZV9pbnQuICAqLwogICAgNCwgLyogbG9hZF9mcC4gICovCiAgICA0 LCAvKiBzdG9yZV9mcC4gICovCiAgICA0LCAvKiBsb2FkX3ByZWQuICAqLwogICAgNCAvKiBzdG9y ZV9wcmVkLiAgKi8KICB9LCAvKiBtZW1tb3ZfY29zdC4gICovCiAgNCwgICAgLyogaXNzdWVfcmF0 ZSAgKi8KICAoQUFSQ0g2NF9GVVNFX0FFU19BRVNNQyB8IEFBUkNINjRfRlVTRV9BTFVfQlJBTkNI CiAgIHwgQUFSQ0g2NF9GVVNFX0FMVV9DQlopLCAvKiBmdXNpYmxlX29wcyAgKi8KICAiMTYiLCAv KiBmdW5jdGlvbl9hbGlnbi4gICovCiAgIjQiLCAgLyoganVtcF9hbGlnbi4gICovCiAgIjgiLCAg LyogbG9vcF9hbGlnbi4gICovCiAgMiwgICAgLyogaW50X3JlYXNzb2Nfd2lkdGguICAqLwogIDQs ICAgIC8qIGZwX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8qIGZtYV9yZWFzc29jX3dpZHRoLiAg Ki8KICAxLCAgICAvKiB2ZWNfcmVhc3NvY193aWR0aC4gICovCiAgMiwgICAgLyogbWluX2Rpdl9y ZWNpcF9tdWxfc2YuICAqLwogIDIsICAgIC8qIG1pbl9kaXZfcmVjaXBfbXVsX2RmLiAgKi8KICAw LCAgICAvKiBtYXhfY2FzZV92YWx1ZXMuICAqLwogIHR1bmVfcGFyYW1zOjpBVVRPUFJFRkVUQ0hF Ul9XRUFLLCAgICAgLyogYXV0b3ByZWZldGNoZXJfbW9kZWwuICAqLwogIChBQVJDSDY0X0VYVFJB X1RVTkVfTk9ORSksICAgICAvKiB0dW5lX2ZsYWdzLiAgKi8KICAmdHN2MTEwX3ByZWZldGNoX3R1 bmUKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdHVuZV9wYXJhbXMgeGdlbmUxX3R1bmluZ3MgPQp7 CiAgJnhnZW5lMV9leHRyYV9jb3N0cywKICAmeGdlbmUxX2FkZHJjb3N0X3RhYmxlLAogICZ4Z2Vu ZTFfcmVnbW92ZV9jb3N0LAogICZ4Z2VuZTFfdmVjdG9yX2Nvc3QsCiAgJmdlbmVyaWNfYnJhbmNo X2Nvc3QsCiAgJnhnZW5lMV9hcHByb3hfbW9kZXMsCiAgU1ZFX05PVF9JTVBMRU1FTlRFRCwgLyog c3ZlX3dpZHRoICAqLwogIHsgNiwgLyogbG9hZF9pbnQuICAqLwogICAgNiwgLyogc3RvcmVfaW50 LiAgKi8KICAgIDYsIC8qIGxvYWRfZnAuICAqLwogICAgNiwgLyogc3RvcmVfZnAuICAqLwogICAg NiwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDYgLyogc3RvcmVfcHJlZC4gICovCiAgfSwgLyogbWVt bW92X2Nvc3QuICAqLwogIDQsIC8qIGlzc3VlX3JhdGUgICovCiAgQUFSQ0g2NF9GVVNFX05PVEhJ TkcsIC8qIGZ1c2libGVfb3BzICAqLwogICIxNiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8KICAi MTYiLAkvKiBqdW1wX2FsaWduLiAgKi8KICAiMTYiLAkvKiBsb29wX2FsaWduLiAgKi8KICAyLAkv KiBpbnRfcmVhc3NvY193aWR0aC4gICovCiAgNCwJLyogZnBfcmVhc3NvY193aWR0aC4gICovCiAg MSwJLyogZm1hX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8qIHZlY19yZWFzc29jX3dpZHRoLiAg Ki8KICAyLAkvKiBtaW5fZGl2X3JlY2lwX211bF9zZi4gICovCiAgMiwJLyogbWluX2Rpdl9yZWNp cF9tdWxfZGYuICAqLwogIDE3LAkvKiBtYXhfY2FzZV92YWx1ZXMuICAqLwogIHR1bmVfcGFyYW1z OjpBVVRPUFJFRkVUQ0hFUl9PRkYsCS8qIGF1dG9wcmVmZXRjaGVyX21vZGVsLiAgKi8KICAoQUFS Q0g2NF9FWFRSQV9UVU5FX05PX0xEUF9TVFBfUVJFR1MpLAkvKiB0dW5lX2ZsYWdzLiAgKi8KICAm eGdlbmUxX3ByZWZldGNoX3R1bmUKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdHVuZV9wYXJhbXMg ZW1hZ190dW5pbmdzID0KewogICZ4Z2VuZTFfZXh0cmFfY29zdHMsCiAgJnhnZW5lMV9hZGRyY29z dF90YWJsZSwKICAmeGdlbmUxX3JlZ21vdmVfY29zdCwKICAmeGdlbmUxX3ZlY3Rvcl9jb3N0LAog ICZnZW5lcmljX2JyYW5jaF9jb3N0LAogICZ4Z2VuZTFfYXBwcm94X21vZGVzLAogIFNWRV9OT1Rf SU1QTEVNRU5URUQsCiAgeyA2LCAvKiBsb2FkX2ludC4gICovCiAgICA2LCAvKiBzdG9yZV9pbnQu ICAqLwogICAgNiwgLyogbG9hZF9mcC4gICovCiAgICA2LCAvKiBzdG9yZV9mcC4gICovCiAgICA2 LCAvKiBsb2FkX3ByZWQuICAqLwogICAgNiAvKiBzdG9yZV9wcmVkLiAgKi8KICB9LCAvKiBtZW1t b3ZfY29zdC4gICovCiAgNCwgLyogaXNzdWVfcmF0ZSAgKi8KICBBQVJDSDY0X0ZVU0VfTk9USElO RywgLyogZnVzaWJsZV9vcHMgICovCiAgIjE2IiwJLyogZnVuY3Rpb25fYWxpZ24uICAqLwogICIx NiIsCS8qIGp1bXBfYWxpZ24uICAqLwogICIxNiIsCS8qIGxvb3BfYWxpZ24uICAqLwogIDIsCS8q IGludF9yZWFzc29jX3dpZHRoLiAgKi8KICA0LAkvKiBmcF9yZWFzc29jX3dpZHRoLiAgKi8KICAx LAkvKiBmbWFfcmVhc3NvY193aWR0aC4gICovCiAgMSwJLyogdmVjX3JlYXNzb2Nfd2lkdGguICAq LwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX3NmLiAgKi8KICAyLAkvKiBtaW5fZGl2X3JlY2lw X211bF9kZi4gICovCiAgMTcsCS8qIG1heF9jYXNlX3ZhbHVlcy4gICovCiAgdHVuZV9wYXJhbXM6 OkFVVE9QUkVGRVRDSEVSX09GRiwJLyogYXV0b3ByZWZldGNoZXJfbW9kZWwuICAqLwogIChBQVJD SDY0X0VYVFJBX1RVTkVfTk9fTERQX1NUUF9RUkVHUyksCS8qIHR1bmVfZmxhZ3MuICAqLwogICZ4 Z2VuZTFfcHJlZmV0Y2hfdHVuZQp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB0dW5lX3BhcmFtcyBx ZGYyNHh4X3R1bmluZ3MgPQp7CiAgJnFkZjI0eHhfZXh0cmFfY29zdHMsCiAgJnFkZjI0eHhfYWRk cmNvc3RfdGFibGUsCiAgJnFkZjI0eHhfcmVnbW92ZV9jb3N0LAogICZxZGYyNHh4X3ZlY3Rvcl9j b3N0LAogICZnZW5lcmljX2JyYW5jaF9jb3N0LAogICZnZW5lcmljX2FwcHJveF9tb2RlcywKICBT VkVfTk9UX0lNUExFTUVOVEVELCAvKiBzdmVfd2lkdGggICovCiAgeyA0LCAvKiBsb2FkX2ludC4g ICovCiAgICA0LCAvKiBzdG9yZV9pbnQuICAqLwogICAgNCwgLyogbG9hZF9mcC4gICovCiAgICA0 LCAvKiBzdG9yZV9mcC4gICovCiAgICA0LCAvKiBsb2FkX3ByZWQuICAqLwogICAgNCAvKiBzdG9y ZV9wcmVkLiAgKi8KICB9LCAvKiBtZW1tb3ZfY29zdC4gICovCiAgNCwgLyogaXNzdWVfcmF0ZSAg Ki8KICAoQUFSQ0g2NF9GVVNFX01PVl9NT1ZLIHwgQUFSQ0g2NF9GVVNFX0FEUlBfQURECiAgIHwg QUFSQ0g2NF9GVVNFX01PVktfTU9WSyksIC8qIGZ1c2VhYmxlX29wcyAgKi8KICAiMTYiLAkvKiBm dW5jdGlvbl9hbGlnbi4gICovCiAgIjgiLAkvKiBqdW1wX2FsaWduLiAgKi8KICAiMTYiLAkvKiBs b29wX2FsaWduLiAgKi8KICAyLAkvKiBpbnRfcmVhc3NvY193aWR0aC4gICovCiAgNCwJLyogZnBf cmVhc3NvY193aWR0aC4gICovCiAgMSwJLyogZm1hX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8q IHZlY19yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiBtaW5fZGl2X3JlY2lwX211bF9zZi4gICov CiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxfZGYuICAqLwogIDAsCS8qIG1heF9jYXNlX3ZhbHVl cy4gICovCiAgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVSX1dFQUssCS8qIGF1dG9wcmVmZXRj aGVyX21vZGVsLiAgKi8KICBBQVJDSDY0X0VYVFJBX1RVTkVfUkVOQU1FX0xPQURfUkVHUywgLyog dHVuZV9mbGFncy4gICovCiAgJnFkZjI0eHhfcHJlZmV0Y2hfdHVuZQp9OwoKLyogVHVuaW5nIHN0 cnVjdHVyZSBmb3IgdGhlIFF1YWxjb21tIFNhcGhpcmEgY29yZS4gIERlZmF1bHQgdG8gZmFsa29y IHZhbHVlcwogICBmb3Igbm93LiAgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB0dW5lX3BhcmFtcyBz YXBoaXJhX3R1bmluZ3MgPQp7CiAgJmdlbmVyaWNfZXh0cmFfY29zdHMsCiAgJmdlbmVyaWNfYWRk cmNvc3RfdGFibGUsCiAgJmdlbmVyaWNfcmVnbW92ZV9jb3N0LAogICZnZW5lcmljX3ZlY3Rvcl9j b3N0LAogICZnZW5lcmljX2JyYW5jaF9jb3N0LAogICZnZW5lcmljX2FwcHJveF9tb2RlcywKICBT VkVfTk9UX0lNUExFTUVOVEVELCAvKiBzdmVfd2lkdGggICovCiAgeyA0LCAvKiBsb2FkX2ludC4g ICovCiAgICA0LCAvKiBzdG9yZV9pbnQuICAqLwogICAgNCwgLyogbG9hZF9mcC4gICovCiAgICA0 LCAvKiBzdG9yZV9mcC4gICovCiAgICA0LCAvKiBsb2FkX3ByZWQuICAqLwogICAgNCAvKiBzdG9y ZV9wcmVkLiAgKi8KICB9LCAvKiBtZW1tb3ZfY29zdC4gICovCiAgNCwgLyogaXNzdWVfcmF0ZSAg Ki8KICAoQUFSQ0g2NF9GVVNFX01PVl9NT1ZLIHwgQUFSQ0g2NF9GVVNFX0FEUlBfQURECiAgIHwg QUFSQ0g2NF9GVVNFX01PVktfTU9WSyksIC8qIGZ1c2VhYmxlX29wcyAgKi8KICAiMTYiLAkvKiBm dW5jdGlvbl9hbGlnbi4gICovCiAgIjgiLAkvKiBqdW1wX2FsaWduLiAgKi8KICAiMTYiLAkvKiBs b29wX2FsaWduLiAgKi8KICAyLAkvKiBpbnRfcmVhc3NvY193aWR0aC4gICovCiAgNCwJLyogZnBf cmVhc3NvY193aWR0aC4gICovCiAgMSwJLyogZm1hX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8q IHZlY19yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiBtaW5fZGl2X3JlY2lwX211bF9zZi4gICov CiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxfZGYuICAqLwogIDAsCS8qIG1heF9jYXNlX3ZhbHVl cy4gICovCiAgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVSX1dFQUssCS8qIGF1dG9wcmVmZXRj aGVyX21vZGVsLiAgKi8KICAoQUFSQ0g2NF9FWFRSQV9UVU5FX05PTkUpLAkJLyogdHVuZV9mbGFn cy4gICovCiAgJmdlbmVyaWNfcHJlZmV0Y2hfdHVuZQp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB0 dW5lX3BhcmFtcyB0aHVuZGVyeDJ0OTlfdHVuaW5ncyA9CnsKICAmdGh1bmRlcngydDk5X2V4dHJh X2Nvc3RzLAogICZ0aHVuZGVyeDJ0OTlfYWRkcmNvc3RfdGFibGUsCiAgJnRodW5kZXJ4MnQ5OV9y ZWdtb3ZlX2Nvc3QsCiAgJnRodW5kZXJ4MnQ5OV92ZWN0b3JfY29zdCwKICAmZ2VuZXJpY19icmFu Y2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFX05PVF9JTVBMRU1FTlRFRCwg Lyogc3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwogICAgNCwgLyogc3RvcmVf aW50LiAgKi8KICAgIDQsIC8qIGxvYWRfZnAuICAqLwogICAgNCwgLyogc3RvcmVfZnAuICAqLwog ICAgNCwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDQgLyogc3RvcmVfcHJlZC4gICovCiAgfSwgLyog bWVtbW92X2Nvc3QuICAqLwogIDQsIC8qIGlzc3VlX3JhdGUuICAqLwogIChBQVJDSDY0X0ZVU0Vf QUxVX0JSQU5DSCB8IEFBUkNINjRfRlVTRV9BRVNfQUVTTUMKICAgfCBBQVJDSDY0X0ZVU0VfQUxV X0NCWiksIC8qIGZ1c2libGVfb3BzICAqLwogICIxNiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8K ICAiOCIsCS8qIGp1bXBfYWxpZ24uICAqLwogICIxNiIsCS8qIGxvb3BfYWxpZ24uICAqLwogIDMs CS8qIGludF9yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiBmcF9yZWFzc29jX3dpZHRoLiAgKi8K ICAxLAkvKiBmbWFfcmVhc3NvY193aWR0aC4gICovCiAgMiwJLyogdmVjX3JlYXNzb2Nfd2lkdGgu ICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX3NmLiAgKi8KICAyLAkvKiBtaW5fZGl2X3Jl Y2lwX211bF9kZi4gICovCiAgMCwJLyogbWF4X2Nhc2VfdmFsdWVzLiAgKi8KICB0dW5lX3BhcmFt czo6QVVUT1BSRUZFVENIRVJfV0VBSywJLyogYXV0b3ByZWZldGNoZXJfbW9kZWwuICAqLwogIChB QVJDSDY0X0VYVFJBX1RVTkVfTk9ORSksCS8qIHR1bmVfZmxhZ3MuICAqLwogICZ0aHVuZGVyeDJ0 OTlfcHJlZmV0Y2hfdHVuZQp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB0dW5lX3BhcmFtcyB0aHVu ZGVyeDN0MTEwX3R1bmluZ3MgPQp7CiAgJnRodW5kZXJ4M3QxMTBfZXh0cmFfY29zdHMsCiAgJnRo dW5kZXJ4M3QxMTBfYWRkcmNvc3RfdGFibGUsCiAgJnRodW5kZXJ4M3QxMTBfcmVnbW92ZV9jb3N0 LAogICZ0aHVuZGVyeDN0MTEwX3ZlY3Rvcl9jb3N0LAogICZnZW5lcmljX2JyYW5jaF9jb3N0LAog ICZnZW5lcmljX2FwcHJveF9tb2RlcywKICBTVkVfTk9UX0lNUExFTUVOVEVELCAvKiBzdmVfd2lk dGggICovCiAgeyA0LCAvKiBsb2FkX2ludC4gICovCiAgICA0LCAvKiBzdG9yZV9pbnQuICAqLwog ICAgNCwgLyogbG9hZF9mcC4gICovCiAgICA0LCAvKiBzdG9yZV9mcC4gICovCiAgICA0LCAvKiBs b2FkX3ByZWQuICAqLwogICAgNCAvKiBzdG9yZV9wcmVkLiAgKi8KICB9LCAvKiBtZW1tb3ZfY29z dC4gICovCiAgNiwgLyogaXNzdWVfcmF0ZS4gICovCiAgKEFBUkNINjRfRlVTRV9BTFVfQlJBTkNI IHwgQUFSQ0g2NF9GVVNFX0FFU19BRVNNQwogICB8IEFBUkNINjRfRlVTRV9BTFVfQ0JaKSwgLyog ZnVzaWJsZV9vcHMgICovCiAgIjE2IiwJLyogZnVuY3Rpb25fYWxpZ24uICAqLwogICI4IiwJLyog anVtcF9hbGlnbi4gICovCiAgIjE2IiwJLyogbG9vcF9hbGlnbi4gICovCiAgMywJLyogaW50X3Jl YXNzb2Nfd2lkdGguICAqLwogIDIsCS8qIGZwX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8qIGZt YV9yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiB2ZWNfcmVhc3NvY193aWR0aC4gICovCiAgMiwJ LyogbWluX2Rpdl9yZWNpcF9tdWxfc2YuICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX2Rm LiAgKi8KICAwLAkvKiBtYXhfY2FzZV92YWx1ZXMuICAqLwogIHR1bmVfcGFyYW1zOjpBVVRPUFJF RkVUQ0hFUl9XRUFLLAkvKiBhdXRvcHJlZmV0Y2hlcl9tb2RlbC4gICovCiAgKEFBUkNINjRfRVhU UkFfVFVORV9OT05FKSwJLyogdHVuZV9mbGFncy4gICovCiAgJnRodW5kZXJ4M3QxMTBfcHJlZmV0 Y2hfdHVuZQp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB0dW5lX3BhcmFtcyBuZW92ZXJzZW4xX3R1 bmluZ3MgPQp7CiAgJmNvcnRleGE3Nl9leHRyYV9jb3N0cywKICAmZ2VuZXJpY19hZGRyY29zdF90 YWJsZSwKICAmZ2VuZXJpY19yZWdtb3ZlX2Nvc3QsCiAgJmNvcnRleGE1N192ZWN0b3JfY29zdCwK ICAmZ2VuZXJpY19icmFuY2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFX05P VF9JTVBMRU1FTlRFRCwgLyogc3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwog ICAgMiwgLyogc3RvcmVfaW50LiAgKi8KICAgIDUsIC8qIGxvYWRfZnAuICAqLwogICAgMiwgLyog c3RvcmVfZnAuICAqLwogICAgNCwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDQgLyogc3RvcmVfcHJl ZC4gICovCiAgfSwgLyogbWVtbW92X2Nvc3QuICAqLwogIDMsIC8qIGlzc3VlX3JhdGUgICovCiAg KEFBUkNINjRfRlVTRV9BRVNfQUVTTUMgfCBBQVJDSDY0X0ZVU0VfQ01QX0JSQU5DSCksIC8qIGZ1 c2libGVfb3BzICAqLwogICIzMjoxNiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8KICAiNCIsCQkv KiBqdW1wX2FsaWduLiAgKi8KICAiMzI6MTYiLAkvKiBsb29wX2FsaWduLiAgKi8KICAyLAkvKiBp bnRfcmVhc3NvY193aWR0aC4gICovCiAgNCwJLyogZnBfcmVhc3NvY193aWR0aC4gICovCiAgMSwJ LyogZm1hX3JlYXNzb2Nfd2lkdGguICAqLwogIDIsCS8qIHZlY19yZWFzc29jX3dpZHRoLiAgKi8K ICAyLAkvKiBtaW5fZGl2X3JlY2lwX211bF9zZi4gICovCiAgMiwJLyogbWluX2Rpdl9yZWNpcF9t dWxfZGYuICAqLwogIDAsCS8qIG1heF9jYXNlX3ZhbHVlcy4gICovCiAgdHVuZV9wYXJhbXM6OkFV VE9QUkVGRVRDSEVSX1dFQUssCS8qIGF1dG9wcmVmZXRjaGVyX21vZGVsLiAgKi8KICAoQUFSQ0g2 NF9FWFRSQV9UVU5FX0NIRUFQX1NISUZUX0VYVEVORCksCS8qIHR1bmVfZmxhZ3MuICAqLwogICZn ZW5lcmljX3ByZWZldGNoX3R1bmUKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdHVuZV9wYXJhbXMg YW1wZXJlMV90dW5pbmdzID0KewogICZhbXBlcmUxX2V4dHJhX2Nvc3RzLAogICZnZW5lcmljX2Fk ZHJjb3N0X3RhYmxlLAogICZnZW5lcmljX3JlZ21vdmVfY29zdCwKICAmYW1wZXJlMV92ZWN0b3Jf Y29zdCwKICAmZ2VuZXJpY19icmFuY2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAg U1ZFX05PVF9JTVBMRU1FTlRFRCwgLyogc3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQu ICAqLwogICAgNCwgLyogc3RvcmVfaW50LiAgKi8KICAgIDQsIC8qIGxvYWRfZnAuICAqLwogICAg NCwgLyogc3RvcmVfZnAuICAqLwogICAgNCwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDQgLyogc3Rv cmVfcHJlZC4gICovCiAgfSwgLyogbWVtbW92X2Nvc3QuICAqLwogIDQsIC8qIGlzc3VlX3JhdGUg ICovCiAgKEFBUkNINjRfRlVTRV9BRFJQX0FERCB8IEFBUkNINjRfRlVTRV9BRVNfQUVTTUMgfAog ICBBQVJDSDY0X0ZVU0VfTU9WX01PVksgfCBBQVJDSDY0X0ZVU0VfTU9WS19NT1ZLIHwKICAgQUFS Q0g2NF9GVVNFX0FMVV9CUkFOQ0ggLyogYWRkcywgYW5kcywgYmljcywgY2NtcCwgY2NtbiAqLyB8 CiAgIEFBUkNINjRfRlVTRV9DTVBfQlJBTkNIKSwKICAvKiBmdXNpYmxlX29wcyAgKi8KICAiMzIi LAkJLyogZnVuY3Rpb25fYWxpZ24uICAqLwogICI0IiwJCS8qIGp1bXBfYWxpZ24uICAqLwogICIz MjoxNiIsCS8qIGxvb3BfYWxpZ24uICAqLwogIDIsCS8qIGludF9yZWFzc29jX3dpZHRoLiAgKi8K ICA0LAkvKiBmcF9yZWFzc29jX3dpZHRoLiAgKi8KICAxLAkvKiBmbWFfcmVhc3NvY193aWR0aC4g ICovCiAgMiwJLyogdmVjX3JlYXNzb2Nfd2lkdGguICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBf bXVsX3NmLiAgKi8KICAyLAkvKiBtaW5fZGl2X3JlY2lwX211bF9kZi4gICovCiAgMCwJLyogbWF4 X2Nhc2VfdmFsdWVzLiAgKi8KICB0dW5lX3BhcmFtczo6QVVUT1BSRUZFVENIRVJfV0VBSywJLyog YXV0b3ByZWZldGNoZXJfbW9kZWwuICAqLwogIChBQVJDSDY0X0VYVFJBX1RVTkVfTk9fTERQX0NP TUJJTkUpLAkvKiB0dW5lX2ZsYWdzLiAgKi8KICAmYW1wZXJlMV9wcmVmZXRjaF90dW5lCn07Cgpz dGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIGFtcGVyZTFhX3R1bmluZ3MgPQp7CiAgJmFt cGVyZTFhX2V4dHJhX2Nvc3RzLAogICZnZW5lcmljX2FkZHJjb3N0X3RhYmxlLAogICZnZW5lcmlj X3JlZ21vdmVfY29zdCwKICAmYW1wZXJlMV92ZWN0b3JfY29zdCwKICAmZ2VuZXJpY19icmFuY2hf Y29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFX05PVF9JTVBMRU1FTlRFRCwgLyog c3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwogICAgNCwgLyogc3RvcmVfaW50 LiAgKi8KICAgIDQsIC8qIGxvYWRfZnAuICAqLwogICAgNCwgLyogc3RvcmVfZnAuICAqLwogICAg NCwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDQgLyogc3RvcmVfcHJlZC4gICovCiAgfSwgLyogbWVt bW92X2Nvc3QuICAqLwogIDQsIC8qIGlzc3VlX3JhdGUgICovCiAgKEFBUkNINjRfRlVTRV9BRFJQ X0FERCB8IEFBUkNINjRfRlVTRV9BRVNfQUVTTUMgfAogICBBQVJDSDY0X0ZVU0VfTU9WX01PVksg fCBBQVJDSDY0X0ZVU0VfTU9WS19NT1ZLIHwKICAgQUFSQ0g2NF9GVVNFX0FMVV9CUkFOQ0ggLyog YWRkcywgYW5kcywgYmljcywgY2NtcCwgY2NtbiAqLyB8CiAgIEFBUkNINjRfRlVTRV9DTVBfQlJB TkNIIHwgQUFSQ0g2NF9GVVNFX0FMVV9DQlogfAogICBBQVJDSDY0X0ZVU0VfQUREU1VCXzJSRUdf Q09OU1QxKSwKICAvKiBmdXNpYmxlX29wcyAgKi8KICAiMzIiLAkJLyogZnVuY3Rpb25fYWxpZ24u ICAqLwogICI0IiwJCS8qIGp1bXBfYWxpZ24uICAqLwogICIzMjoxNiIsCS8qIGxvb3BfYWxpZ24u ICAqLwogIDIsCS8qIGludF9yZWFzc29jX3dpZHRoLiAgKi8KICA0LAkvKiBmcF9yZWFzc29jX3dp ZHRoLiAgKi8KICAxLAkvKiBmbWFfcmVhc3NvY193aWR0aC4gICovCiAgMiwJLyogdmVjX3JlYXNz b2Nfd2lkdGguICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX3NmLiAgKi8KICAyLAkvKiBt aW5fZGl2X3JlY2lwX211bF9kZi4gICovCiAgMCwJLyogbWF4X2Nhc2VfdmFsdWVzLiAgKi8KICB0 dW5lX3BhcmFtczo6QVVUT1BSRUZFVENIRVJfV0VBSywJLyogYXV0b3ByZWZldGNoZXJfbW9kZWwu ICAqLwogIChBQVJDSDY0X0VYVFJBX1RVTkVfTk9fTERQX0NPTUJJTkUpLAkvKiB0dW5lX2ZsYWdz LiAgKi8KICAmYW1wZXJlMV9wcmVmZXRjaF90dW5lCn07CgpzdGF0aWMgY29uc3QgYWR2c2ltZF92 ZWNfY29zdCBuZW92ZXJzZXYxX2FkdnNpbWRfdmVjdG9yX2Nvc3QgPQp7CiAgMiwgLyogaW50X3N0 bXRfY29zdCAgKi8KICAyLCAvKiBmcF9zdG10X2Nvc3QgICovCiAgNCwgLyogbGQyX3N0Ml9wZXJt dXRlX2Nvc3QgKi8KICA0LCAvKiBsZDNfc3QzX3Blcm11dGVfY29zdCAgKi8KICA1LCAvKiBsZDRf c3Q0X3Blcm11dGVfY29zdCAgKi8KICAzLCAvKiBwZXJtdXRlX2Nvc3QgICovCiAgNCwgLyogcmVk dWNfaThfY29zdCAgKi8KICA0LCAvKiByZWR1Y19pMTZfY29zdCAgKi8KICAyLCAvKiByZWR1Y19p MzJfY29zdCAgKi8KICAyLCAvKiByZWR1Y19pNjRfY29zdCAgKi8KICA2LCAvKiByZWR1Y19mMTZf Y29zdCAgKi8KICAzLCAvKiByZWR1Y19mMzJfY29zdCAgKi8KICAyLCAvKiByZWR1Y19mNjRfY29z dCAgKi8KICAyLCAvKiBzdG9yZV9lbHRfZXh0cmFfY29zdCAgKi8KICAvKiBUaGlzIHZhbHVlIGlz IGp1c3QgaW5oZXJpdGVkIGZyb20gdGhlIENvcnRleC1BNTcgdGFibGUuICAqLwogIDgsIC8qIHZl Y190b19zY2FsYXJfY29zdCAgKi8KICAvKiBUaGlzIGRlcGVuZHMgdmVyeSBtdWNoIG9uIHdoYXQg dGhlIHNjYWxhciB2YWx1ZSBpcyBhbmQKICAgICB3aGVyZSBpdCBjb21lcyBmcm9tLiAgRS5nLiBz b21lIGNvbnN0YW50cyB0YWtlIHR3byBkZXBlbmRlbnQKICAgICBpbnN0cnVjdGlvbnMgb3IgYSBs b2FkLCB3aGlsZSBvdGhlcnMgbWlnaHQgYmUgbW92ZWQgZnJvbSBhIEdQUi4KICAgICA0IHNlZW1z IHRvIGJlIGEgcmVhc29uYWJsZSBjb21wcm9taXNlIGluIHByYWN0aWNlLiAgKi8KICA0LCAvKiBz Y2FsYXJfdG9fdmVjX2Nvc3QgICovCiAgNCwgLyogYWxpZ25fbG9hZF9jb3N0ICAqLwogIDQsIC8q IHVuYWxpZ25fbG9hZF9jb3N0ICAqLwogIC8qIEFsdGhvdWdoIHN0b3JlcyBoYXZlIGEgbGF0ZW5j eSBvZiAyIGFuZCBjb21wZXRlIGZvciB0aGUKICAgICB2ZWN0b3IgcGlwZXMsIGluIHByYWN0aWNl IGl0J3MgYmV0dGVyIG5vdCB0byBtb2RlbCB0aGF0LiAgKi8KICAxLCAvKiB1bmFsaWduX3N0b3Jl X2Nvc3QgICovCiAgMSAgLyogc3RvcmVfY29zdCAgKi8KfTsKCnN0YXRpYyBjb25zdCBzdmVfdmVj X2Nvc3QgbmVvdmVyc2V2MV9zdmVfdmVjdG9yX2Nvc3QgPQp7CiAgewogICAgMiwgLyogaW50X3N0 bXRfY29zdCAgKi8KICAgIDIsIC8qIGZwX3N0bXRfY29zdCAgKi8KICAgIDQsIC8qIGxkMl9zdDJf cGVybXV0ZV9jb3N0ICAqLwogICAgNywgLyogbGQzX3N0M19wZXJtdXRlX2Nvc3QgICovCiAgICA4 LCAvKiBsZDRfc3Q0X3Blcm11dGVfY29zdCAgKi8KICAgIDMsIC8qIHBlcm11dGVfY29zdCAgKi8K ICAgIC8qIFRoZW9yZXRpY2FsbHksIGEgcmVkdWN0aW9uIGludm9sdmluZyAzMSBzY2FsYXIgQURE cyBjb3VsZAogICAgICAgY29tcGxldGUgaW4gfjkgY3ljbGVzIGFuZCB3b3VsZCBoYXZlIGEgY29z dCBvZiAzMS4gIFtTVV1BRERWCiAgICAgICBjb21wbGV0ZXMgaW4gMTQgY3ljbGVzLCBzbyBnaXZl IGl0IGEgY29zdCBvZiAzMSArIDUuICAqLwogICAgMzYsIC8qIHJlZHVjX2k4X2Nvc3QgICovCiAg ICAvKiBMaWtld2lzZSBmb3IgMTUgc2NhbGFyIEFERHMgKH41IGN5Y2xlcykgdnMuIDEyOiAxNSAr IDcuICAqLwogICAgMjIsIC8qIHJlZHVjX2kxNl9jb3N0ICAqLwogICAgLyogTGlrZXdpc2UgZm9y IDcgc2NhbGFyIEFERHMgKH4zIGN5Y2xlcykgdnMuIDEwOiA3ICsgNy4gICovCiAgICAxNCwgLyog cmVkdWNfaTMyX2Nvc3QgICovCiAgICAvKiBMaWtld2lzZSBmb3IgMyBzY2FsYXIgQUREcyAofjIg Y3ljbGVzKSB2cy4gMTA6IDMgKyA4LiAgKi8KICAgIDExLCAvKiByZWR1Y19pNjRfY29zdCAgKi8K ICAgIC8qIFRoZW9yZXRpY2FsbHksIGEgcmVkdWN0aW9uIGludm9sdmluZyAxNSBzY2FsYXIgRkFE RHMgY291bGQKICAgICAgIGNvbXBsZXRlIGluIH45IGN5Y2xlcyBhbmQgd291bGQgaGF2ZSBhIGNv c3Qgb2YgMzAuICBGQUREVgogICAgICAgY29tcGxldGVzIGluIDEzIGN5Y2xlcywgc28gZ2l2ZSBp dCBhIGNvc3Qgb2YgMzAgKyA0LiAgKi8KICAgIDM0LCAvKiByZWR1Y19mMTZfY29zdCAgKi8KICAg IC8qIExpa2V3aXNlIGZvciA3IHNjYWxhciBGQUREcyAofjYgY3ljbGVzKSB2cy4gMTE6IDE0ICsg NS4gICovCiAgICAxOSwgLyogcmVkdWNfZjMyX2Nvc3QgICovCiAgICAvKiBMaWtld2lzZSBmb3Ig MyBzY2FsYXIgRkFERHMgKH40IGN5Y2xlcykgdnMuIDk6IDYgKyA1LiAgKi8KICAgIDExLCAvKiBy ZWR1Y19mNjRfY29zdCAgKi8KICAgIDIsIC8qIHN0b3JlX2VsdF9leHRyYV9jb3N0ICAqLwogICAg LyogVGhpcyB2YWx1ZSBpcyBqdXN0IGluaGVyaXRlZCBmcm9tIHRoZSBDb3J0ZXgtQTU3IHRhYmxl LiAgKi8KICAgIDgsIC8qIHZlY190b19zY2FsYXJfY29zdCAgKi8KICAgIC8qIFNlZSB0aGUgY29t bWVudCBhYm92ZSB0aGUgQWR2YW5jZWQgU0lNRCB2ZXJzaW9ucy4gICovCiAgICA0LCAvKiBzY2Fs YXJfdG9fdmVjX2Nvc3QgICovCiAgICA0LCAvKiBhbGlnbl9sb2FkX2Nvc3QgICovCiAgICA0LCAv KiB1bmFsaWduX2xvYWRfY29zdCAgKi8KICAgIC8qIEFsdGhvdWdoIHN0b3JlcyBoYXZlIGEgbGF0 ZW5jeSBvZiAyIGFuZCBjb21wZXRlIGZvciB0aGUKICAgICAgIHZlY3RvciBwaXBlcywgaW4gcHJh Y3RpY2UgaXQncyBiZXR0ZXIgbm90IHRvIG1vZGVsIHRoYXQuICAqLwogICAgMSwgLyogdW5hbGln bl9zdG9yZV9jb3N0ICAqLwogICAgMSAgLyogc3RvcmVfY29zdCAgKi8KICB9LAogIDMsIC8qIGNs YXN0X2Nvc3QgICovCiAgMTksIC8qIGZhZGRhX2YxNl9jb3N0ICAqLwogIDExLCAvKiBmYWRkYV9m MzJfY29zdCAgKi8KICA4LCAvKiBmYWRkYV9mNjRfY29zdCAgKi8KICAzMiwgLyogZ2F0aGVyX2xv YWRfeDMyX2Nvc3QgICovCiAgMTYsIC8qIGdhdGhlcl9sb2FkX3g2NF9jb3N0ICAqLwogIDMgLyog c2NhdHRlcl9zdG9yZV9lbHRfY29zdCAgKi8KfTsKCnN0YXRpYyBjb25zdCBhYXJjaDY0X3NjYWxh cl92ZWNfaXNzdWVfaW5mbyBuZW92ZXJzZXYxX3NjYWxhcl9pc3N1ZV9pbmZvID0KewogIDMsIC8q IGxvYWRzX3N0b3Jlc19wZXJfY3ljbGUgICovCiAgMiwgLyogc3RvcmVzX3Blcl9jeWNsZSAgKi8K ICA0LCAvKiBnZW5lcmFsX29wc19wZXJfY3ljbGUgICovCiAgMCwgLyogZnBfc2ltZF9sb2FkX2dl bmVyYWxfb3BzICAqLwogIDEgLyogZnBfc2ltZF9zdG9yZV9nZW5lcmFsX29wcyAgKi8KfTsKCnN0 YXRpYyBjb25zdCBhYXJjaDY0X2FkdnNpbWRfdmVjX2lzc3VlX2luZm8gbmVvdmVyc2V2MV9hZHZz aW1kX2lzc3VlX2luZm8gPQp7CiAgewogICAgMywgLyogbG9hZHNfc3RvcmVzX3Blcl9jeWNsZSAg Ki8KICAgIDIsIC8qIHN0b3Jlc19wZXJfY3ljbGUgICovCiAgICA0LCAvKiBnZW5lcmFsX29wc19w ZXJfY3ljbGUgICovCiAgICAwLCAvKiBmcF9zaW1kX2xvYWRfZ2VuZXJhbF9vcHMgICovCiAgICAx IC8qIGZwX3NpbWRfc3RvcmVfZ2VuZXJhbF9vcHMgICovCiAgfSwKICAyLCAvKiBsZDJfc3QyX2dl bmVyYWxfb3BzICAqLwogIDIsIC8qIGxkM19zdDNfZ2VuZXJhbF9vcHMgICovCiAgMyAvKiBsZDRf c3Q0X2dlbmVyYWxfb3BzICAqLwp9OwoKc3RhdGljIGNvbnN0IGFhcmNoNjRfc3ZlX3ZlY19pc3N1 ZV9pbmZvIG5lb3ZlcnNldjFfc3ZlX2lzc3VlX2luZm8gPQp7CiAgewogICAgewogICAgICAyLCAv KiBsb2Fkc19wZXJfY3ljbGUgICovCiAgICAgIDIsIC8qIHN0b3Jlc19wZXJfY3ljbGUgICovCiAg ICAgIDIsIC8qIGdlbmVyYWxfb3BzX3Blcl9jeWNsZSAgKi8KICAgICAgMCwgLyogZnBfc2ltZF9s b2FkX2dlbmVyYWxfb3BzICAqLwogICAgICAxIC8qIGZwX3NpbWRfc3RvcmVfZ2VuZXJhbF9vcHMg ICovCiAgICB9LAogICAgMiwgLyogbGQyX3N0Ml9nZW5lcmFsX29wcyAgKi8KICAgIDIsIC8qIGxk M19zdDNfZ2VuZXJhbF9vcHMgICovCiAgICAzIC8qIGxkNF9zdDRfZ2VuZXJhbF9vcHMgICovCiAg fSwKICAxLCAvKiBwcmVkX29wc19wZXJfY3ljbGUgICovCiAgMiwgLyogd2hpbGVfcHJlZF9vcHMg ICovCiAgMiwgLyogaW50X2NtcF9wcmVkX29wcyAgKi8KICAxLCAvKiBmcF9jbXBfcHJlZF9vcHMg ICovCiAgMSwgLyogZ2F0aGVyX3NjYXR0ZXJfcGFpcl9nZW5lcmFsX29wcyAgKi8KICAxIC8qIGdh dGhlcl9zY2F0dGVyX3BhaXJfcHJlZF9vcHMgICovCn07CgpzdGF0aWMgY29uc3QgYWFyY2g2NF92 ZWNfaXNzdWVfaW5mbyBuZW92ZXJzZXYxX3ZlY19pc3N1ZV9pbmZvID0KewogICZuZW92ZXJzZXYx X3NjYWxhcl9pc3N1ZV9pbmZvLAogICZuZW92ZXJzZXYxX2FkdnNpbWRfaXNzdWVfaW5mbywKICAm bmVvdmVyc2V2MV9zdmVfaXNzdWVfaW5mbwp9OwoKLyogTmVvdmVyc2UgVjEgY29zdHMgZm9yIHZl Y3RvciBpbnNuIGNsYXNzZXMuICAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV92ZWN0b3JfY29z dCBuZW92ZXJzZXYxX3ZlY3Rvcl9jb3N0ID0KewogIDEsIC8qIHNjYWxhcl9pbnRfc3RtdF9jb3N0 ICAqLwogIDIsIC8qIHNjYWxhcl9mcF9zdG10X2Nvc3QgICovCiAgNCwgLyogc2NhbGFyX2xvYWRf Y29zdCAgKi8KICAxLCAvKiBzY2FsYXJfc3RvcmVfY29zdCAgKi8KICAxLCAvKiBjb25kX3Rha2Vu X2JyYW5jaF9jb3N0ICAqLwogIDEsIC8qIGNvbmRfbm90X3Rha2VuX2JyYW5jaF9jb3N0ICAqLwog ICZuZW92ZXJzZXYxX2FkdnNpbWRfdmVjdG9yX2Nvc3QsIC8qIGFkdnNpbWQgICovCiAgJm5lb3Zl cnNldjFfc3ZlX3ZlY3Rvcl9jb3N0LCAvKiBzdmUgICovCiAgJm5lb3ZlcnNldjFfdmVjX2lzc3Vl X2luZm8gLyogaXNzdWVfaW5mbyAgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdHVuZV9wYXJh bXMgbmVvdmVyc2V2MV90dW5pbmdzID0KewogICZjb3J0ZXhhNzZfZXh0cmFfY29zdHMsCiAgJm5l b3ZlcnNldjFfYWRkcmNvc3RfdGFibGUsCiAgJm5lb3ZlcnNldjFfcmVnbW92ZV9jb3N0LAogICZu ZW92ZXJzZXYxX3ZlY3Rvcl9jb3N0LAogICZnZW5lcmljX2JyYW5jaF9jb3N0LAogICZnZW5lcmlj X2FwcHJveF9tb2RlcywKICBTVkVfMjU2LCAvKiBzdmVfd2lkdGggICovCiAgeyA0LCAvKiBsb2Fk X2ludC4gICovCiAgICAyLCAvKiBzdG9yZV9pbnQuICAqLwogICAgNiwgLyogbG9hZF9mcC4gICov CiAgICAyLCAvKiBzdG9yZV9mcC4gICovCiAgICA2LCAvKiBsb2FkX3ByZWQuICAqLwogICAgMSAv KiBzdG9yZV9wcmVkLiAgKi8KICB9LCAvKiBtZW1tb3ZfY29zdC4gICovCiAgMywgLyogaXNzdWVf cmF0ZSAgKi8KICAoQUFSQ0g2NF9GVVNFX0FFU19BRVNNQyB8IEFBUkNINjRfRlVTRV9DTVBfQlJB TkNIKSwgLyogZnVzaWJsZV9vcHMgICovCiAgIjMyOjE2IiwJLyogZnVuY3Rpb25fYWxpZ24uICAq LwogICI0IiwJCS8qIGp1bXBfYWxpZ24uICAqLwogICIzMjoxNiIsCS8qIGxvb3BfYWxpZ24uICAq LwogIDIsCS8qIGludF9yZWFzc29jX3dpZHRoLiAgKi8KICA0LAkvKiBmcF9yZWFzc29jX3dpZHRo LiAgKi8KICA0LAkvKiBmbWFfcmVhc3NvY193aWR0aC4gICovCiAgMiwJLyogdmVjX3JlYXNzb2Nf d2lkdGguICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX3NmLiAgKi8KICAyLAkvKiBtaW5f ZGl2X3JlY2lwX211bF9kZi4gICovCiAgMCwJLyogbWF4X2Nhc2VfdmFsdWVzLiAgKi8KICB0dW5l X3BhcmFtczo6QVVUT1BSRUZFVENIRVJfV0VBSywJLyogYXV0b3ByZWZldGNoZXJfbW9kZWwuICAq LwogIChBQVJDSDY0X0VYVFJBX1RVTkVfQ1NFX1NWRV9WTF9DT05TVEFOVFMKICAgfCBBQVJDSDY0 X0VYVFJBX1RVTkVfVVNFX05FV19WRUNUT1JfQ09TVFMKICAgfCBBQVJDSDY0X0VYVFJBX1RVTkVf TUFUQ0hFRF9WRUNUT1JfVEhST1VHSFBVVAogICB8IEFBUkNINjRfRVhUUkFfVFVORV9DSEVBUF9T SElGVF9FWFRFTkQpLAkvKiB0dW5lX2ZsYWdzLiAgKi8KICAmZ2VuZXJpY19wcmVmZXRjaF90dW5l Cn07CgpzdGF0aWMgY29uc3Qgc3ZlX3ZlY19jb3N0IG5lb3ZlcnNlNTEydHZiX3N2ZV92ZWN0b3Jf Y29zdCA9CnsKICB7CiAgICAyLCAvKiBpbnRfc3RtdF9jb3N0ICAqLwogICAgMiwgLyogZnBfc3Rt dF9jb3N0ICAqLwogICAgNCwgLyogbGQyX3N0Ml9wZXJtdXRlX2Nvc3QgICovCiAgICA1LCAvKiBs ZDNfc3QzX3Blcm11dGVfY29zdCAgKi8KICAgIDUsIC8qIGxkNF9zdDRfcGVybXV0ZV9jb3N0ICAq LwogICAgMywgLyogcGVybXV0ZV9jb3N0ICAqLwogICAgLyogVGhlb3JldGljYWxseSwgYSByZWR1 Y3Rpb24gaW52b2x2aW5nIDE1IHNjYWxhciBBRERzIGNvdWxkCiAgICAgICBjb21wbGV0ZSBpbiB+ NSBjeWNsZXMgYW5kIHdvdWxkIGhhdmUgYSBjb3N0IG9mIDE1LiAgQXNzdW1lIHRoYXQKICAgICAg IFtTVV1BRERWIGNvbXBsZXRlcyBpbiAxMSBjeWNsZXMgYW5kIHNvIGdpdmUgaXQgYSBjb3N0IG9m IDE1ICsgNi4gICovCiAgICAyMSwgLyogcmVkdWNfaThfY29zdCAgKi8KICAgIC8qIExpa2V3aXNl IGZvciA3IHNjYWxhciBBRERzICh+MyBjeWNsZXMpIHZzLiA5OiA3ICsgNi4gICovCiAgICAxMywg LyogcmVkdWNfaTE2X2Nvc3QgICovCiAgICAvKiBMaWtld2lzZSBmb3IgMyBzY2FsYXIgQUREcyAo fjIgY3ljbGVzKSB2cy4gODogMyArIDYuICAqLwogICAgOSwgLyogcmVkdWNfaTMyX2Nvc3QgICov CiAgICAvKiBMaWtld2lzZSBmb3IgMSBzY2FsYXIgQUREICgxIGN5Y2xlKSB2cy4gODogMSArIDcu ICAqLwogICAgOCwgLyogcmVkdWNfaTY0X2Nvc3QgICovCiAgICAvKiBUaGVvcmV0aWNhbGx5LCBh IHJlZHVjdGlvbiBpbnZvbHZpbmcgNyBzY2FsYXIgRkFERHMgY291bGQKICAgICAgIGNvbXBsZXRl IGluIH42IGN5Y2xlcyBhbmQgd291bGQgaGF2ZSBhIGNvc3Qgb2YgMTQuICBBc3N1bWUgdGhhdAog ICAgICAgRkFERFYgY29tcGxldGVzIGluIDggY3ljbGVzIGFuZCBzbyBnaXZlIGl0IGEgY29zdCBv ZiAxNCArIDIuICAqLwogICAgMTYsIC8qIHJlZHVjX2YxNl9jb3N0ICAqLwogICAgLyogTGlrZXdp c2UgZm9yIDMgc2NhbGFyIEZBRERzICh+NCBjeWNsZXMpIHZzLiA2OiA2ICsgMi4gICovCiAgICA4 LCAvKiByZWR1Y19mMzJfY29zdCAgKi8KICAgIC8qIExpa2V3aXNlIGZvciAxIHNjYWxhciBGQURE ICgyIGN5Y2xlcykgdnMuIDQ6IDIgKyAyLiAgKi8KICAgIDQsIC8qIHJlZHVjX2Y2NF9jb3N0ICAq LwogICAgMiwgLyogc3RvcmVfZWx0X2V4dHJhX2Nvc3QgICovCiAgICAvKiBUaGlzIHZhbHVlIGlz IGp1c3QgaW5oZXJpdGVkIGZyb20gdGhlIENvcnRleC1BNTcgdGFibGUuICAqLwogICAgOCwgLyog dmVjX3RvX3NjYWxhcl9jb3N0ICAqLwogICAgLyogVGhpcyBkZXBlbmRzIHZlcnkgbXVjaCBvbiB3 aGF0IHRoZSBzY2FsYXIgdmFsdWUgaXMgYW5kCiAgICAgICB3aGVyZSBpdCBjb21lcyBmcm9tLiAg RS5nLiBzb21lIGNvbnN0YW50cyB0YWtlIHR3byBkZXBlbmRlbnQKICAgICAgIGluc3RydWN0aW9u cyBvciBhIGxvYWQsIHdoaWxlIG90aGVycyBtaWdodCBiZSBtb3ZlZCBmcm9tIGEgR1BSLgogICAg ICAgNCBzZWVtcyB0byBiZSBhIHJlYXNvbmFibGUgY29tcHJvbWlzZSBpbiBwcmFjdGljZS4gICov CiAgICA0LCAvKiBzY2FsYXJfdG9fdmVjX2Nvc3QgICovCiAgICA0LCAvKiBhbGlnbl9sb2FkX2Nv c3QgICovCiAgICA0LCAvKiB1bmFsaWduX2xvYWRfY29zdCAgKi8KICAgIC8qIEFsdGhvdWdoIHN0 b3JlcyBnZW5lcmFsbHkgaGF2ZSBhIGxhdGVuY3kgb2YgMiBhbmQgY29tcGV0ZSBmb3IgdGhlCiAg ICAgICB2ZWN0b3IgcGlwZXMsIGluIHByYWN0aWNlIGl0J3MgYmV0dGVyIG5vdCB0byBtb2RlbCB0 aGF0LiAgKi8KICAgIDEsIC8qIHVuYWxpZ25fc3RvcmVfY29zdCAgKi8KICAgIDEgIC8qIHN0b3Jl X2Nvc3QgICovCiAgfSwKICAzLCAvKiBjbGFzdF9jb3N0ICAqLwogIDEwLCAvKiBmYWRkYV9mMTZf Y29zdCAgKi8KICA2LCAvKiBmYWRkYV9mMzJfY29zdCAgKi8KICA0LCAvKiBmYWRkYV9mNjRfY29z dCAgKi8KICAvKiBBIHN0cmlkZWQgQWR2YW5jZWQgU0lNRCB4NjQgbG9hZCB3b3VsZCB0YWtlIHR3 byBwYXJhbGxlbCBGUCBsb2FkcwogICAgICg2IGN5Y2xlcykgcGx1cyBhbiBpbnNlcnRpb24gKDIg Y3ljbGVzKS4gIEFzc3VtZSBhIDY0LWJpdCBTVkUgZ2F0aGVyCiAgICAgaXMgMSBjeWNsZSBtb3Jl LiAgVGhlIEFkdmFuY2VkIFNJTUQgdmVyc2lvbiBpcyBjb3N0ZWQgYXMgMiBzY2FsYXIgbG9hZHMK ICAgICAoY29zdCA4KSBhbmQgYSB2ZWNfY29uc3RydWN0IChjb3N0IDIpLiAgQWRkIGEgZnVsbCB2 ZWN0b3Igb3BlcmF0aW9uCiAgICAgKGNvc3QgMikgdG8gdGhhdCwgdG8gYXZvaWQgdGhlIGRpZmZl cmVuY2UgYmVpbmcgbG9zdCBpbiByb3VuZGluZy4KCiAgICAgVGhlcmUgaXMgbm8gZWFzeSBjb21w YXJpc29uIGJldHdlZW4gYSBzdHJpZGVkIEFkdmFuY2VkIFNJTUQgeDMyIGxvYWQKICAgICBhbmQg YW4gU1ZFIDMyLWJpdCBnYXRoZXIsIGJ1dCBjb3N0IGFuIFNWRSAzMi1iaXQgZ2F0aGVyIGFzIDEg dmVjdG9yCiAgICAgb3BlcmF0aW9uIG1vcmUgdGhhbiBhIDY0LWJpdCBnYXRoZXIuICAqLwogIDE0 LCAvKiBnYXRoZXJfbG9hZF94MzJfY29zdCAgKi8KICAxMiwgLyogZ2F0aGVyX2xvYWRfeDY0X2Nv c3QgICovCiAgMyAvKiBzY2F0dGVyX3N0b3JlX2VsdF9jb3N0ICAqLwp9OwoKc3RhdGljIGNvbnN0 IGFhcmNoNjRfc3ZlX3ZlY19pc3N1ZV9pbmZvIG5lb3ZlcnNlNTEydHZiX3N2ZV9pc3N1ZV9pbmZv ID0KewogIHsKICAgIHsKICAgICAgMywgLyogbG9hZHNfcGVyX2N5Y2xlICAqLwogICAgICAyLCAv KiBzdG9yZXNfcGVyX2N5Y2xlICAqLwogICAgICA0LCAvKiBnZW5lcmFsX29wc19wZXJfY3ljbGUg ICovCiAgICAgIDAsIC8qIGZwX3NpbWRfbG9hZF9nZW5lcmFsX29wcyAgKi8KICAgICAgMSAvKiBm cF9zaW1kX3N0b3JlX2dlbmVyYWxfb3BzICAqLwogICAgfSwKICAgIDIsIC8qIGxkMl9zdDJfZ2Vu ZXJhbF9vcHMgICovCiAgICAyLCAvKiBsZDNfc3QzX2dlbmVyYWxfb3BzICAqLwogICAgMyAvKiBs ZDRfc3Q0X2dlbmVyYWxfb3BzICAqLwogIH0sCiAgMiwgLyogcHJlZF9vcHNfcGVyX2N5Y2xlICAq LwogIDIsIC8qIHdoaWxlX3ByZWRfb3BzICAqLwogIDIsIC8qIGludF9jbXBfcHJlZF9vcHMgICov CiAgMSwgLyogZnBfY21wX3ByZWRfb3BzICAqLwogIDEsIC8qIGdhdGhlcl9zY2F0dGVyX3BhaXJf Z2VuZXJhbF9vcHMgICovCiAgMSAvKiBnYXRoZXJfc2NhdHRlcl9wYWlyX3ByZWRfb3BzICAqLwp9 OwoKc3RhdGljIGNvbnN0IGFhcmNoNjRfdmVjX2lzc3VlX2luZm8gbmVvdmVyc2U1MTJ0dmJfdmVj X2lzc3VlX2luZm8gPQp7CiAgJm5lb3ZlcnNldjFfc2NhbGFyX2lzc3VlX2luZm8sCiAgJm5lb3Zl cnNldjFfYWR2c2ltZF9pc3N1ZV9pbmZvLAogICZuZW92ZXJzZTUxMnR2Yl9zdmVfaXNzdWVfaW5m bwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfdmVjdG9yX2Nvc3QgbmVvdmVyc2U1MTJ0dmJf dmVjdG9yX2Nvc3QgPQp7CiAgMSwgLyogc2NhbGFyX2ludF9zdG10X2Nvc3QgICovCiAgMiwgLyog c2NhbGFyX2ZwX3N0bXRfY29zdCAgKi8KICA0LCAvKiBzY2FsYXJfbG9hZF9jb3N0ICAqLwogIDEs IC8qIHNjYWxhcl9zdG9yZV9jb3N0ICAqLwogIDEsIC8qIGNvbmRfdGFrZW5fYnJhbmNoX2Nvc3Qg ICovCiAgMSwgLyogY29uZF9ub3RfdGFrZW5fYnJhbmNoX2Nvc3QgICovCiAgJm5lb3ZlcnNldjFf YWR2c2ltZF92ZWN0b3JfY29zdCwgLyogYWR2c2ltZCAgKi8KICAmbmVvdmVyc2U1MTJ0dmJfc3Zl X3ZlY3Rvcl9jb3N0LCAvKiBzdmUgICovCiAgJm5lb3ZlcnNlNTEydHZiX3ZlY19pc3N1ZV9pbmZv IC8qIGlzc3VlX2luZm8gICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIG5l b3ZlcnNlNTEydHZiX3R1bmluZ3MgPQp7CiAgJmNvcnRleGE3Nl9leHRyYV9jb3N0cywKICAmbmVv dmVyc2V2MV9hZGRyY29zdF90YWJsZSwKICAmbmVvdmVyc2V2MV9yZWdtb3ZlX2Nvc3QsCiAgJm5l b3ZlcnNlNTEydHZiX3ZlY3Rvcl9jb3N0LAogICZnZW5lcmljX2JyYW5jaF9jb3N0LAogICZnZW5l cmljX2FwcHJveF9tb2RlcywKICBTVkVfMTI4IHwgU1ZFXzI1NiwgLyogc3ZlX3dpZHRoICAqLwog IHsgNCwgLyogbG9hZF9pbnQuICAqLwogICAgMiwgLyogc3RvcmVfaW50LiAgKi8KICAgIDYsIC8q IGxvYWRfZnAuICAqLwogICAgMiwgLyogc3RvcmVfZnAuICAqLwogICAgNiwgLyogbG9hZF9wcmVk LiAgKi8KICAgIDEgLyogc3RvcmVfcHJlZC4gICovCiAgfSwgLyogbWVtbW92X2Nvc3QuICAqLwog IDMsIC8qIGlzc3VlX3JhdGUgICovCiAgKEFBUkNINjRfRlVTRV9BRVNfQUVTTUMgfCBBQVJDSDY0 X0ZVU0VfQ01QX0JSQU5DSCksIC8qIGZ1c2libGVfb3BzICAqLwogICIzMjoxNiIsCS8qIGZ1bmN0 aW9uX2FsaWduLiAgKi8KICAiNCIsCQkvKiBqdW1wX2FsaWduLiAgKi8KICAiMzI6MTYiLAkvKiBs b29wX2FsaWduLiAgKi8KICAyLAkvKiBpbnRfcmVhc3NvY193aWR0aC4gICovCiAgNCwJLyogZnBf cmVhc3NvY193aWR0aC4gICovCiAgNCwJLyogZm1hX3JlYXNzb2Nfd2lkdGguICAqLwogIDIsCS8q IHZlY19yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiBtaW5fZGl2X3JlY2lwX211bF9zZi4gICov CiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxfZGYuICAqLwogIDAsCS8qIG1heF9jYXNlX3ZhbHVl cy4gICovCiAgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVSX1dFQUssCS8qIGF1dG9wcmVmZXRj aGVyX21vZGVsLiAgKi8KICAoQUFSQ0g2NF9FWFRSQV9UVU5FX0NTRV9TVkVfVkxfQ09OU1RBTlRT CiAgIHwgQUFSQ0g2NF9FWFRSQV9UVU5FX1VTRV9ORVdfVkVDVE9SX0NPU1RTCiAgIHwgQUFSQ0g2 NF9FWFRSQV9UVU5FX01BVENIRURfVkVDVE9SX1RIUk9VR0hQVVQpLAkvKiB0dW5lX2ZsYWdzLiAg Ki8KICAmZ2VuZXJpY19wcmVmZXRjaF90dW5lCn07CgpzdGF0aWMgY29uc3QgYWR2c2ltZF92ZWNf Y29zdCBuZW92ZXJzZW4yX2FkdnNpbWRfdmVjdG9yX2Nvc3QgPQp7CiAgMiwgLyogaW50X3N0bXRf Y29zdCAgKi8KICAyLCAvKiBmcF9zdG10X2Nvc3QgICovCiAgMiwgLyogbGQyX3N0Ml9wZXJtdXRl X2Nvc3QgKi8KICAyLCAvKiBsZDNfc3QzX3Blcm11dGVfY29zdCAgKi8KICAzLCAvKiBsZDRfc3Q0 X3Blcm11dGVfY29zdCAgKi8KICAzLCAvKiBwZXJtdXRlX2Nvc3QgICovCiAgNCwgLyogcmVkdWNf aThfY29zdCAgKi8KICA0LCAvKiByZWR1Y19pMTZfY29zdCAgKi8KICAyLCAvKiByZWR1Y19pMzJf Y29zdCAgKi8KICAyLCAvKiByZWR1Y19pNjRfY29zdCAgKi8KICA2LCAvKiByZWR1Y19mMTZfY29z dCAgKi8KICA0LCAvKiByZWR1Y19mMzJfY29zdCAgKi8KICAyLCAvKiByZWR1Y19mNjRfY29zdCAg Ki8KICAyLCAvKiBzdG9yZV9lbHRfZXh0cmFfY29zdCAgKi8KICAvKiBUaGlzIHZhbHVlIGlzIGp1 c3QgaW5oZXJpdGVkIGZyb20gdGhlIENvcnRleC1BNTcgdGFibGUuICAqLwogIDgsIC8qIHZlY190 b19zY2FsYXJfY29zdCAgKi8KICAvKiBUaGlzIGRlcGVuZHMgdmVyeSBtdWNoIG9uIHdoYXQgdGhl IHNjYWxhciB2YWx1ZSBpcyBhbmQKICAgICB3aGVyZSBpdCBjb21lcyBmcm9tLiAgRS5nLiBzb21l IGNvbnN0YW50cyB0YWtlIHR3byBkZXBlbmRlbnQKICAgICBpbnN0cnVjdGlvbnMgb3IgYSBsb2Fk LCB3aGlsZSBvdGhlcnMgbWlnaHQgYmUgbW92ZWQgZnJvbSBhIEdQUi4KICAgICA0IHNlZW1zIHRv IGJlIGEgcmVhc29uYWJsZSBjb21wcm9taXNlIGluIHByYWN0aWNlLiAgKi8KICA0LCAvKiBzY2Fs YXJfdG9fdmVjX2Nvc3QgICovCiAgNCwgLyogYWxpZ25fbG9hZF9jb3N0ICAqLwogIDQsIC8qIHVu YWxpZ25fbG9hZF9jb3N0ICAqLwogIC8qIEFsdGhvdWdoIHN0b3JlcyBoYXZlIGEgbGF0ZW5jeSBv ZiAyIGFuZCBjb21wZXRlIGZvciB0aGUKICAgICB2ZWN0b3IgcGlwZXMsIGluIHByYWN0aWNlIGl0 J3MgYmV0dGVyIG5vdCB0byBtb2RlbCB0aGF0LiAgKi8KICAxLCAvKiB1bmFsaWduX3N0b3JlX2Nv c3QgICovCiAgMSAgLyogc3RvcmVfY29zdCAgKi8KfTsKCnN0YXRpYyBjb25zdCBzdmVfdmVjX2Nv c3QgbmVvdmVyc2VuMl9zdmVfdmVjdG9yX2Nvc3QgPQp7CiAgewogICAgMiwgLyogaW50X3N0bXRf Y29zdCAgKi8KICAgIDIsIC8qIGZwX3N0bXRfY29zdCAgKi8KICAgIDMsIC8qIGxkMl9zdDJfcGVy bXV0ZV9jb3N0ICAqLwogICAgNCwgLyogbGQzX3N0M19wZXJtdXRlX2Nvc3QgICovCiAgICA0LCAv KiBsZDRfc3Q0X3Blcm11dGVfY29zdCAgKi8KICAgIDMsIC8qIHBlcm11dGVfY29zdCAgKi8KICAg IC8qIFRoZW9yZXRpY2FsbHksIGEgcmVkdWN0aW9uIGludm9sdmluZyAxNSBzY2FsYXIgQUREcyBj b3VsZAogICAgICAgY29tcGxldGUgaW4gfjUgY3ljbGVzIGFuZCB3b3VsZCBoYXZlIGEgY29zdCBv ZiAxNS4gIFtTVV1BRERWCiAgICAgICBjb21wbGV0ZXMgaW4gMTEgY3ljbGVzLCBzbyBnaXZlIGl0 IGEgY29zdCBvZiAxNSArIDYuICAqLwogICAgMjEsIC8qIHJlZHVjX2k4X2Nvc3QgICovCiAgICAv KiBMaWtld2lzZSBmb3IgNyBzY2FsYXIgQUREcyAofjMgY3ljbGVzKSB2cy4gOTogNyArIDYuICAq LwogICAgMTMsIC8qIHJlZHVjX2kxNl9jb3N0ICAqLwogICAgLyogTGlrZXdpc2UgZm9yIDMgc2Nh bGFyIEFERHMgKH4yIGN5Y2xlcykgdnMuIDg6IDMgKyA2LiAgKi8KICAgIDksIC8qIHJlZHVjX2kz Ml9jb3N0ICAqLwogICAgLyogTGlrZXdpc2UgZm9yIDEgc2NhbGFyIEFERCAofjEgY3ljbGVzKSB2 cy4gMjogMSArIDEuICAqLwogICAgMiwgLyogcmVkdWNfaTY0X2Nvc3QgICovCiAgICAvKiBUaGVv cmV0aWNhbGx5LCBhIHJlZHVjdGlvbiBpbnZvbHZpbmcgNyBzY2FsYXIgRkFERHMgY291bGQKICAg ICAgIGNvbXBsZXRlIGluIH44IGN5Y2xlcyBhbmQgd291bGQgaGF2ZSBhIGNvc3Qgb2YgMTQuICBG QUREVgogICAgICAgY29tcGxldGVzIGluIDYgY3ljbGVzLCBzbyBnaXZlIGl0IGEgY29zdCBvZiAx NCAtIDIuICAqLwogICAgMTIsIC8qIHJlZHVjX2YxNl9jb3N0ICAqLwogICAgLyogTGlrZXdpc2Ug Zm9yIDMgc2NhbGFyIEZBRERzICh+NCBjeWNsZXMpIHZzLiA0OiA2IC0gMC4gICovCiAgICA2LCAv KiByZWR1Y19mMzJfY29zdCAgKi8KICAgIC8qIExpa2V3aXNlIGZvciAxIHNjYWxhciBGQUREICh+ MiBjeWNsZXMpIHZzLiAyOiAyIC0gMC4gICovCiAgICAyLCAvKiByZWR1Y19mNjRfY29zdCAgKi8K ICAgIDIsIC8qIHN0b3JlX2VsdF9leHRyYV9jb3N0ICAqLwogICAgLyogVGhpcyB2YWx1ZSBpcyBq dXN0IGluaGVyaXRlZCBmcm9tIHRoZSBDb3J0ZXgtQTU3IHRhYmxlLiAgKi8KICAgIDgsIC8qIHZl Y190b19zY2FsYXJfY29zdCAgKi8KICAgIC8qIFNlZSB0aGUgY29tbWVudCBhYm92ZSB0aGUgQWR2 YW5jZWQgU0lNRCB2ZXJzaW9ucy4gICovCiAgICA0LCAvKiBzY2FsYXJfdG9fdmVjX2Nvc3QgICov CiAgICA0LCAvKiBhbGlnbl9sb2FkX2Nvc3QgICovCiAgICA0LCAvKiB1bmFsaWduX2xvYWRfY29z dCAgKi8KICAgIC8qIEFsdGhvdWdoIHN0b3JlcyBoYXZlIGEgbGF0ZW5jeSBvZiAyIGFuZCBjb21w ZXRlIGZvciB0aGUKICAgICAgIHZlY3RvciBwaXBlcywgaW4gcHJhY3RpY2UgaXQncyBiZXR0ZXIg bm90IHRvIG1vZGVsIHRoYXQuICAqLwogICAgMSwgLyogdW5hbGlnbl9zdG9yZV9jb3N0ICAqLwog ICAgMSAgLyogc3RvcmVfY29zdCAgKi8KICB9LAogIDMsIC8qIGNsYXN0X2Nvc3QgICovCiAgMTAs IC8qIGZhZGRhX2YxNl9jb3N0ICAqLwogIDYsIC8qIGZhZGRhX2YzMl9jb3N0ICAqLwogIDQsIC8q IGZhZGRhX2Y2NF9jb3N0ICAqLwogIC8qIEEgc3RyaWRlZCBBZHZhbmNlZCBTSU1EIHg2NCBsb2Fk IHdvdWxkIHRha2UgdHdvIHBhcmFsbGVsIEZQIGxvYWRzCiAgICAgKDggY3ljbGVzKSBwbHVzIGFu IGluc2VydGlvbiAoMiBjeWNsZXMpLiAgQXNzdW1lIGEgNjQtYml0IFNWRSBnYXRoZXIKICAgICBp cyAxIGN5Y2xlIG1vcmUuICBUaGUgQWR2YW5jZWQgU0lNRCB2ZXJzaW9uIGlzIGNvc3RlZCBhcyAy IHNjYWxhciBsb2FkcwogICAgIChjb3N0IDgpIGFuZCBhIHZlY19jb25zdHJ1Y3QgKGNvc3QgMiku ICBBZGQgYSBmdWxsIHZlY3RvciBvcGVyYXRpb24KICAgICAoY29zdCAyKSB0byB0aGF0LCB0byBh dm9pZCB0aGUgZGlmZmVyZW5jZSBiZWluZyBsb3N0IGluIHJvdW5kaW5nLgoKICAgICBUaGVyZSBp cyBubyBlYXN5IGNvbXBhcmlzb24gYmV0d2VlbiBhIHN0cmlkZWQgQWR2YW5jZWQgU0lNRCB4MzIg bG9hZAogICAgIGFuZCBhbiBTVkUgMzItYml0IGdhdGhlciwgYnV0IGNvc3QgYW4gU1ZFIDMyLWJp dCBnYXRoZXIgYXMgMSB2ZWN0b3IKICAgICBvcGVyYXRpb24gbW9yZSB0aGFuIGEgNjQtYml0IGdh dGhlci4gICovCiAgMTQsIC8qIGdhdGhlcl9sb2FkX3gzMl9jb3N0ICAqLwogIDEyLCAvKiBnYXRo ZXJfbG9hZF94NjRfY29zdCAgKi8KICAzIC8qIHNjYXR0ZXJfc3RvcmVfZWx0X2Nvc3QgICovCn07 CgpzdGF0aWMgY29uc3QgYWFyY2g2NF9zY2FsYXJfdmVjX2lzc3VlX2luZm8gbmVvdmVyc2VuMl9z Y2FsYXJfaXNzdWVfaW5mbyA9CnsKICAzLCAvKiBsb2Fkc19zdG9yZXNfcGVyX2N5Y2xlICAqLwog IDIsIC8qIHN0b3Jlc19wZXJfY3ljbGUgICovCiAgNCwgLyogZ2VuZXJhbF9vcHNfcGVyX2N5Y2xl ICAqLwogIDAsIC8qIGZwX3NpbWRfbG9hZF9nZW5lcmFsX29wcyAgKi8KICAxIC8qIGZwX3NpbWRf c3RvcmVfZ2VuZXJhbF9vcHMgICovCn07CgpzdGF0aWMgY29uc3QgYWFyY2g2NF9hZHZzaW1kX3Zl Y19pc3N1ZV9pbmZvIG5lb3ZlcnNlbjJfYWR2c2ltZF9pc3N1ZV9pbmZvID0KewogIHsKICAgIDMs IC8qIGxvYWRzX3N0b3Jlc19wZXJfY3ljbGUgICovCiAgICAyLCAvKiBzdG9yZXNfcGVyX2N5Y2xl ICAqLwogICAgMiwgLyogZ2VuZXJhbF9vcHNfcGVyX2N5Y2xlICAqLwogICAgMCwgLyogZnBfc2lt ZF9sb2FkX2dlbmVyYWxfb3BzICAqLwogICAgMSAvKiBmcF9zaW1kX3N0b3JlX2dlbmVyYWxfb3Bz ICAqLwogIH0sCiAgMiwgLyogbGQyX3N0Ml9nZW5lcmFsX29wcyAgKi8KICAyLCAvKiBsZDNfc3Qz X2dlbmVyYWxfb3BzICAqLwogIDMgLyogbGQ0X3N0NF9nZW5lcmFsX29wcyAgKi8KfTsKCnN0YXRp YyBjb25zdCBhYXJjaDY0X3N2ZV92ZWNfaXNzdWVfaW5mbyBuZW92ZXJzZW4yX3N2ZV9pc3N1ZV9p bmZvID0KewogIHsKICAgIHsKICAgICAgMywgLyogbG9hZHNfcGVyX2N5Y2xlICAqLwogICAgICAy LCAvKiBzdG9yZXNfcGVyX2N5Y2xlICAqLwogICAgICAyLCAvKiBnZW5lcmFsX29wc19wZXJfY3lj bGUgICovCiAgICAgIDAsIC8qIGZwX3NpbWRfbG9hZF9nZW5lcmFsX29wcyAgKi8KICAgICAgMSAv KiBmcF9zaW1kX3N0b3JlX2dlbmVyYWxfb3BzICAqLwogICAgfSwKICAgIDIsIC8qIGxkMl9zdDJf Z2VuZXJhbF9vcHMgICovCiAgICAzLCAvKiBsZDNfc3QzX2dlbmVyYWxfb3BzICAqLwogICAgMyAv KiBsZDRfc3Q0X2dlbmVyYWxfb3BzICAqLwogIH0sCiAgMiwgLyogcHJlZF9vcHNfcGVyX2N5Y2xl ICAqLwogIDIsIC8qIHdoaWxlX3ByZWRfb3BzICAqLwogIDIsIC8qIGludF9jbXBfcHJlZF9vcHMg ICovCiAgMSwgLyogZnBfY21wX3ByZWRfb3BzICAqLwogIDEsIC8qIGdhdGhlcl9zY2F0dGVyX3Bh aXJfZ2VuZXJhbF9vcHMgICovCiAgMSAvKiBnYXRoZXJfc2NhdHRlcl9wYWlyX3ByZWRfb3BzICAq Lwp9OwoKc3RhdGljIGNvbnN0IGFhcmNoNjRfdmVjX2lzc3VlX2luZm8gbmVvdmVyc2VuMl92ZWNf aXNzdWVfaW5mbyA9CnsKICAmbmVvdmVyc2VuMl9zY2FsYXJfaXNzdWVfaW5mbywKICAmbmVvdmVy c2VuMl9hZHZzaW1kX2lzc3VlX2luZm8sCiAgJm5lb3ZlcnNlbjJfc3ZlX2lzc3VlX2luZm8KfTsK Ci8qIE5lb3ZlcnNlIE4yIGNvc3RzIGZvciB2ZWN0b3IgaW5zbiBjbGFzc2VzLiAgKi8Kc3RhdGlj IGNvbnN0IHN0cnVjdCBjcHVfdmVjdG9yX2Nvc3QgbmVvdmVyc2VuMl92ZWN0b3JfY29zdCA9CnsK ICAxLCAvKiBzY2FsYXJfaW50X3N0bXRfY29zdCAgKi8KICAyLCAvKiBzY2FsYXJfZnBfc3RtdF9j b3N0ICAqLwogIDQsIC8qIHNjYWxhcl9sb2FkX2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX3N0b3Jl X2Nvc3QgICovCiAgMSwgLyogY29uZF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAxLCAvKiBjb25k X25vdF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAmbmVvdmVyc2VuMl9hZHZzaW1kX3ZlY3Rvcl9j b3N0LCAvKiBhZHZzaW1kICAqLwogICZuZW92ZXJzZW4yX3N2ZV92ZWN0b3JfY29zdCwgLyogc3Zl ICAqLwogICZuZW92ZXJzZW4yX3ZlY19pc3N1ZV9pbmZvIC8qIGlzc3VlX2luZm8gICovCn07Cgpz dGF0aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIG5lb3ZlcnNlbjJfdHVuaW5ncyA9CnsKICAm Y29ydGV4YTc2X2V4dHJhX2Nvc3RzLAogICZuZW92ZXJzZW4yX2FkZHJjb3N0X3RhYmxlLAogICZu ZW92ZXJzZW4yX3JlZ21vdmVfY29zdCwKICAmbmVvdmVyc2VuMl92ZWN0b3JfY29zdCwKICAmZ2Vu ZXJpY19icmFuY2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFXzEyOCwgLyog c3ZlX3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwogICAgMSwgLyogc3RvcmVfaW50 LiAgKi8KICAgIDYsIC8qIGxvYWRfZnAuICAqLwogICAgMiwgLyogc3RvcmVfZnAuICAqLwogICAg NiwgLyogbG9hZF9wcmVkLiAgKi8KICAgIDEgLyogc3RvcmVfcHJlZC4gICovCiAgfSwgLyogbWVt bW92X2Nvc3QuICAqLwogIDMsIC8qIGlzc3VlX3JhdGUgICovCiAgKEFBUkNINjRfRlVTRV9BRVNf QUVTTUMgfCBBQVJDSDY0X0ZVU0VfQ01QX0JSQU5DSCksIC8qIGZ1c2libGVfb3BzICAqLwogICIz MjoxNiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8KICAiNCIsCQkvKiBqdW1wX2FsaWduLiAgKi8K ICAiMzI6MTYiLAkvKiBsb29wX2FsaWduLiAgKi8KICAyLAkvKiBpbnRfcmVhc3NvY193aWR0aC4g ICovCiAgNCwJLyogZnBfcmVhc3NvY193aWR0aC4gICovCiAgMSwJLyogZm1hX3JlYXNzb2Nfd2lk dGguICAqLwogIDIsCS8qIHZlY19yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiBtaW5fZGl2X3Jl Y2lwX211bF9zZi4gICovCiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxfZGYuICAqLwogIDAsCS8q IG1heF9jYXNlX3ZhbHVlcy4gICovCiAgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVSX1dFQUss CS8qIGF1dG9wcmVmZXRjaGVyX21vZGVsLiAgKi8KICAoQUFSQ0g2NF9FWFRSQV9UVU5FX0NIRUFQ X1NISUZUX0VYVEVORAogICB8IEFBUkNINjRfRVhUUkFfVFVORV9DU0VfU1ZFX1ZMX0NPTlNUQU5U UwogICB8IEFBUkNINjRfRVhUUkFfVFVORV9VU0VfTkVXX1ZFQ1RPUl9DT1NUUwogICB8IEFBUkNI NjRfRVhUUkFfVFVORV9NQVRDSEVEX1ZFQ1RPUl9USFJPVUdIUFVUKSwJLyogdHVuZV9mbGFncy4g ICovCiAgJmdlbmVyaWNfcHJlZmV0Y2hfdHVuZQp9OwoKc3RhdGljIGNvbnN0IGFkdnNpbWRfdmVj X2Nvc3QgbmVvdmVyc2V2Ml9hZHZzaW1kX3ZlY3Rvcl9jb3N0ID0KewogIDIsIC8qIGludF9zdG10 X2Nvc3QgICovCiAgMiwgLyogZnBfc3RtdF9jb3N0ICAqLwogIDIsIC8qIGxkMl9zdDJfcGVybXV0 ZV9jb3N0ICovCiAgMiwgLyogbGQzX3N0M19wZXJtdXRlX2Nvc3QgICovCiAgMywgLyogbGQ0X3N0 NF9wZXJtdXRlX2Nvc3QgICovCiAgMywgLyogcGVybXV0ZV9jb3N0ICAqLwogIDQsIC8qIHJlZHVj X2k4X2Nvc3QgICovCiAgNCwgLyogcmVkdWNfaTE2X2Nvc3QgICovCiAgMiwgLyogcmVkdWNfaTMy X2Nvc3QgICovCiAgMiwgLyogcmVkdWNfaTY0X2Nvc3QgICovCiAgNiwgLyogcmVkdWNfZjE2X2Nv c3QgICovCiAgMywgLyogcmVkdWNfZjMyX2Nvc3QgICovCiAgMiwgLyogcmVkdWNfZjY0X2Nvc3Qg ICovCiAgMiwgLyogc3RvcmVfZWx0X2V4dHJhX2Nvc3QgICovCiAgLyogVGhpcyB2YWx1ZSBpcyBq dXN0IGluaGVyaXRlZCBmcm9tIHRoZSBDb3J0ZXgtQTU3IHRhYmxlLiAgKi8KICA4LCAvKiB2ZWNf dG9fc2NhbGFyX2Nvc3QgICovCiAgLyogVGhpcyBkZXBlbmRzIHZlcnkgbXVjaCBvbiB3aGF0IHRo ZSBzY2FsYXIgdmFsdWUgaXMgYW5kCiAgICAgd2hlcmUgaXQgY29tZXMgZnJvbS4gIEUuZy4gc29t ZSBjb25zdGFudHMgdGFrZSB0d28gZGVwZW5kZW50CiAgICAgaW5zdHJ1Y3Rpb25zIG9yIGEgbG9h ZCwgd2hpbGUgb3RoZXJzIG1pZ2h0IGJlIG1vdmVkIGZyb20gYSBHUFIuCiAgICAgNCBzZWVtcyB0 byBiZSBhIHJlYXNvbmFibGUgY29tcHJvbWlzZSBpbiBwcmFjdGljZS4gICovCiAgNCwgLyogc2Nh bGFyX3RvX3ZlY19jb3N0ICAqLwogIDQsIC8qIGFsaWduX2xvYWRfY29zdCAgKi8KICA0LCAvKiB1 bmFsaWduX2xvYWRfY29zdCAgKi8KICAvKiBBbHRob3VnaCBzdG9yZXMgaGF2ZSBhIGxhdGVuY3kg b2YgMiBhbmQgY29tcGV0ZSBmb3IgdGhlCiAgICAgdmVjdG9yIHBpcGVzLCBpbiBwcmFjdGljZSBp dCdzIGJldHRlciBub3QgdG8gbW9kZWwgdGhhdC4gICovCiAgMSwgLyogdW5hbGlnbl9zdG9yZV9j b3N0ICAqLwogIDEgIC8qIHN0b3JlX2Nvc3QgICovCn07CgpzdGF0aWMgY29uc3Qgc3ZlX3ZlY19j b3N0IG5lb3ZlcnNldjJfc3ZlX3ZlY3Rvcl9jb3N0ID0KewogIHsKICAgIDIsIC8qIGludF9zdG10 X2Nvc3QgICovCiAgICAyLCAvKiBmcF9zdG10X2Nvc3QgICovCiAgICAzLCAvKiBsZDJfc3QyX3Bl cm11dGVfY29zdCAgKi8KICAgIDMsIC8qIGxkM19zdDNfcGVybXV0ZV9jb3N0ICAqLwogICAgNCwg LyogbGQ0X3N0NF9wZXJtdXRlX2Nvc3QgICovCiAgICAzLCAvKiBwZXJtdXRlX2Nvc3QgICovCiAg ICAvKiBUaGVvcmV0aWNhbGx5LCBhIHJlZHVjdGlvbiBpbnZvbHZpbmcgMTUgc2NhbGFyIEFERHMg Y291bGQKICAgICAgIGNvbXBsZXRlIGluIH4zIGN5Y2xlcyBhbmQgd291bGQgaGF2ZSBhIGNvc3Qg b2YgMTUuICBbU1VdQUREVgogICAgICAgY29tcGxldGVzIGluIDExIGN5Y2xlcywgc28gZ2l2ZSBp dCBhIGNvc3Qgb2YgMTUgKyA4LiAgKi8KICAgIDIxLCAvKiByZWR1Y19pOF9jb3N0ICAqLwogICAg LyogTGlrZXdpc2UgZm9yIDcgc2NhbGFyIEFERHMgKH4yIGN5Y2xlcykgdnMuIDk6IDcgKyA3LiAg Ki8KICAgIDE0LCAvKiByZWR1Y19pMTZfY29zdCAgKi8KICAgIC8qIExpa2V3aXNlIGZvciAzIHNj YWxhciBBRERzICh+MiBjeWNsZXMpIHZzLiA4OiAzICsgNC4gICovCiAgICA3LCAvKiByZWR1Y19p MzJfY29zdCAgKi8KICAgIC8qIExpa2V3aXNlIGZvciAxIHNjYWxhciBBREQgKH4xIGN5Y2xlcykg dnMuIDI6IDEgKyAxLiAgKi8KICAgIDIsIC8qIHJlZHVjX2k2NF9jb3N0ICAqLwogICAgLyogVGhl b3JldGljYWxseSwgYSByZWR1Y3Rpb24gaW52b2x2aW5nIDcgc2NhbGFyIEZBRERzIGNvdWxkCiAg ICAgICBjb21wbGV0ZSBpbiB+NiBjeWNsZXMgYW5kIHdvdWxkIGhhdmUgYSBjb3N0IG9mIDE0LiAg RkFERFYKICAgICAgIGNvbXBsZXRlcyBpbiA4IGN5Y2xlcywgc28gZ2l2ZSBpdCBhIGNvc3Qgb2Yg MTQgKyAyLiAgKi8KICAgIDE2LCAvKiByZWR1Y19mMTZfY29zdCAgKi8KICAgIC8qIExpa2V3aXNl IGZvciAzIHNjYWxhciBGQUREcyAofjQgY3ljbGVzKSB2cy4gNjogNiArIDIuICAqLwogICAgOCwg LyogcmVkdWNfZjMyX2Nvc3QgICovCiAgICAvKiBMaWtld2lzZSBmb3IgMSBzY2FsYXIgRkFERCAo fjIgY3ljbGVzKSB2cy4gNDogMiArIDIuICAqLwogICAgNCwgLyogcmVkdWNfZjY0X2Nvc3QgICov CiAgICAyLCAvKiBzdG9yZV9lbHRfZXh0cmFfY29zdCAgKi8KICAgIC8qIFRoaXMgdmFsdWUgaXMg anVzdCBpbmhlcml0ZWQgZnJvbSB0aGUgQ29ydGV4LUE1NyB0YWJsZS4gICovCiAgICA4LCAvKiB2 ZWNfdG9fc2NhbGFyX2Nvc3QgICovCiAgICAvKiBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgdGhlIEFk dmFuY2VkIFNJTUQgdmVyc2lvbnMuICAqLwogICAgNCwgLyogc2NhbGFyX3RvX3ZlY19jb3N0ICAq LwogICAgNCwgLyogYWxpZ25fbG9hZF9jb3N0ICAqLwogICAgNCwgLyogdW5hbGlnbl9sb2FkX2Nv c3QgICovCiAgICAvKiBBbHRob3VnaCBzdG9yZXMgaGF2ZSBhIGxhdGVuY3kgb2YgMiBhbmQgY29t cGV0ZSBmb3IgdGhlCiAgICAgICB2ZWN0b3IgcGlwZXMsIGluIHByYWN0aWNlIGl0J3MgYmV0dGVy IG5vdCB0byBtb2RlbCB0aGF0LiAgKi8KICAgIDEsIC8qIHVuYWxpZ25fc3RvcmVfY29zdCAgKi8K ICAgIDEgIC8qIHN0b3JlX2Nvc3QgICovCiAgfSwKICAzLCAvKiBjbGFzdF9jb3N0ICAqLwogIDEw LCAvKiBmYWRkYV9mMTZfY29zdCAgKi8KICA2LCAvKiBmYWRkYV9mMzJfY29zdCAgKi8KICA0LCAv KiBmYWRkYV9mNjRfY29zdCAgKi8KICAvKiBBIHN0cmlkZWQgQWR2YW5jZWQgU0lNRCB4NjQgbG9h ZCB3b3VsZCB0YWtlIHR3byBwYXJhbGxlbCBGUCBsb2FkcwogICAgICg4IGN5Y2xlcykgcGx1cyBh biBpbnNlcnRpb24gKDIgY3ljbGVzKS4gIEFzc3VtZSBhIDY0LWJpdCBTVkUgZ2F0aGVyCiAgICAg aXMgMSBjeWNsZSBtb3JlLiAgVGhlIEFkdmFuY2VkIFNJTUQgdmVyc2lvbiBpcyBjb3N0ZWQgYXMg MiBzY2FsYXIgbG9hZHMKICAgICAoY29zdCA4KSBhbmQgYSB2ZWNfY29uc3RydWN0IChjb3N0IDIp LiAgQWRkIGEgZnVsbCB2ZWN0b3Igb3BlcmF0aW9uCiAgICAgKGNvc3QgMikgdG8gdGhhdCwgdG8g YXZvaWQgdGhlIGRpZmZlcmVuY2UgYmVpbmcgbG9zdCBpbiByb3VuZGluZy4KCiAgICAgVGhlcmUg aXMgbm8gZWFzeSBjb21wYXJpc29uIGJldHdlZW4gYSBzdHJpZGVkIEFkdmFuY2VkIFNJTUQgeDMy IGxvYWQKICAgICBhbmQgYW4gU1ZFIDMyLWJpdCBnYXRoZXIsIGJ1dCBjb3N0IGFuIFNWRSAzMi1i aXQgZ2F0aGVyIGFzIDEgdmVjdG9yCiAgICAgb3BlcmF0aW9uIG1vcmUgdGhhbiBhIDY0LWJpdCBn YXRoZXIuICAqLwogIDE0LCAvKiBnYXRoZXJfbG9hZF94MzJfY29zdCAgKi8KICAxMiwgLyogZ2F0 aGVyX2xvYWRfeDY0X2Nvc3QgICovCiAgMyAvKiBzY2F0dGVyX3N0b3JlX2VsdF9jb3N0ICAqLwp9 OwoKc3RhdGljIGNvbnN0IGFhcmNoNjRfc2NhbGFyX3ZlY19pc3N1ZV9pbmZvIG5lb3ZlcnNldjJf c2NhbGFyX2lzc3VlX2luZm8gPQp7CiAgMywgLyogbG9hZHNfc3RvcmVzX3Blcl9jeWNsZSAgKi8K ICAyLCAvKiBzdG9yZXNfcGVyX2N5Y2xlICAqLwogIDYsIC8qIGdlbmVyYWxfb3BzX3Blcl9jeWNs ZSAgKi8KICAwLCAvKiBmcF9zaW1kX2xvYWRfZ2VuZXJhbF9vcHMgICovCiAgMSAvKiBmcF9zaW1k X3N0b3JlX2dlbmVyYWxfb3BzICAqLwp9OwoKc3RhdGljIGNvbnN0IGFhcmNoNjRfYWR2c2ltZF92 ZWNfaXNzdWVfaW5mbyBuZW92ZXJzZXYyX2FkdnNpbWRfaXNzdWVfaW5mbyA9CnsKICB7CiAgICAz LCAvKiBsb2Fkc19zdG9yZXNfcGVyX2N5Y2xlICAqLwogICAgMiwgLyogc3RvcmVzX3Blcl9jeWNs ZSAgKi8KICAgIDQsIC8qIGdlbmVyYWxfb3BzX3Blcl9jeWNsZSAgKi8KICAgIDAsIC8qIGZwX3Np bWRfbG9hZF9nZW5lcmFsX29wcyAgKi8KICAgIDEgLyogZnBfc2ltZF9zdG9yZV9nZW5lcmFsX29w cyAgKi8KICB9LAogIDIsIC8qIGxkMl9zdDJfZ2VuZXJhbF9vcHMgICovCiAgMiwgLyogbGQzX3N0 M19nZW5lcmFsX29wcyAgKi8KICAzIC8qIGxkNF9zdDRfZ2VuZXJhbF9vcHMgICovCn07CgpzdGF0 aWMgY29uc3QgYWFyY2g2NF9zdmVfdmVjX2lzc3VlX2luZm8gbmVvdmVyc2V2Ml9zdmVfaXNzdWVf aW5mbyA9CnsKICB7CiAgICB7CiAgICAgIDMsIC8qIGxvYWRzX3Blcl9jeWNsZSAgKi8KICAgICAg MiwgLyogc3RvcmVzX3Blcl9jeWNsZSAgKi8KICAgICAgNCwgLyogZ2VuZXJhbF9vcHNfcGVyX2N5 Y2xlICAqLwogICAgICAwLCAvKiBmcF9zaW1kX2xvYWRfZ2VuZXJhbF9vcHMgICovCiAgICAgIDEg LyogZnBfc2ltZF9zdG9yZV9nZW5lcmFsX29wcyAgKi8KICAgIH0sCiAgICAyLCAvKiBsZDJfc3Qy X2dlbmVyYWxfb3BzICAqLwogICAgMywgLyogbGQzX3N0M19nZW5lcmFsX29wcyAgKi8KICAgIDMg LyogbGQ0X3N0NF9nZW5lcmFsX29wcyAgKi8KICB9LAogIDIsIC8qIHByZWRfb3BzX3Blcl9jeWNs ZSAgKi8KICAyLCAvKiB3aGlsZV9wcmVkX29wcyAgKi8KICAyLCAvKiBpbnRfY21wX3ByZWRfb3Bz ICAqLwogIDEsIC8qIGZwX2NtcF9wcmVkX29wcyAgKi8KICAxLCAvKiBnYXRoZXJfc2NhdHRlcl9w YWlyX2dlbmVyYWxfb3BzICAqLwogIDEgLyogZ2F0aGVyX3NjYXR0ZXJfcGFpcl9wcmVkX29wcyAg Ki8KfTsKCnN0YXRpYyBjb25zdCBhYXJjaDY0X3ZlY19pc3N1ZV9pbmZvIG5lb3ZlcnNldjJfdmVj X2lzc3VlX2luZm8gPQp7CiAgJm5lb3ZlcnNldjJfc2NhbGFyX2lzc3VlX2luZm8sCiAgJm5lb3Zl cnNldjJfYWR2c2ltZF9pc3N1ZV9pbmZvLAogICZuZW92ZXJzZXYyX3N2ZV9pc3N1ZV9pbmZvCn07 CgovKiBEZW1ldGVyIGNvc3RzIGZvciB2ZWN0b3IgaW5zbiBjbGFzc2VzLiAgKi8Kc3RhdGljIGNv bnN0IHN0cnVjdCBjcHVfdmVjdG9yX2Nvc3QgbmVvdmVyc2V2Ml92ZWN0b3JfY29zdCA9CnsKICAx LCAvKiBzY2FsYXJfaW50X3N0bXRfY29zdCAgKi8KICAyLCAvKiBzY2FsYXJfZnBfc3RtdF9jb3N0 ICAqLwogIDQsIC8qIHNjYWxhcl9sb2FkX2Nvc3QgICovCiAgMSwgLyogc2NhbGFyX3N0b3JlX2Nv c3QgICovCiAgMSwgLyogY29uZF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAxLCAvKiBjb25kX25v dF90YWtlbl9icmFuY2hfY29zdCAgKi8KICAmbmVvdmVyc2V2Ml9hZHZzaW1kX3ZlY3Rvcl9jb3N0 LCAvKiBhZHZzaW1kICAqLwogICZuZW92ZXJzZXYyX3N2ZV92ZWN0b3JfY29zdCwgLyogc3ZlICAq LwogICZuZW92ZXJzZXYyX3ZlY19pc3N1ZV9pbmZvIC8qIGlzc3VlX2luZm8gICovCn07CgpzdGF0 aWMgY29uc3Qgc3RydWN0IHR1bmVfcGFyYW1zIG5lb3ZlcnNldjJfdHVuaW5ncyA9CnsKICAmY29y dGV4YTc2X2V4dHJhX2Nvc3RzLAogICZuZW92ZXJzZXYyX2FkZHJjb3N0X3RhYmxlLAogICZuZW92 ZXJzZXYyX3JlZ21vdmVfY29zdCwKICAmbmVvdmVyc2V2Ml92ZWN0b3JfY29zdCwKICAmZ2VuZXJp Y19icmFuY2hfY29zdCwKICAmZ2VuZXJpY19hcHByb3hfbW9kZXMsCiAgU1ZFXzEyOCwgLyogc3Zl X3dpZHRoICAqLwogIHsgNCwgLyogbG9hZF9pbnQuICAqLwogICAgMiwgLyogc3RvcmVfaW50LiAg Ki8KICAgIDYsIC8qIGxvYWRfZnAuICAqLwogICAgMSwgLyogc3RvcmVfZnAuICAqLwogICAgNiwg LyogbG9hZF9wcmVkLiAgKi8KICAgIDIgLyogc3RvcmVfcHJlZC4gICovCiAgfSwgLyogbWVtbW92 X2Nvc3QuICAqLwogIDUsIC8qIGlzc3VlX3JhdGUgICovCiAgKEFBUkNINjRfRlVTRV9BRVNfQUVT TUMgfCBBQVJDSDY0X0ZVU0VfQ01QX0JSQU5DSCksIC8qIGZ1c2libGVfb3BzICAqLwogICIzMjox NiIsCS8qIGZ1bmN0aW9uX2FsaWduLiAgKi8KICAiNCIsCQkvKiBqdW1wX2FsaWduLiAgKi8KICAi MzI6MTYiLAkvKiBsb29wX2FsaWduLiAgKi8KICAzLAkvKiBpbnRfcmVhc3NvY193aWR0aC4gICov CiAgNiwJLyogZnBfcmVhc3NvY193aWR0aC4gICovCiAgNCwJLyogZm1hX3JlYXNzb2Nfd2lkdGgu ICAqLwogIDMsCS8qIHZlY19yZWFzc29jX3dpZHRoLiAgKi8KICAyLAkvKiBtaW5fZGl2X3JlY2lw X211bF9zZi4gICovCiAgMiwJLyogbWluX2Rpdl9yZWNpcF9tdWxfZGYuICAqLwogIDAsCS8qIG1h eF9jYXNlX3ZhbHVlcy4gICovCiAgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVSX1dFQUssCS8q IGF1dG9wcmVmZXRjaGVyX21vZGVsLiAgKi8KICAoQUFSQ0g2NF9FWFRSQV9UVU5FX0NIRUFQX1NI SUZUX0VYVEVORAogICB8IEFBUkNINjRfRVhUUkFfVFVORV9DU0VfU1ZFX1ZMX0NPTlNUQU5UUwog ICB8IEFBUkNINjRfRVhUUkFfVFVORV9VU0VfTkVXX1ZFQ1RPUl9DT1NUUwogICB8IEFBUkNINjRf RVhUUkFfVFVORV9NQVRDSEVEX1ZFQ1RPUl9USFJPVUdIUFVUKSwJLyogdHVuZV9mbGFncy4gICov CiAgJmdlbmVyaWNfcHJlZmV0Y2hfdHVuZQp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB0dW5lX3Bh cmFtcyBhNjRmeF90dW5pbmdzID0KewogICZhNjRmeF9leHRyYV9jb3N0cywKICAmYTY0ZnhfYWRk cmNvc3RfdGFibGUsCiAgJmE2NGZ4X3JlZ21vdmVfY29zdCwKICAmYTY0ZnhfdmVjdG9yX2Nvc3Qs CiAgJmdlbmVyaWNfYnJhbmNoX2Nvc3QsCiAgJmdlbmVyaWNfYXBwcm94X21vZGVzLAogIFNWRV81 MTIsIC8qIHN2ZV93aWR0aCAgKi8KICB7IDQsIC8qIGxvYWRfaW50LiAgKi8KICAgIDQsIC8qIHN0 b3JlX2ludC4gICovCiAgICA0LCAvKiBsb2FkX2ZwLiAgKi8KICAgIDQsIC8qIHN0b3JlX2ZwLiAg Ki8KICAgIDQsIC8qIGxvYWRfcHJlZC4gICovCiAgICA0IC8qIHN0b3JlX3ByZWQuICAqLwogIH0s IC8qIG1lbW1vdl9jb3N0LiAgKi8KICA3LCAvKiBpc3N1ZV9yYXRlICAqLwogIChBQVJDSDY0X0ZV U0VfQUVTX0FFU01DIHwgQUFSQ0g2NF9GVVNFX0NNUF9CUkFOQ0gpLCAvKiBmdXNpYmxlX29wcyAg Ki8KICAiMzIiLAkvKiBmdW5jdGlvbl9hbGlnbi4gICovCiAgIjE2IiwJLyoganVtcF9hbGlnbi4g ICovCiAgIjMyIiwJLyogbG9vcF9hbGlnbi4gICovCiAgNCwJLyogaW50X3JlYXNzb2Nfd2lkdGgu ICAqLwogIDIsCS8qIGZwX3JlYXNzb2Nfd2lkdGguICAqLwogIDEsCS8qIGZtYV9yZWFzc29jX3dp ZHRoLiAgKi8KICAyLAkvKiB2ZWNfcmVhc3NvY193aWR0aC4gICovCiAgMiwJLyogbWluX2Rpdl9y ZWNpcF9tdWxfc2YuICAqLwogIDIsCS8qIG1pbl9kaXZfcmVjaXBfbXVsX2RmLiAgKi8KICAwLAkv KiBtYXhfY2FzZV92YWx1ZXMuICAqLwogIHR1bmVfcGFyYW1zOjpBVVRPUFJFRkVUQ0hFUl9XRUFL LAkvKiBhdXRvcHJlZmV0Y2hlcl9tb2RlbC4gICovCiAgKEFBUkNINjRfRVhUUkFfVFVORV9OT05F KSwJLyogdHVuZV9mbGFncy4gICovCiAgJmE2NGZ4X3ByZWZldGNoX3R1bmUKfTsKCi8qIFN1cHBv cnQgZm9yIGZpbmUtZ3JhaW5lZCBvdmVycmlkZSBvZiB0aGUgdHVuaW5nIHN0cnVjdHVyZXMuICAq LwpzdHJ1Y3QgYWFyY2g2NF90dW5pbmdfb3ZlcnJpZGVfZnVuY3Rpb24KewogIGNvbnN0IGNoYXIq IG5hbWU7CiAgdm9pZCAoKnBhcnNlX292ZXJyaWRlKShjb25zdCBjaGFyKiwgc3RydWN0IHR1bmVf cGFyYW1zKik7Cn07CgpzdGF0aWMgdm9pZCBhYXJjaDY0X3BhcnNlX2Z1c2Vfc3RyaW5nIChjb25z dCBjaGFyKiwgc3RydWN0IHR1bmVfcGFyYW1zKik7CnN0YXRpYyB2b2lkIGFhcmNoNjRfcGFyc2Vf dHVuZV9zdHJpbmcgKGNvbnN0IGNoYXIqLCBzdHJ1Y3QgdHVuZV9wYXJhbXMqKTsKc3RhdGljIHZv aWQgYWFyY2g2NF9wYXJzZV9zdmVfd2lkdGhfc3RyaW5nIChjb25zdCBjaGFyKiwgc3RydWN0IHR1 bmVfcGFyYW1zKik7CgpzdGF0aWMgY29uc3Qgc3RydWN0IGFhcmNoNjRfdHVuaW5nX292ZXJyaWRl X2Z1bmN0aW9uCmFhcmNoNjRfdHVuaW5nX292ZXJyaWRlX2Z1bmN0aW9uc1tdID0KewogIHsgImZ1 c2UiLCBhYXJjaDY0X3BhcnNlX2Z1c2Vfc3RyaW5nIH0sCiAgeyAidHVuZSIsIGFhcmNoNjRfcGFy c2VfdHVuZV9zdHJpbmcgfSwKICB7ICJzdmVfd2lkdGgiLCBhYXJjaDY0X3BhcnNlX3N2ZV93aWR0 aF9zdHJpbmcgfSwKICB7IE5VTEwsIE5VTEwgfQp9OwoKLyogQSBwcm9jZXNzb3IgaW1wbGVtZW50 aW5nIEFBcmNoNjQuICAqLwpzdHJ1Y3QgcHJvY2Vzc29yCnsKICBjb25zdCBjaGFyICpuYW1lOwog IGFhcmNoNjRfcHJvY2Vzc29yIGlkZW50OwogIGFhcmNoNjRfcHJvY2Vzc29yIHNjaGVkX2NvcmU7 CiAgYWFyY2g2NF9hcmNoIGFyY2g7CiAgYWFyY2g2NF9mZWF0dXJlX2ZsYWdzIGZsYWdzOwogIGNv bnN0IHR1bmVfcGFyYW1zICp0dW5lOwp9OwoKLyogQXJjaGl0ZWN0dXJlcyBpbXBsZW1lbnRpbmcg QUFyY2g2NC4gICovCnN0YXRpYyBDT05TVEVYUFIgY29uc3QgcHJvY2Vzc29yIGFsbF9hcmNoaXRl Y3R1cmVzW10gPQp7CiNkZWZpbmUgQUFSQ0g2NF9BUkNIKE5BTUUsIENPUkUsIEFSQ0hfSURFTlQs IEQsIEUpIFwKICB7TkFNRSwgQ09SRSwgQ09SRSwgQUFSQ0g2NF9BUkNIXyMjQVJDSF9JREVOVCwg XAogICBmZWF0dXJlX2RlcHM6OkFSQ0hfSURFTlQgKCkuZW5hYmxlLCBOVUxMfSwKI2luY2x1ZGUg ImFhcmNoNjQtYXJjaGVzLmRlZiIKICB7TlVMTCwgYWFyY2g2NF9ub25lLCBhYXJjaDY0X25vbmUs IGFhcmNoNjRfbm9fYXJjaCwgMCwgTlVMTH0KfTsKCi8qIFByb2Nlc3NvciBjb3JlcyBpbXBsZW1l bnRpbmcgQUFyY2g2NC4gICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvY2Vzc29yIGFsbF9jb3Jl c1tdID0KewojZGVmaW5lIEFBUkNINjRfQ09SRShOQU1FLCBJREVOVCwgU0NIRUQsIEFSQ0gsIEUs IENPU1RTLCBHLCBILCBJKSBcCiAge05BTUUsIElERU5ULCBTQ0hFRCwgQUFSQ0g2NF9BUkNIXyMj QVJDSCwgXAogICBmZWF0dXJlX2RlcHM6OmNwdV8jI0lERU5ULCAmQ09TVFMjI190dW5pbmdzfSwK I2luY2x1ZGUgImFhcmNoNjQtY29yZXMuZGVmIgogIHsiZ2VuZXJpYyIsIGdlbmVyaWMsIGNvcnRl eGE1MywgQUFSQ0g2NF9BUkNIX1Y4QSwKICAgZmVhdHVyZV9kZXBzOjpWOEEgKCkuZW5hYmxlLCAm Z2VuZXJpY190dW5pbmdzfSwKICB7TlVMTCwgYWFyY2g2NF9ub25lLCBhYXJjaDY0X25vbmUsIGFh cmNoNjRfbm9fYXJjaCwgMCwgTlVMTH0KfTsKCi8qIFRoZSBjdXJyZW50IHR1bmluZyBzZXQuICAq LwpzdHJ1Y3QgdHVuZV9wYXJhbXMgYWFyY2g2NF90dW5lX3BhcmFtcyA9IGdlbmVyaWNfdHVuaW5n czsKCi8qIENoZWNrIHdoZXRoZXIgYW4gJ2FhcmNoNjRfdmVjdG9yX3BjcycgYXR0cmlidXRlIGlz IHZhbGlkLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9hYXJjaDY0X3ZlY3Rvcl9wY3NfYXR0cmli dXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsIHRyZWUsCgkJCQkgICAgIGludCwgYm9vbCAqbm9f YWRkX2F0dHJzKQp7CiAgLyogU2luY2Ugd2Ugc2V0IGZuX3R5cGVfcmVxIHRvIHRydWUsIHRoZSBj YWxsZXIgc2hvdWxkIGhhdmUgY2hlY2tlZAogICAgIHRoaXMgZm9yIHVzLiAgKi8KICBnY2NfYXNz ZXJ0IChGVU5DX09SX01FVEhPRF9UWVBFX1AgKCpub2RlKSk7CiAgc3dpdGNoICgoYXJtX3Bjcykg Zm50eXBlX2FiaSAoKm5vZGUpLmlkICgpKQogICAgewogICAgY2FzZSBBUk1fUENTX0FBUENTNjQ6 CiAgICBjYXNlIEFSTV9QQ1NfU0lNRDoKICAgICAgcmV0dXJuIE5VTExfVFJFRTsKCiAgICBjYXNl IEFSTV9QQ1NfU1ZFOgogICAgICBlcnJvciAoInRoZSAlcUUgYXR0cmlidXRlIGNhbm5vdCBiZSBh cHBsaWVkIHRvIGFuIFNWRSBmdW5jdGlvbiB0eXBlIiwKCSAgICAgbmFtZSk7CiAgICAgICpub19h ZGRfYXR0cnMgPSB0cnVlOwogICAgICByZXR1cm4gTlVMTF9UUkVFOwoKICAgIGNhc2UgQVJNX1BD U19UTFNERVNDOgogICAgY2FzZSBBUk1fUENTX1VOS05PV046CiAgICAgIGJyZWFrOwogICAgfQog IGdjY191bnJlYWNoYWJsZSAoKTsKfQoKLyogVGFibGUgb2YgbWFjaGluZSBhdHRyaWJ1dGVzLiAg Ki8Kc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfc3BlYyBhYXJjaDY0X2F0dHJpYnV0ZV90 YWJsZVtdID0KewogIC8qIHsgbmFtZSwgbWluX2xlbiwgbWF4X2xlbiwgZGVjbF9yZXEsIHR5cGVf cmVxLCBmbl90eXBlX3JlcSwKICAgICAgIGFmZmVjdHNfdHlwZV9pZGVudGl0eSwgaGFuZGxlciwg ZXhjbHVkZSB9ICovCiAgeyAiYWFyY2g2NF92ZWN0b3JfcGNzIiwgMCwgMCwgZmFsc2UsIHRydWUs ICB0cnVlLCAgdHJ1ZSwKCQkJICBoYW5kbGVfYWFyY2g2NF92ZWN0b3JfcGNzX2F0dHJpYnV0ZSwg TlVMTCB9LAogIHsgImFybV9zdmVfdmVjdG9yX2JpdHMiLCAxLCAxLCBmYWxzZSwgdHJ1ZSwgIGZh bHNlLCB0cnVlLAoJCQkgIGFhcmNoNjRfc3ZlOjpoYW5kbGVfYXJtX3N2ZV92ZWN0b3JfYml0c19h dHRyaWJ1dGUsCgkJCSAgTlVMTCB9LAogIHsgIkFkdmFuY2VkIFNJTUQgdHlwZSIsIDEsIDEsIGZh bHNlLCB0cnVlLCAgZmFsc2UsIHRydWUsICBOVUxMLCBOVUxMIH0sCiAgeyAiU1ZFIHR5cGUiLAkJ ICAzLCAzLCBmYWxzZSwgdHJ1ZSwgIGZhbHNlLCB0cnVlLCAgTlVMTCwgTlVMTCB9LAogIHsgIlNW RSBzaXplbGVzcyB0eXBlIiwgIDAsIDAsIGZhbHNlLCB0cnVlLCAgZmFsc2UsIHRydWUsICBOVUxM LCBOVUxMIH0sCiAgeyBOVUxMLCAgICAgICAgICAgICAgICAgMCwgMCwgZmFsc2UsIGZhbHNlLCBm YWxzZSwgZmFsc2UsIE5VTEwsIE5VTEwgfQp9OwoKdHlwZWRlZiBlbnVtIGFhcmNoNjRfY29uZF9j b2RlCnsKICBBQVJDSDY0X0VRID0gMCwgQUFSQ0g2NF9ORSwgQUFSQ0g2NF9DUywgQUFSQ0g2NF9D QywgQUFSQ0g2NF9NSSwgQUFSQ0g2NF9QTCwKICBBQVJDSDY0X1ZTLCBBQVJDSDY0X1ZDLCBBQVJD SDY0X0hJLCBBQVJDSDY0X0xTLCBBQVJDSDY0X0dFLCBBQVJDSDY0X0xULAogIEFBUkNINjRfR1Qs IEFBUkNINjRfTEUsIEFBUkNINjRfQUwsIEFBUkNINjRfTlYKfQphYXJjaDY0X2NjOwoKI2RlZmlu ZSBBQVJDSDY0X0lOVkVSU0VfQ09ORElUSU9OX0NPREUoWCkgKChhYXJjaDY0X2NjKSAoKChpbnQp IFgpIF4gMSkpCgoKLyogVGhlIGNvbmRpdGlvbiBjb2RlcyBvZiB0aGUgcHJvY2Vzc29yLCBhbmQg dGhlIGludmVyc2UgZnVuY3Rpb24uICAqLwpzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFhcmNo NjRfY29uZGl0aW9uX2NvZGVzW10gPQp7CiAgImVxIiwgIm5lIiwgImNzIiwgImNjIiwgIm1pIiwg InBsIiwgInZzIiwgInZjIiwKICAiaGkiLCAibHMiLCAiZ2UiLCAibHQiLCAiZ3QiLCAibGUiLCAi YWwiLCAibnYiCn07CgovKiBUaGUgcHJlZmVycmVkIGNvbmRpdGlvbiBjb2RlcyBmb3IgU1ZFIGNv bmRpdGlvbnMuICAqLwpzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWFyY2g2NF9zdmVfY29uZGl0 aW9uX2NvZGVzW10gPQp7CiAgIm5vbmUiLCAiYW55IiwgIm5sYXN0IiwgImxhc3QiLCAiZmlyc3Qi LCAibmZyc3QiLCAidnMiLCAidmMiLAogICJwbW9yZSIsICJwbGFzdCIsICJ0Y29udCIsICJ0c3Rv cCIsICJndCIsICJsZSIsICJhbCIsICJudiIKfTsKCi8qIFJldHVybiB0aGUgYXNzZW1ibHkgdG9r ZW4gZm9yIHN2cGF0dGVybiB2YWx1ZSBWQUxVRS4gICovCgpzdGF0aWMgY29uc3QgY2hhciAqCnN2 cGF0dGVybl90b2tlbiAoZW51bSBhYXJjaDY0X3N2cGF0dGVybiBwYXR0ZXJuKQp7CiAgc3dpdGNo IChwYXR0ZXJuKQogICAgewojZGVmaW5lIENBU0UoVVBQRVIsIExPV0VSLCBWQUxVRSkgY2FzZSBB QVJDSDY0X1NWXyMjVVBQRVI6IHJldHVybiAjTE9XRVI7CiAgICBBQVJDSDY0X0ZPUl9TVlBBVFRF Uk4gKENBU0UpCiN1bmRlZiBDQVNFCiAgICBjYXNlIEFBUkNINjRfTlVNX1NWUEFUVEVSTlM6CiAg ICAgIGJyZWFrOwogICAgfQogIGdjY191bnJlYWNoYWJsZSAoKTsKfQoKLyogUmV0dXJuIHRoZSBs b2NhdGlvbiBvZiBhIHBpZWNlIHRoYXQgaXMga25vd24gdG8gYmUgcGFzc2VkIG9yIHJldHVybmVk CiAgIGluIHJlZ2lzdGVycy4gIEZJUlNUX1pSIGlzIHRoZSBmaXJzdCB1bnVzZWQgdmVjdG9yIGFy Z3VtZW50IHJlZ2lzdGVyCiAgIGFuZCBGSVJTVF9QUiBpcyB0aGUgZmlyc3QgdW51c2VkIHByZWRp Y2F0ZSBhcmd1bWVudCByZWdpc3Rlci4gICovCgpydHgKcHVyZV9zY2FsYWJsZV90eXBlX2luZm86 OnBpZWNlOjpnZXRfcnR4ICh1bnNpZ25lZCBpbnQgZmlyc3RfenIsCgkJCQkJIHVuc2lnbmVkIGlu dCBmaXJzdF9wcikgY29uc3QKewogIGdjY19hc3NlcnQgKFZFQ1RPUl9NT0RFX1AgKG1vZGUpCgkg ICAgICAmJiBmaXJzdF96ciArIG51bV96ciA8PSBWMF9SRUdOVU0gKyBOVU1fRlBfQVJHX1JFR1MK CSAgICAgICYmIGZpcnN0X3ByICsgbnVtX3ByIDw9IFAwX1JFR05VTSArIE5VTV9QUl9BUkdfUkVH Uyk7CgogIGlmIChudW1fenIgPiAwICYmIG51bV9wciA9PSAwKQogICAgcmV0dXJuIGdlbl9ydHhf UkVHIChtb2RlLCBmaXJzdF96cik7CgogIGlmIChudW1fenIgPT0gMCAmJiBudW1fcHIgPT0gMSkK ICAgIHJldHVybiBnZW5fcnR4X1JFRyAobW9kZSwgZmlyc3RfcHIpOwoKICBnY2NfdW5yZWFjaGFi bGUgKCk7Cn0KCi8qIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHZlY3RvciByZWdpc3RlcnMg cmVxdWlyZWQgYnkgdGhlIFBTVC4gICovCgp1bnNpZ25lZCBpbnQKcHVyZV9zY2FsYWJsZV90eXBl X2luZm86Om51bV96ciAoKSBjb25zdAp7CiAgdW5zaWduZWQgaW50IHJlcyA9IDA7CiAgZm9yICh1 bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwaWVjZXMubGVuZ3RoICgpOyArK2kpCiAgICByZXMgKz0g cGllY2VzW2ldLm51bV96cjsKICByZXR1cm4gcmVzOwp9CgovKiBSZXR1cm4gdGhlIHRvdGFsIG51 bWJlciBvZiBwcmVkaWNhdGUgcmVnaXN0ZXJzIHJlcXVpcmVkIGJ5IHRoZSBQU1QuICAqLwoKdW5z aWduZWQgaW50CnB1cmVfc2NhbGFibGVfdHlwZV9pbmZvOjpudW1fcHIgKCkgY29uc3QKewogIHVu c2lnbmVkIGludCByZXMgPSAwOwogIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGllY2Vz Lmxlbmd0aCAoKTsgKytpKQogICAgcmVzICs9IHBpZWNlc1tpXS5udW1fcHI7CiAgcmV0dXJuIHJl czsKfQoKLyogUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiBhIFBTVCB0aGF0IGlzIGtub3duIHRvIGJl IHBhc3NlZCBvciByZXR1cm5lZAogICBpbiByZWdpc3RlcnMuICBGSVJTVF9aUiBpcyB0aGUgZmly c3QgdW51c2VkIHZlY3RvciBhcmd1bWVudCByZWdpc3RlcgogICBhbmQgRklSU1RfUFIgaXMgdGhl IGZpcnN0IHVudXNlZCBwcmVkaWNhdGUgYXJndW1lbnQgcmVnaXN0ZXIuICAqLwoKcnR4CnB1cmVf c2NhbGFibGVfdHlwZV9pbmZvOjpnZXRfcnR4IChtYWNoaW5lX21vZGUgbW9kZSwKCQkJCSAgdW5z aWduZWQgaW50IGZpcnN0X3pyLAoJCQkJICB1bnNpZ25lZCBpbnQgZmlyc3RfcHIpIGNvbnN0CnsK ICAvKiBUcnkgdG8gcmV0dXJuIGEgc2luZ2xlIFJFRyBpZiBwb3NzaWJsZS4gIFRoaXMgbGVhZHMg dG8gYmV0dGVyCiAgICAgY29kZSBnZW5lcmF0aW9uOyBpdCBpc24ndCByZXF1aXJlZCBmb3IgY29y cmVjdG5lc3MuICAqLwogIGlmIChtb2RlID09IHBpZWNlc1swXS5tb2RlKQogICAgewogICAgICBn Y2NfYXNzZXJ0IChwaWVjZXMubGVuZ3RoICgpID09IDEpOwogICAgICByZXR1cm4gcGllY2VzWzBd LmdldF9ydHggKGZpcnN0X3pyLCBmaXJzdF9wcik7CiAgICB9CgogIC8qIEJ1aWxkIHVwIGEgUEFS QUxMRUwgdGhhdCBjb250YWlucyB0aGUgaW5kaXZpZHVhbCBwaWVjZXMuICAqLwogIHJ0dmVjIHJ0 eGVzID0gcnR2ZWNfYWxsb2MgKHBpZWNlcy5sZW5ndGggKCkpOwogIGZvciAodW5zaWduZWQgaW50 IGkgPSAwOyBpIDwgcGllY2VzLmxlbmd0aCAoKTsgKytpKQogICAgewogICAgICBydHggcmVnID0g cGllY2VzW2ldLmdldF9ydHggKGZpcnN0X3pyLCBmaXJzdF9wcik7CiAgICAgIHJ0eCBvZmZzZXQg PSBnZW5faW50X21vZGUgKHBpZWNlc1tpXS5vZmZzZXQsIFBtb2RlKTsKICAgICAgUlRWRUNfRUxU IChydHhlcywgaSkgPSBnZW5fcnR4X0VYUFJfTElTVCAoVk9JRG1vZGUsIHJlZywgb2Zmc2V0KTsK ICAgICAgZmlyc3RfenIgKz0gcGllY2VzW2ldLm51bV96cjsKICAgICAgZmlyc3RfcHIgKz0gcGll Y2VzW2ldLm51bV9wcjsKICAgIH0KICByZXR1cm4gZ2VuX3J0eF9QQVJBTExFTCAobW9kZSwgcnR4 ZXMpOwp9CgovKiBBbmFseXplIHdoZXRoZXIgVFlQRSBpcyBhIFB1cmUgU2NhbGFibGUgVHlwZSBh Y2NvcmRpbmcgdG8gdGhlIHJ1bGVzCiAgIGluIHRoZSBBQVBDUzY0LiAgKi8KCnB1cmVfc2NhbGFi bGVfdHlwZV9pbmZvOjphbmFseXNpc19yZXN1bHQKcHVyZV9zY2FsYWJsZV90eXBlX2luZm86OmFu YWx5emUgKGNvbnN0X3RyZWUgdHlwZSkKewogIC8qIFByZXZlbnQgYWNjaWRlbnRhbCByZXVzZS4g ICovCiAgZ2NjX2Fzc2VydCAocGllY2VzLmlzX2VtcHR5ICgpKTsKCiAgLyogTm8gY29kZSB3aWxs IGJlIGdlbmVyYXRlZCBmb3IgZXJyb25lb3VzIHR5cGVzLCBzbyB3ZSB3b24ndCBlc3RhYmxpc2gK ICAgICBhbiBBQkkgbWFwcGluZy4gICovCiAgaWYgKHR5cGUgPT0gZXJyb3JfbWFya19ub2RlKQog ICAgcmV0dXJuIE5PX0FCSV9JREVOVElUWTsKCiAgLyogWmVyby1zaXplZCB0eXBlcyBkaXNhcHBl YXIgaW4gdGhlIGxhbmd1YWdlLT5BQkkgbWFwcGluZy4gICovCiAgaWYgKFRZUEVfU0laRSAodHlw ZSkgJiYgaW50ZWdlcl96ZXJvcCAoVFlQRV9TSVpFICh0eXBlKSkpCiAgICByZXR1cm4gTk9fQUJJ X0lERU5USVRZOwoKICAvKiBDaGVjayBmb3IgU1ZUcywgU1BUcywgYW5kIGJ1aWx0LWluIHR1cGxl IHR5cGVzIHRoYXQgbWFwIHRvIFBTVHMuICAqLwogIHBpZWNlIHAgPSB7fTsKICBpZiAoYWFyY2g2 NF9zdmU6OmJ1aWx0aW5fdHlwZV9wICh0eXBlLCAmcC5udW1fenIsICZwLm51bV9wcikpCiAgICB7 CiAgICAgIG1hY2hpbmVfbW9kZSBtb2RlID0gVFlQRV9NT0RFX1JBVyAodHlwZSk7CiAgICAgIGdj Y19hc3NlcnQgKFZFQ1RPUl9NT0RFX1AgKG1vZGUpCgkJICAmJiAoIVRBUkdFVF9TVkUgfHwgYWFy Y2g2NF9zdmVfbW9kZV9wIChtb2RlKSkpOwoKICAgICAgcC5tb2RlID0gcC5vcmlnX21vZGUgPSBt b2RlOwogICAgICBhZGRfcGllY2UgKHApOwogICAgICByZXR1cm4gSVNfUFNUOwogICAgfQoKICAv KiBDaGVjayBmb3IgdXNlci1kZWZpbmVkIFBTVHMuICAqLwogIGlmIChUUkVFX0NPREUgKHR5cGUp ID09IEFSUkFZX1RZUEUpCiAgICByZXR1cm4gYW5hbHl6ZV9hcnJheSAodHlwZSk7CiAgaWYgKFRS RUVfQ09ERSAodHlwZSkgPT0gUkVDT1JEX1RZUEUpCiAgICByZXR1cm4gYW5hbHl6ZV9yZWNvcmQg KHR5cGUpOwoKICByZXR1cm4gSVNOVF9QU1Q7Cn0KCi8qIEFuYWx5emUgYSB0eXBlIHRoYXQgaXMg a25vd24gbm90IHRvIGJlIHBhc3NlZCBvciByZXR1cm5lZCBpbiBtZW1vcnkuCiAgIFJldHVybiB0 cnVlIGlmIGl0IGhhcyBhbiBBQkkgaWRlbnRpdHkgYW5kIGlzIGEgUHVyZSBTY2FsYWJsZSBUeXBl LiAgKi8KCmJvb2wKcHVyZV9zY2FsYWJsZV90eXBlX2luZm86OmFuYWx5emVfcmVnaXN0ZXJzIChj b25zdF90cmVlIHR5cGUpCnsKICBhbmFseXNpc19yZXN1bHQgcmVzdWx0ID0gYW5hbHl6ZSAodHlw ZSk7CiAgZ2NjX2Fzc2VydCAocmVzdWx0ICE9IERPRVNOVF9NQVRURVIpOwogIHJldHVybiByZXN1 bHQgPT0gSVNfUFNUOwp9CgovKiBTdWJyb3V0aW5lIG9mIGFuYWx5emUgZm9yIGhhbmRsaW5nIEFS UkFZX1RZUEVzLiAgKi8KCnB1cmVfc2NhbGFibGVfdHlwZV9pbmZvOjphbmFseXNpc19yZXN1bHQK cHVyZV9zY2FsYWJsZV90eXBlX2luZm86OmFuYWx5emVfYXJyYXkgKGNvbnN0X3RyZWUgdHlwZSkK ewogIC8qIEFuYWx5emUgdGhlIGVsZW1lbnQgdHlwZS4gICovCiAgcHVyZV9zY2FsYWJsZV90eXBl X2luZm8gZWxlbWVudF9pbmZvOwogIGFuYWx5c2lzX3Jlc3VsdCByZXN1bHQgPSBlbGVtZW50X2lu Zm8uYW5hbHl6ZSAoVFJFRV9UWVBFICh0eXBlKSk7CiAgaWYgKHJlc3VsdCAhPSBJU19QU1QpCiAg ICByZXR1cm4gcmVzdWx0OwoKICAvKiBBbiBhcnJheSBvZiB1bmtub3duLCBmbGV4aWJsZSBvciB2 YXJpYWJsZSBsZW5ndGggd2lsbCBiZSBwYXNzZWQgYW5kCiAgICAgcmV0dXJuZWQgYnkgcmVmZXJl bmNlIHdoYXRldmVyIHdlIGRvLiAgKi8KICB0cmVlIG5lbHRzX21pbnVzX29uZSA9IGFycmF5X3R5 cGVfbmVsdHMgKHR5cGUpOwogIGlmICghdHJlZV9maXRzX3Vod2lfcCAobmVsdHNfbWludXNfb25l KSkKICAgIHJldHVybiBET0VTTlRfTUFUVEVSOwoKICAvKiBMaWtld2lzZSBpZiB0aGUgYXJyYXkg aXMgY29uc3RhbnQtc2l6ZWQgYnV0IHRvbyBiaWcgdG8gYmUgaW50ZXJlc3RpbmcuCiAgICAgVGhl IGRvdWJsZSBjaGVja3MgYWdhaW5zdCBNQVhfUElFQ0VTIGFyZSB0byBwcm90ZWN0IGFnYWluc3Qg b3ZlcmZsb3cuICAqLwogIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgY291bnQgPSB0cmVlX3RvX3Vo d2kgKG5lbHRzX21pbnVzX29uZSk7CiAgaWYgKGNvdW50ID4gTUFYX1BJRUNFUykKICAgIHJldHVy biBET0VTTlRfTUFUVEVSOwogIGNvdW50ICs9IDE7CiAgaWYgKGNvdW50ICogZWxlbWVudF9pbmZv LnBpZWNlcy5sZW5ndGggKCkgPiBNQVhfUElFQ0VTKQogICAgcmV0dXJuIERPRVNOVF9NQVRURVI7 CgogIC8qIFRoZSBhYm92ZSBjaGVja3Mgc2hvdWxkIGhhdmUgd2VlZGVkIG91dCBlbGVtZW50cyBv ZiB1bmtub3duIHNpemUuICAqLwogIHBvbHlfdWludDY0IGVsZW1lbnRfYnl0ZXM7CiAgaWYgKCFw b2x5X2ludF90cmVlX3AgKFRZUEVfU0laRV9VTklUIChUUkVFX1RZUEUgKHR5cGUpKSwgJmVsZW1l bnRfYnl0ZXMpKQogICAgZ2NjX3VucmVhY2hhYmxlICgpOwoKICAvKiBCdWlsZCB1cCB0aGUgbGlz dCBvZiBpbmRpdmlkdWFsIHZlY3RvcnMgYW5kIHByZWRpY2F0ZXMuICAqLwogIGdjY19hc3NlcnQg KCFlbGVtZW50X2luZm8ucGllY2VzLmlzX2VtcHR5ICgpKTsKICBmb3IgKHVuc2lnbmVkIGludCBp ID0gMDsgaSA8IGNvdW50OyArK2kpCiAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IGVs ZW1lbnRfaW5mby5waWVjZXMubGVuZ3RoICgpOyArK2opCiAgICAgIHsKCXBpZWNlIHAgPSBlbGVt ZW50X2luZm8ucGllY2VzW2pdOwoJcC5vZmZzZXQgKz0gaSAqIGVsZW1lbnRfYnl0ZXM7CglhZGRf cGllY2UgKHApOwogICAgICB9CiAgcmV0dXJuIElTX1BTVDsKfQoKLyogU3Vicm91dGluZSBvZiBh bmFseXplIGZvciBoYW5kbGluZyBSRUNPUkRfVFlQRXMuICAqLwoKcHVyZV9zY2FsYWJsZV90eXBl X2luZm86OmFuYWx5c2lzX3Jlc3VsdApwdXJlX3NjYWxhYmxlX3R5cGVfaW5mbzo6YW5hbHl6ZV9y ZWNvcmQgKGNvbnN0X3RyZWUgdHlwZSkKewogIGZvciAodHJlZSBmaWVsZCA9IFRZUEVfRklFTERT ICh0eXBlKTsgZmllbGQ7IGZpZWxkID0gVFJFRV9DSEFJTiAoZmllbGQpKQogICAgewogICAgICBp ZiAoVFJFRV9DT0RFIChmaWVsZCkgIT0gRklFTERfREVDTCkKCWNvbnRpbnVlOwoKICAgICAgLyog WmVyby1zaXplZCBmaWVsZHMgZGlzYXBwZWFyIGluIHRoZSBsYW5ndWFnZS0+QUJJIG1hcHBpbmcu ICAqLwogICAgICBpZiAoREVDTF9TSVpFIChmaWVsZCkgJiYgaW50ZWdlcl96ZXJvcCAoREVDTF9T SVpFIChmaWVsZCkpKQoJY29udGludWU7CgogICAgICAvKiBBbGwgZmllbGRzIHdpdGggYW4gQUJJ IGlkZW50aXR5IG11c3QgYmUgUFNUcyBmb3IgdGhlIHJlY29yZCBhcwoJIGEgd2hvbGUgdG8gYmUg YSBQU1QuICBJZiBhbnkgaW5kaXZpZHVhbCBmaWVsZCBpcyB0b28gYmlnIHRvIGJlCgkgaW50ZXJl c3RpbmcgdGhlbiB0aGUgcmVjb3JkIGlzIHRvby4gICovCiAgICAgIHB1cmVfc2NhbGFibGVfdHlw ZV9pbmZvIGZpZWxkX2luZm87CiAgICAgIGFuYWx5c2lzX3Jlc3VsdCBzdWJyZXN1bHQgPSBmaWVs ZF9pbmZvLmFuYWx5emUgKFRSRUVfVFlQRSAoZmllbGQpKTsKICAgICAgaWYgKHN1YnJlc3VsdCA9 PSBOT19BQklfSURFTlRJVFkpCgljb250aW51ZTsKICAgICAgaWYgKHN1YnJlc3VsdCAhPSBJU19Q U1QpCglyZXR1cm4gc3VicmVzdWx0OwoKICAgICAgLyogU2luY2UgYWxsIHByZXZpb3VzIGZpZWxk cyBhcmUgUFNUcywgd2Ugb3VnaHQgdG8gYmUgYWJsZSB0byB0cmFjawoJIHRoZSBmaWVsZCBvZmZz ZXQgdXNpbmcgcG9seV9pbnRzLiAgKi8KICAgICAgdHJlZSBiaXRwb3MgPSBiaXRfcG9zaXRpb24g KGZpZWxkKTsKICAgICAgZ2NjX2Fzc2VydCAocG9seV9pbnRfdHJlZV9wIChiaXRwb3MpKTsKCiAg ICAgIC8qIEZvciB0aGUgc2FtZSByZWFzb24sIGl0IHNob3VsZG4ndCBiZSBwb3NzaWJsZSB0byBj cmVhdGUgYSBQU1QgZmllbGQKCSB3aG9zZSBvZmZzZXQgaXNuJ3QgYnl0ZS1hbGlnbmVkLiAgKi8K ICAgICAgcG9seV93aWRlc3RfaW50IHdpZGVfYnl0ZXBvcyA9IGV4YWN0X2RpdiAod2k6OnRvX3Bv bHlfd2lkZXN0IChiaXRwb3MpLAoJCQkJCQlCSVRTX1BFUl9VTklUKTsKCiAgICAgIC8qIFB1bnQg aWYgdGhlIHJlY29yZCBpcyB0b28gYmlnIHRvIGJlIGludGVyZXN0aW5nLiAgKi8KICAgICAgcG9s eV91aW50NjQgYnl0ZXBvczsKICAgICAgaWYgKCF3aWRlX2J5dGVwb3MudG9fdWh3aSAoJmJ5dGVw b3MpCgkgIHx8IHBpZWNlcy5sZW5ndGggKCkgKyBmaWVsZF9pbmZvLnBpZWNlcy5sZW5ndGggKCkg PiBNQVhfUElFQ0VTKQoJcmV0dXJuIERPRVNOVF9NQVRURVI7CgogICAgICAvKiBBZGQgdGhlIGlu ZGl2aWR1YWwgdmVjdG9ycyBhbmQgcHJlZGljYXRlcyBpbiB0aGUgZmllbGQgdG8gdGhlCgkgcmVj b3JkJ3MgbGlzdC4gICovCiAgICAgIGdjY19hc3NlcnQgKCFmaWVsZF9pbmZvLnBpZWNlcy5pc19l bXB0eSAoKSk7CiAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZmllbGRfaW5mby5w aWVjZXMubGVuZ3RoICgpOyArK2kpCgl7CgkgIHBpZWNlIHAgPSBmaWVsZF9pbmZvLnBpZWNlc1tp XTsKCSAgcC5vZmZzZXQgKz0gYnl0ZXBvczsKCSAgYWRkX3BpZWNlIChwKTsKCX0KICAgIH0KICAv KiBFbXB0eSBzdHJ1Y3R1cmVzIGRpc2FwcGVhciBpbiB0aGUgbGFuZ3VhZ2UtPkFCSSBtYXBwaW5n LiAgKi8KICByZXR1cm4gcGllY2VzLmlzX2VtcHR5ICgpID8gTk9fQUJJX0lERU5USVRZIDogSVNf UFNUOwp9CgovKiBBZGQgUCB0byB0aGUgbGlzdCBvZiBwaWVjZXMgaW4gdGhlIHR5cGUuICAqLwoK dm9pZApwdXJlX3NjYWxhYmxlX3R5cGVfaW5mbzo6YWRkX3BpZWNlIChjb25zdCBwaWVjZSAmcCkK ewogIC8qIFRyeSB0byBmb2xkIHRoZSBuZXcgcGllY2UgaW50byB0aGUgcHJldmlvdXMgb25lIHRv IGZvcm0gYQogICAgIHNpbmdsZS1tb2RlIFBTVC4gIEZvciBleGFtcGxlLCBpZiB3ZSBzZWUgdGhy ZWUgY29uc2VjdXRpdmUgdmVjdG9ycwogICAgIG9mIHRoZSBzYW1lIG1vZGUsIHdlIGNhbiByZXBy ZXNlbnQgdGhlbSB1c2luZyB0aGUgY29ycmVzcG9uZGluZwogICAgIDMtdHVwbGUgbW9kZS4KCiAg ICAgVGhpcyBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uLiAgKi8KICBpZiAoIXBpZWNlcy5pc19l bXB0eSAoKSkKICAgIHsKICAgICAgcGllY2UgJnByZXYgPSBwaWVjZXMubGFzdCAoKTsKICAgICAg Z2NjX2Fzc2VydCAoVkVDVE9SX01PREVfUCAocC5tb2RlKSAmJiBWRUNUT1JfTU9ERV9QIChwcmV2 Lm1vZGUpKTsKICAgICAgdW5zaWduZWQgaW50IG5lbGVtczEsIG5lbGVtczI7CiAgICAgIGlmIChw cmV2Lm9yaWdfbW9kZSA9PSBwLm9yaWdfbW9kZQoJICAmJiBrbm93bl9lcSAocHJldi5vZmZzZXQg KyBHRVRfTU9ERV9TSVpFIChwcmV2Lm1vZGUpLCBwLm9mZnNldCkKCSAgJiYgY29uc3RhbnRfbXVs dGlwbGVfcCAoR0VUX01PREVfTlVOSVRTIChwcmV2Lm1vZGUpLAoJCQkJICBHRVRfTU9ERV9OVU5J VFMgKHAub3JpZ19tb2RlKSwgJm5lbGVtczEpCgkgICYmIGNvbnN0YW50X211bHRpcGxlX3AgKEdF VF9NT0RFX05VTklUUyAocC5tb2RlKSwKCQkJCSAgR0VUX01PREVfTlVOSVRTIChwLm9yaWdfbW9k ZSksICZuZWxlbXMyKQoJICAmJiB0YXJnZXRtLmFycmF5X21vZGUgKHAub3JpZ19tb2RlLAoJCQkJ IG5lbGVtczEgKyBuZWxlbXMyKS5leGlzdHMgKCZwcmV2Lm1vZGUpKQoJewoJICBwcmV2Lm51bV96 ciArPSBwLm51bV96cjsKCSAgcHJldi5udW1fcHIgKz0gcC5udW1fcHI7CgkgIHJldHVybjsKCX0K ICAgIH0KICBwaWVjZXMucXVpY2tfcHVzaCAocCk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIGF0IGxl YXN0IG9uZSBwb3NzaWJsZSB2YWx1ZSBvZiB0eXBlIFRZUEUgaW5jbHVkZXMgYXQKICAgbGVhc3Qg b25lIG9iamVjdCBvZiBQdXJlIFNjYWxhYmxlIFR5cGUsIGluIHRoZSBzZW5zZSBvZiB0aGUgQUFQ Q1M2NC4KCiAgIFRoaXMgaXMgYSByZWxhdGl2ZWx5IGV4cGVuc2l2ZSB0ZXN0IGZvciBzb21lIHR5 cGVzLCBzbyBpdCBzaG91bGQKICAgZ2VuZXJhbGx5IGJlIG1hZGUgYXMgbGF0ZSBhcyBwb3NzaWJs ZS4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3NvbWVfdmFsdWVzX2luY2x1ZGVfcHN0X29iamVj dHNfcCAoY29uc3RfdHJlZSB0eXBlKQp7CiAgaWYgKFRZUEVfU0laRSAodHlwZSkgJiYgaW50ZWdl cl96ZXJvcCAoVFlQRV9TSVpFICh0eXBlKSkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChhYXJj aDY0X3N2ZTo6YnVpbHRpbl90eXBlX3AgKHR5cGUpKQogICAgcmV0dXJuIHRydWU7CgogIGlmIChU UkVFX0NPREUgKHR5cGUpID09IEFSUkFZX1RZUEUgfHwgVFJFRV9DT0RFICh0eXBlKSA9PSBDT01Q TEVYX1RZUEUpCiAgICByZXR1cm4gYWFyY2g2NF9zb21lX3ZhbHVlc19pbmNsdWRlX3BzdF9vYmpl Y3RzX3AgKFRSRUVfVFlQRSAodHlwZSkpOwoKICBpZiAoUkVDT1JEX09SX1VOSU9OX1RZUEVfUCAo dHlwZSkpCiAgICBmb3IgKHRyZWUgZmllbGQgPSBUWVBFX0ZJRUxEUyAodHlwZSk7IGZpZWxkOyBm aWVsZCA9IFRSRUVfQ0hBSU4gKGZpZWxkKSkKICAgICAgaWYgKFRSRUVfQ09ERSAoZmllbGQpID09 IEZJRUxEX0RFQ0wKCSAgJiYgYWFyY2g2NF9zb21lX3ZhbHVlc19pbmNsdWRlX3BzdF9vYmplY3Rz X3AgKFRSRUVfVFlQRSAoZmllbGQpKSkKCXJldHVybiB0cnVlOwoKICByZXR1cm4gZmFsc2U7Cn0K Ci8qIFJldHVybiB0aGUgZGVzY3JpcHRvciBvZiB0aGUgU0lNRCBBQkkuICAqLwoKc3RhdGljIGNv bnN0IHByZWRlZmluZWRfZnVuY3Rpb25fYWJpICYKYWFyY2g2NF9zaW1kX2FiaSAodm9pZCkKewog IHByZWRlZmluZWRfZnVuY3Rpb25fYWJpICZzaW1kX2FiaSA9IGZ1bmN0aW9uX2FiaXNbQVJNX1BD U19TSU1EXTsKICBpZiAoIXNpbWRfYWJpLmluaXRpYWxpemVkX3AgKCkpCiAgICB7CiAgICAgIEhB UkRfUkVHX1NFVCBmdWxsX3JlZ19jbG9iYmVycwoJPSBkZWZhdWx0X2Z1bmN0aW9uX2FiaS5mdWxs X3JlZ19jbG9iYmVycyAoKTsKICAgICAgZm9yIChpbnQgcmVnbm8gPSAwOyByZWdubyA8IEZJUlNU X1BTRVVET19SRUdJU1RFUjsgcmVnbm8rKykKCWlmIChGUF9TSU1EX1NBVkVEX1JFR05VTV9QIChy ZWdubykpCgkgIENMRUFSX0hBUkRfUkVHX0JJVCAoZnVsbF9yZWdfY2xvYmJlcnMsIHJlZ25vKTsK ICAgICAgc2ltZF9hYmkuaW5pdGlhbGl6ZSAoQVJNX1BDU19TSU1ELCBmdWxsX3JlZ19jbG9iYmVy cyk7CiAgICB9CiAgcmV0dXJuIHNpbWRfYWJpOwp9CgovKiBSZXR1cm4gdGhlIGRlc2NyaXB0b3Ig b2YgdGhlIFNWRSBQQ1MuICAqLwoKc3RhdGljIGNvbnN0IHByZWRlZmluZWRfZnVuY3Rpb25fYWJp ICYKYWFyY2g2NF9zdmVfYWJpICh2b2lkKQp7CiAgcHJlZGVmaW5lZF9mdW5jdGlvbl9hYmkgJnN2 ZV9hYmkgPSBmdW5jdGlvbl9hYmlzW0FSTV9QQ1NfU1ZFXTsKICBpZiAoIXN2ZV9hYmkuaW5pdGlh bGl6ZWRfcCAoKSkKICAgIHsKICAgICAgSEFSRF9SRUdfU0VUIGZ1bGxfcmVnX2Nsb2JiZXJzCgk9 IGRlZmF1bHRfZnVuY3Rpb25fYWJpLmZ1bGxfcmVnX2Nsb2JiZXJzICgpOwogICAgICBmb3IgKGlu dCByZWdubyA9IFY4X1JFR05VTTsgcmVnbm8gPD0gVjIzX1JFR05VTTsgKytyZWdubykKCUNMRUFS X0hBUkRfUkVHX0JJVCAoZnVsbF9yZWdfY2xvYmJlcnMsIHJlZ25vKTsKICAgICAgZm9yIChpbnQg cmVnbm8gPSBQNF9SRUdOVU07IHJlZ25vIDw9IFAxNV9SRUdOVU07ICsrcmVnbm8pCglDTEVBUl9I QVJEX1JFR19CSVQgKGZ1bGxfcmVnX2Nsb2JiZXJzLCByZWdubyk7CiAgICAgIHN2ZV9hYmkuaW5p dGlhbGl6ZSAoQVJNX1BDU19TVkUsIGZ1bGxfcmVnX2Nsb2JiZXJzKTsKICAgIH0KICByZXR1cm4g c3ZlX2FiaTsKfQoKLyogSWYgWCBpcyBhbiBVTlNQRUNfU0FMVF9BRERSIGV4cHJlc3Npb24sIHJl dHVybiB0aGUgYWRkcmVzcyB0aGF0IGl0CiAgIHdyYXBzLCBvdGhlcndpc2UgcmV0dXJuIFggaXRz ZWxmLiAgKi8KCnN0YXRpYyBydHgKc3RyaXBfc2FsdCAocnR4IHgpCnsKICBydHggc2VhcmNoID0g eDsKICBpZiAoR0VUX0NPREUgKHNlYXJjaCkgPT0gQ09OU1QpCiAgICBzZWFyY2ggPSBYRVhQIChz ZWFyY2gsIDApOwogIGlmIChHRVRfQ09ERSAoc2VhcmNoKSA9PSBVTlNQRUMgJiYgWElOVCAoc2Vh cmNoLCAxKSA9PSBVTlNQRUNfU0FMVF9BRERSKQogICAgeCA9IFhWRUNFWFAgKHNlYXJjaCwgMCwg MCk7CiAgcmV0dXJuIHg7Cn0KCi8qIExpa2Ugc3RyaXBfb2Zmc2V0LCBidXQgYWxzbyBzdHJpcCBh bnkgVU5TUEVDX1NBTFRfQUREUiBmcm9tIHRoZQogICBleHByZXNzaW9uLiAgKi8KCnN0YXRpYyBy dHgKc3RyaXBfb2Zmc2V0X2FuZF9zYWx0IChydHggYWRkciwgcG9seV9pbnQ2NCAqb2Zmc2V0KQp7 CiAgcmV0dXJuIHN0cmlwX3NhbHQgKHN0cmlwX29mZnNldCAoYWRkciwgb2Zmc2V0KSk7Cn0KCi8q IEdlbmVyYXRlIGNvZGUgdG8gZW5hYmxlIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGluIGZ1bmN0aW9u cyBvdmVyIDEgTWlCLiAgKi8KY29uc3QgY2hhciAqCmFhcmNoNjRfZ2VuX2Zhcl9icmFuY2ggKHJ0 eCAqIG9wZXJhbmRzLCBpbnQgcG9zX2xhYmVsLCBjb25zdCBjaGFyICogZGVzdCwKCQkJY29uc3Qg Y2hhciAqIGJyYW5jaF9mb3JtYXQpCnsKICAgIHJ0eF9jb2RlX2xhYmVsICogdG1wX2xhYmVsID0g Z2VuX2xhYmVsX3J0eCAoKTsKICAgIGNoYXIgbGFiZWxfYnVmWzI1Nl07CiAgICBjaGFyIGJ1ZmZl clsxMjhdOwogICAgQVNNX0dFTkVSQVRFX0lOVEVSTkFMX0xBQkVMIChsYWJlbF9idWYsIGRlc3Qs CgkJCQkgQ09ERV9MQUJFTF9OVU1CRVIgKHRtcF9sYWJlbCkpOwogICAgY29uc3QgY2hhciAqbGFi ZWxfcHRyID0gdGFyZ2V0bS5zdHJpcF9uYW1lX2VuY29kaW5nIChsYWJlbF9idWYpOwogICAgcnR4 IGRlc3RfbGFiZWwgPSBvcGVyYW5kc1twb3NfbGFiZWxdOwogICAgb3BlcmFuZHNbcG9zX2xhYmVs XSA9IHRtcF9sYWJlbDsKCiAgICBzbnByaW50ZiAoYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksICIl cyVzIiwgYnJhbmNoX2Zvcm1hdCwgbGFiZWxfcHRyKTsKICAgIG91dHB1dF9hc21faW5zbiAoYnVm ZmVyLCBvcGVyYW5kcyk7CgogICAgc25wcmludGYgKGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCAi Ylx0JSVsJWRcbiVzOiIsIHBvc19sYWJlbCwgbGFiZWxfcHRyKTsKICAgIG9wZXJhbmRzW3Bvc19s YWJlbF0gPSBkZXN0X2xhYmVsOwogICAgb3V0cHV0X2FzbV9pbnNuIChidWZmZXIsIG9wZXJhbmRz KTsKICAgIHJldHVybiAiIjsKfQoKdm9pZAphYXJjaDY0X2Vycl9ub19mcGFkdnNpbWQgKG1hY2hp bmVfbW9kZSBtb2RlKQp7CiAgaWYgKFRBUkdFVF9HRU5FUkFMX1JFR1NfT05MWSkKICAgIGlmIChG TE9BVF9NT0RFX1AgKG1vZGUpKQogICAgICBlcnJvciAoIiVxcyBpcyBpbmNvbXBhdGlibGUgd2l0 aCB0aGUgdXNlIG9mIGZsb2F0aW5nLXBvaW50IHR5cGVzIiwKCSAgICAgIi1tZ2VuZXJhbC1yZWdz LW9ubHkiKTsKICAgIGVsc2UKICAgICAgZXJyb3IgKCIlcXMgaXMgaW5jb21wYXRpYmxlIHdpdGgg dGhlIHVzZSBvZiB2ZWN0b3IgdHlwZXMiLAoJICAgICAiLW1nZW5lcmFsLXJlZ3Mtb25seSIpOwog IGVsc2UKICAgIGlmIChGTE9BVF9NT0RFX1AgKG1vZGUpKQogICAgICBlcnJvciAoIiVxcyBmZWF0 dXJlIG1vZGlmaWVyIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSB1c2Ugb2YiCgkgICAgICIgZmxv YXRpbmctcG9pbnQgdHlwZXMiLCAiK25vZnAiKTsKICAgIGVsc2UKICAgICAgZXJyb3IgKCIlcXMg ZmVhdHVyZSBtb2RpZmllciBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdXNlIG9mIgoJICAgICAi IHZlY3RvciB0eXBlcyIsICIrbm9mcCIpOwp9CgovKiBSZXBvcnQgd2hlbiB3ZSB0cnkgdG8gZG8g c29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgU1ZFIHdoZW4gU1ZFIGlzIGRpc2FibGVkLgogICBUaGlz IGlzIGFuIGVycm9yIG9mIGxhc3QgcmVzb3J0IGFuZCBpc24ndCB2ZXJ5IGhpZ2gtcXVhbGl0eS4g IEl0IHVzdWFsbHkKICAgaW52b2x2ZXMgYXR0ZW1wdHMgdG8gbWVhc3VyZSB0aGUgdmVjdG9yIGxl bmd0aCBpbiBzb21lIHdheS4gICovCnN0YXRpYyB2b2lkCmFhcmNoNjRfcmVwb3J0X3N2ZV9yZXF1 aXJlZCAodm9pZCkKewogIHN0YXRpYyBib29sIHJlcG9ydGVkX3AgPSBmYWxzZTsKCiAgLyogQXZv aWQgcmVwb3J0aW5nIGEgc2xldyBvZiBtZXNzYWdlcyBmb3IgYSBzaW5nbGUgb3ZlcnNpZ2h0LiAg Ki8KICBpZiAocmVwb3J0ZWRfcCkKICAgIHJldHVybjsKCiAgZXJyb3IgKCJ0aGlzIG9wZXJhdGlv biByZXF1aXJlcyB0aGUgU1ZFIElTQSBleHRlbnNpb24iKTsKICBpbmZvcm0gKGlucHV0X2xvY2F0 aW9uLCAieW91IGNhbiBlbmFibGUgU1ZFIHVzaW5nIHRoZSBjb21tYW5kLWxpbmUiCgkgICIgb3B0 aW9uICU8LW1hcmNoJT4sIG9yIGJ5IHVzaW5nIHRoZSAlPHRhcmdldCU+IgoJICAiIGF0dHJpYnV0 ZSBvciBwcmFnbWEiKTsKICByZXBvcnRlZF9wID0gdHJ1ZTsKfQoKLyogUmV0dXJuIHRydWUgaWYg UkVHTk8gaXMgUDAtUDE1IG9yIG9uZSBvZiB0aGUgc3BlY2lhbCBGRlItcmVsYXRlZAogICByZWdp c3RlcnMuICAqLwppbmxpbmUgYm9vbApwcl9vcl9mZnJfcmVnbnVtX3AgKHVuc2lnbmVkIGludCBy ZWdubykKewogIHJldHVybiBQUl9SRUdOVU1fUCAocmVnbm8pIHx8IHJlZ25vID09IEZGUl9SRUdO VU0gfHwgcmVnbm8gPT0gRkZSVF9SRUdOVU07Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfSVJBX0NI QU5HRV9QU0VVRE9fQUxMT0NOT19DTEFTUy4KICAgVGhlIHJlZ2lzdGVyIGFsbG9jYXRvciBjaG9v c2VzIFBPSU5URVJfQU5EX0ZQX1JFR1MgaWYgRlBfUkVHUyBhbmQKICAgR0VORVJBTF9SRUdTIGhh dmUgdGhlIHNhbWUgY29zdCAtIGV2ZW4gaWYgUE9JTlRFUl9BTkRfRlBfUkVHUyBoYXMgYSBtdWNo CiAgIGhpZ2hlciBjb3N0LiAgUE9JTlRFUl9BTkRfRlBfUkVHUyBpcyBhbHNvIHVzZWQgaWYgdGhl IGNvc3Qgb2YgYm90aCBGUF9SRUdTCiAgIGFuZCBHRU5FUkFMX1JFR1MgaXMgbG93ZXIgdGhhbiB0 aGUgbWVtb3J5IGNvc3QgKGluIHRoaXMgY2FzZSB0aGUgYmVzdCBjbGFzcwogICBpcyB0aGUgbG93 ZXN0IGNvc3Qgb25lKS4gIFVzaW5nIFBPSU5URVJfQU5EX0ZQX1JFR1MgaXJyZXNwZWN0aXZlbHkg b2YgaXRzCiAgIGNvc3QgcmVzdWx0cyBpbiBiYWQgYWxsb2NhdGlvbnMgd2l0aCBtYW55IHJlZHVu ZGFudCBpbnQ8LT5GUCBtb3ZlcyB3aGljaAogICBhcmUgZXhwZW5zaXZlIG9uIHZhcmlvdXMgY29y ZXMuCiAgIFRvIGF2b2lkIHRoaXMgd2UgZG9uJ3QgYWxsb3cgUE9JTlRFUl9BTkRfRlBfUkVHUyBh cyB0aGUgYWxsb2NubyBjbGFzcywgYnV0CiAgIGZvcmNlIGEgZGVjaXNpb24gYmV0d2VlbiBGUF9S RUdTIGFuZCBHRU5FUkFMX1JFR1MuICBXZSB1c2UgdGhlIGFsbG9jbm8gY2xhc3MKICAgaWYgaXQg aXNuJ3QgUE9JTlRFUl9BTkRfRlBfUkVHUy4gIFNpbWlsYXJseSwgdXNlIHRoZSBiZXN0IGNsYXNz IGlmIGl0IGlzbid0CiAgIFBPSU5URVJfQU5EX0ZQX1JFR1MuICBPdGhlcndpc2Ugc2V0IHRoZSBh bGxvY25vIGNsYXNzIGRlcGVuZGluZyBvbiB0aGUgbW9kZS4KICAgVGhlIHJlc3VsdCBvZiB0aGlz IGlzIHRoYXQgaXQgaXMgbm8gbG9uZ2VyIGluZWZmaWNpZW50IHRvIGhhdmUgYSBoaWdoZXIKICAg bWVtb3J5IG1vdmUgY29zdCB0aGFuIHRoZSByZWdpc3RlciBtb3ZlIGNvc3QuCiovCgpzdGF0aWMg cmVnX2NsYXNzX3QKYWFyY2g2NF9pcmFfY2hhbmdlX3BzZXVkb19hbGxvY25vX2NsYXNzIChpbnQg cmVnbm8sIHJlZ19jbGFzc190IGFsbG9jbm9fY2xhc3MsCgkJCQkJIHJlZ19jbGFzc190IGJlc3Rf Y2xhc3MpCnsKICBtYWNoaW5lX21vZGUgbW9kZTsKCiAgaWYgKCFyZWdfY2xhc3Nfc3Vic2V0X3Ag KEdFTkVSQUxfUkVHUywgYWxsb2Nub19jbGFzcykKICAgICAgfHwgIXJlZ19jbGFzc19zdWJzZXRf cCAoRlBfUkVHUywgYWxsb2Nub19jbGFzcykpCiAgICByZXR1cm4gYWxsb2Nub19jbGFzczsKCiAg aWYgKCFyZWdfY2xhc3Nfc3Vic2V0X3AgKEdFTkVSQUxfUkVHUywgYmVzdF9jbGFzcykKICAgICAg fHwgIXJlZ19jbGFzc19zdWJzZXRfcCAoRlBfUkVHUywgYmVzdF9jbGFzcykpCiAgICByZXR1cm4g YmVzdF9jbGFzczsKCiAgbW9kZSA9IFBTRVVET19SRUdOT19NT0RFIChyZWdubyk7CiAgcmV0dXJu IEZMT0FUX01PREVfUCAobW9kZSkgfHwgVkVDVE9SX01PREVfUCAobW9kZSkgPyBGUF9SRUdTIDog R0VORVJBTF9SRUdTOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50CmFhcmNoNjRfbWluX2RpdmlzaW9u c19mb3JfcmVjaXBfbXVsIChtYWNoaW5lX21vZGUgbW9kZSkKewogIGlmIChHRVRfTU9ERV9VTklU X1NJWkUgKG1vZGUpID09IDQpCiAgICByZXR1cm4gYWFyY2g2NF90dW5lX3BhcmFtcy5taW5fZGl2 X3JlY2lwX211bF9zZjsKICByZXR1cm4gYWFyY2g2NF90dW5lX3BhcmFtcy5taW5fZGl2X3JlY2lw X211bF9kZjsKfQoKLyogUmV0dXJuIHRoZSByZWFzc29jaWF0aW9uIHdpZHRoIG9mIHRyZWVvcCBP UEMgd2l0aCBtb2RlIE1PREUuICAqLwpzdGF0aWMgaW50CmFhcmNoNjRfcmVhc3NvY2lhdGlvbl93 aWR0aCAodW5zaWduZWQgb3BjLCBtYWNoaW5lX21vZGUgbW9kZSkKewogIGlmIChWRUNUT1JfTU9E RV9QIChtb2RlKSkKICAgIHJldHVybiBhYXJjaDY0X3R1bmVfcGFyYW1zLnZlY19yZWFzc29jX3dp ZHRoOwogIGlmIChJTlRFR1JBTF9NT0RFX1AgKG1vZGUpKQogICAgcmV0dXJuIGFhcmNoNjRfdHVu ZV9wYXJhbXMuaW50X3JlYXNzb2Nfd2lkdGg7CiAgLyogUmVhc3NvY2lhdGlvbiByZWR1Y2VzIHRo ZSBudW1iZXIgb2YgRk1BcyB3aGljaCBtYXkgcmVzdWx0IGluIHdvcnNlCiAgICAgcGVyZm9ybWFu Y2UuICBVc2UgYSBwZXItQ1BVIHNldHRpbmcgZm9yIEZNQSByZWFzc29jaWF0aW9uIHdoaWNoIGFs bG93cwogICAgIG5hcnJvdyBDUFVzIHdpdGggZmV3IEZQIHBpcGVzIHRvIHN3aXRjaCBpdCBvZmYg KHZhbHVlIG9mIDEpLCBhbmQgd2lkZXIKICAgICBDUFVzIHdpdGggbWFueSBGUCBwaXBlcyB0byBl bmFibGUgcmVhc3NvY2lhdGlvbi4KICAgICBTaW5jZSB0aGUgcmVhc3NvY2lhdGlvbiBwYXNzIGRv ZXNuJ3QgdW5kZXJzdGFuZCBGTUEgYXQgYWxsLCBhc3N1bWUKICAgICB0aGF0IGFueSBGUCBhZGRp dGlvbiBtaWdodCB0dXJuIGludG8gRk1BLiAgKi8KICBpZiAoRkxPQVRfTU9ERV9QIChtb2RlKSkK ICAgIHJldHVybiBvcGMgPT0gUExVU19FWFBSID8gYWFyY2g2NF90dW5lX3BhcmFtcy5mbWFfcmVh c3NvY193aWR0aAoJCQkgICAgOiBhYXJjaDY0X3R1bmVfcGFyYW1zLmZwX3JlYXNzb2Nfd2lkdGg7 CiAgcmV0dXJuIDE7Cn0KCi8qIFByb3ZpZGUgYSBtYXBwaW5nIGZyb20gZ2NjIHJlZ2lzdGVyIG51 bWJlcnMgdG8gZHdhcmYgcmVnaXN0ZXIgbnVtYmVycy4gICovCnVuc2lnbmVkCmFhcmNoNjRfZGVi dWdnZXJfcmVnbm8gKHVuc2lnbmVkIHJlZ25vKQp7CiAgIGlmIChHUF9SRUdOVU1fUCAocmVnbm8p KQogICAgIHJldHVybiBBQVJDSDY0X0RXQVJGX1IwICsgcmVnbm8gLSBSMF9SRUdOVU07CiAgIGVs c2UgaWYgKHJlZ25vID09IFNQX1JFR05VTSkKICAgICByZXR1cm4gQUFSQ0g2NF9EV0FSRl9TUDsK ICAgZWxzZSBpZiAoRlBfUkVHTlVNX1AgKHJlZ25vKSkKICAgICByZXR1cm4gQUFSQ0g2NF9EV0FS Rl9WMCArIHJlZ25vIC0gVjBfUkVHTlVNOwogICBlbHNlIGlmIChQUl9SRUdOVU1fUCAocmVnbm8p KQogICAgIHJldHVybiBBQVJDSDY0X0RXQVJGX1AwICsgcmVnbm8gLSBQMF9SRUdOVU07CiAgIGVs c2UgaWYgKHJlZ25vID09IFZHX1JFR05VTSkKICAgICByZXR1cm4gQUFSQ0g2NF9EV0FSRl9WRzsK CiAgIC8qIFJldHVybiB2YWx1ZXMgPj0gRFdBUkZfRlJBTUVfUkVHSVNURVJTIGluZGljYXRlIHRo YXQgdGhlcmUgaXMgbm8KICAgICAgZXF1aXZhbGVudCBEV0FSRiByZWdpc3Rlci4gICovCiAgIHJl dHVybiBEV0FSRl9GUkFNRV9SRUdJU1RFUlM7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfRFdBUkZf RlJBTUVfUkVHX01PREUuICAqLwpzdGF0aWMgbWFjaGluZV9tb2RlCmFhcmNoNjRfZHdhcmZfZnJh bWVfcmVnX21vZGUgKGludCByZWdubykKewogIC8qIFByZWRpY2F0ZSByZWdpc3RlcnMgYXJlIGNh bGwtY2xvYmJlcmVkIGluIHRoZSBFSCBBQkkgKHdoaWNoIGlzCiAgICAgQVJNX1BDU19BQVBDUzY0 KSwgc28gdGhleSBzaG91bGQgbm90IGJlIGRlc2NyaWJlZCBieSBDRkkuCiAgICAgVGhlaXIgc2l6 ZSBjaGFuZ2VzIGFzIFZMIGNoYW5nZXMsIHNvIGFueSB2YWx1ZXMgY29tcHV0ZWQgYnkKICAgICBf X2J1aWx0aW5faW5pdF9kd2FyZl9yZWdfc2l6ZV90YWJsZSBtaWdodCBub3QgYmUgdmFsaWQgZm9y CiAgICAgYWxsIGZyYW1lcy4gICovCiAgaWYgKFBSX1JFR05VTV9QIChyZWdubykpCiAgICByZXR1 cm4gVk9JRG1vZGU7CiAgcmV0dXJuIGRlZmF1bHRfZHdhcmZfZnJhbWVfcmVnX21vZGUgKHJlZ25v KTsKfQoKLyogSWYgWCBpcyBhIENPTlNUX0RPVUJMRSwgcmV0dXJuIGl0cyBiaXQgcmVwcmVzZW50 YXRpb24gYXMgYSBjb25zdGFudAogICBpbnRlZ2VyLCBvdGhlcndpc2UgcmV0dXJuIFggdW5tb2Rp ZmllZC4gICovCnN0YXRpYyBydHgKYWFyY2g2NF9iaXRfcmVwcmVzZW50YXRpb24gKHJ0eCB4KQp7 CiAgaWYgKENPTlNUX0RPVUJMRV9QICh4KSkKICAgIHggPSBnZW5fbG93cGFydCAoaW50X21vZGVf Zm9yX21vZGUgKEdFVF9NT0RFICh4KSkucmVxdWlyZSAoKSwgeCk7CiAgcmV0dXJuIHg7Cn0KCi8q IFJldHVybiBhbiBlc3RpbWF0ZSBmb3IgdGhlIG51bWJlciBvZiBxdWFkd29yZHMgaW4gYW4gU1ZF IHZlY3Rvci4gIFRoaXMgaXMKICAgZXF1aXZhbGVudCB0byB0aGUgbnVtYmVyIG9mIEFkdmFuY2Vk IFNJTUQgdmVjdG9ycyBpbiBhbiBTVkUgdmVjdG9yLiAgKi8Kc3RhdGljIHVuc2lnbmVkIGludAph YXJjaDY0X2VzdGltYXRlZF9zdmVfdnEgKCkKewogIHJldHVybiBlc3RpbWF0ZWRfcG9seV92YWx1 ZSAoQklUU19QRVJfU1ZFX1ZFQ1RPUikgLyAxMjg7Cn0KCi8qIFJldHVybiB0cnVlIGlmIE1PREUg aXMgYW4gU1ZFIHByZWRpY2F0ZSBtb2RlLiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2NF9zdmVfcHJl ZF9tb2RlX3AgKG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgcmV0dXJuIChUQVJHRVRfU1ZFCgkgICYm IChtb2RlID09IFZOeDE2Qkltb2RlCgkgICAgICB8fCBtb2RlID09IFZOeDhCSW1vZGUKCSAgICAg IHx8IG1vZGUgPT0gVk54NEJJbW9kZQoJICAgICAgfHwgbW9kZSA9PSBWTngyQkltb2RlKSk7Cn0K Ci8qIFRocmVlIG11dHVhbGx5LWV4Y2x1c2l2ZSBmbGFncyBkZXNjcmliaW5nIGEgdmVjdG9yIG9y IHByZWRpY2F0ZSB0eXBlLiAgKi8KY29uc3QgdW5zaWduZWQgaW50IFZFQ19BRFZTSU1EICA9IDE7 CmNvbnN0IHVuc2lnbmVkIGludCBWRUNfU1ZFX0RBVEEgPSAyOwpjb25zdCB1bnNpZ25lZCBpbnQg VkVDX1NWRV9QUkVEID0gNDsKLyogQ2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBWRUNf QURWU0lNRCBvciBWRUNfU1ZFX0RBVEEgdG8gaW5kaWNhdGUKICAgYSBzdHJ1Y3R1cmUgb2YgMiwg MyBvciA0IHZlY3RvcnMuICAqLwpjb25zdCB1bnNpZ25lZCBpbnQgVkVDX1NUUlVDVCAgID0gODsK LyogQ2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBWRUNfU1ZFX0RBVEEgdG8gaW5kaWNh dGUgdGhhdCB0aGUKICAgdmVjdG9yIGhhcyBmZXdlciBzaWduaWZpY2FudCBieXRlcyB0aGFuIGEg ZnVsbCBTVkUgdmVjdG9yLiAgKi8KY29uc3QgdW5zaWduZWQgaW50IFZFQ19QQVJUSUFMICA9IDE2 OwovKiBVc2VmdWwgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZS4gICovCmNvbnN0IHVuc2lnbmVk IGludCBWRUNfQU5ZX1NWRSAgPSBWRUNfU1ZFX0RBVEEgfCBWRUNfU1ZFX1BSRUQ7CmNvbnN0IHVu c2lnbmVkIGludCBWRUNfQU5ZX0RBVEEgPSBWRUNfQURWU0lNRCB8IFZFQ19TVkVfREFUQTsKCi8q IFJldHVybiBhIHNldCBvZiBmbGFncyBkZXNjcmliaW5nIHRoZSB2ZWN0b3IgcHJvcGVydGllcyBv ZiBtb2RlIE1PREUuCiAgIElnbm9yZSBtb2RlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRo ZSBjdXJyZW50IHRhcmdldC4gICovCnN0YXRpYyB1bnNpZ25lZCBpbnQKYWFyY2g2NF9jbGFzc2lm eV92ZWN0b3JfbW9kZSAobWFjaGluZV9tb2RlIG1vZGUpCnsKICBpZiAoYWFyY2g2NF9zdmVfcHJl ZF9tb2RlX3AgKG1vZGUpKQogICAgcmV0dXJuIFZFQ19TVkVfUFJFRDsKCiAgLyogTWFrZSB0aGUg ZGVjaXNpb24gYmFzZWQgb24gdGhlIG1vZGUncyBlbnVtIHZhbHVlIHJhdGhlciB0aGFuIGl0cwog ICAgIHByb3BlcnRpZXMsIHNvIHRoYXQgd2Uga2VlcCB0aGUgY29ycmVjdCBjbGFzc2lmaWNhdGlv biByZWdhcmRsZXNzCiAgICAgb2YgLW1zdmUtdmVjdG9yLWJpdHMuICAqLwogIHN3aXRjaCAobW9k ZSkKICAgIHsKICAgIC8qIFBhcnRpYWwgU1ZFIFFJIHZlY3RvcnMuICAqLwogICAgY2FzZSBFX1ZO eDJRSW1vZGU6CiAgICBjYXNlIEVfVk54NFFJbW9kZToKICAgIGNhc2UgRV9WTng4UUltb2RlOgog ICAgLyogUGFydGlhbCBTVkUgSEkgdmVjdG9ycy4gICovCiAgICBjYXNlIEVfVk54MkhJbW9kZToK ICAgIGNhc2UgRV9WTng0SEltb2RlOgogICAgLyogUGFydGlhbCBTVkUgU0kgdmVjdG9yLiAgKi8K ICAgIGNhc2UgRV9WTngyU0ltb2RlOgogICAgLyogUGFydGlhbCBTVkUgSEYgdmVjdG9ycy4gICov CiAgICBjYXNlIEVfVk54MkhGbW9kZToKICAgIGNhc2UgRV9WTng0SEZtb2RlOgogICAgLyogUGFy dGlhbCBTVkUgQkYgdmVjdG9ycy4gICovCiAgICBjYXNlIEVfVk54MkJGbW9kZToKICAgIGNhc2Ug RV9WTng0QkZtb2RlOgogICAgLyogUGFydGlhbCBTVkUgU0YgdmVjdG9yLiAgKi8KICAgIGNhc2Ug RV9WTngyU0Ztb2RlOgogICAgICByZXR1cm4gVEFSR0VUX1NWRSA/IFZFQ19TVkVfREFUQSB8IFZF Q19QQVJUSUFMIDogMDsKCiAgICBjYXNlIEVfVk54MTZRSW1vZGU6CiAgICBjYXNlIEVfVk54OEhJ bW9kZToKICAgIGNhc2UgRV9WTng0U0ltb2RlOgogICAgY2FzZSBFX1ZOeDJESW1vZGU6CiAgICBj YXNlIEVfVk54OEJGbW9kZToKICAgIGNhc2UgRV9WTng4SEZtb2RlOgogICAgY2FzZSBFX1ZOeDRT Rm1vZGU6CiAgICBjYXNlIEVfVk54MkRGbW9kZToKICAgICAgcmV0dXJuIFRBUkdFVF9TVkUgPyBW RUNfU1ZFX0RBVEEgOiAwOwoKICAgIC8qIHgyIFNWRSB2ZWN0b3JzLiAgKi8KICAgIGNhc2UgRV9W TngzMlFJbW9kZToKICAgIGNhc2UgRV9WTngxNkhJbW9kZToKICAgIGNhc2UgRV9WTng4U0ltb2Rl OgogICAgY2FzZSBFX1ZOeDRESW1vZGU6CiAgICBjYXNlIEVfVk54MTZCRm1vZGU6CiAgICBjYXNl IEVfVk54MTZIRm1vZGU6CiAgICBjYXNlIEVfVk54OFNGbW9kZToKICAgIGNhc2UgRV9WTng0REZt b2RlOgogICAgLyogeDMgU1ZFIHZlY3RvcnMuICAqLwogICAgY2FzZSBFX1ZOeDQ4UUltb2RlOgog ICAgY2FzZSBFX1ZOeDI0SEltb2RlOgogICAgY2FzZSBFX1ZOeDEyU0ltb2RlOgogICAgY2FzZSBF X1ZOeDZESW1vZGU6CiAgICBjYXNlIEVfVk54MjRCRm1vZGU6CiAgICBjYXNlIEVfVk54MjRIRm1v ZGU6CiAgICBjYXNlIEVfVk54MTJTRm1vZGU6CiAgICBjYXNlIEVfVk54NkRGbW9kZToKICAgIC8q IHg0IFNWRSB2ZWN0b3JzLiAgKi8KICAgIGNhc2UgRV9WTng2NFFJbW9kZToKICAgIGNhc2UgRV9W TngzMkhJbW9kZToKICAgIGNhc2UgRV9WTngxNlNJbW9kZToKICAgIGNhc2UgRV9WTng4REltb2Rl OgogICAgY2FzZSBFX1ZOeDMyQkZtb2RlOgogICAgY2FzZSBFX1ZOeDMySEZtb2RlOgogICAgY2Fz ZSBFX1ZOeDE2U0Ztb2RlOgogICAgY2FzZSBFX1ZOeDhERm1vZGU6CiAgICAgIHJldHVybiBUQVJH RVRfU1ZFID8gVkVDX1NWRV9EQVRBIHwgVkVDX1NUUlVDVCA6IDA7CgogICAgY2FzZSBFX09JbW9k ZToKICAgIGNhc2UgRV9DSW1vZGU6CiAgICBjYXNlIEVfWEltb2RlOgogICAgICByZXR1cm4gVEFS R0VUX0ZMT0FUID8gVkVDX0FEVlNJTUQgfCBWRUNfU1RSVUNUIDogMDsKCiAgICAvKiBTdHJ1Y3R1 cmVzIG9mIDY0LWJpdCBBZHZhbmNlZCBTSU1EIHZlY3RvcnMuICAqLwogICAgY2FzZSBFX1YyeDhR SW1vZGU6CiAgICBjYXNlIEVfVjJ4NEhJbW9kZToKICAgIGNhc2UgRV9WMngyU0ltb2RlOgogICAg Y2FzZSBFX1YyeDFESW1vZGU6CiAgICBjYXNlIEVfVjJ4NEJGbW9kZToKICAgIGNhc2UgRV9WMng0 SEZtb2RlOgogICAgY2FzZSBFX1YyeDJTRm1vZGU6CiAgICBjYXNlIEVfVjJ4MURGbW9kZToKICAg IGNhc2UgRV9WM3g4UUltb2RlOgogICAgY2FzZSBFX1YzeDRISW1vZGU6CiAgICBjYXNlIEVfVjN4 MlNJbW9kZToKICAgIGNhc2UgRV9WM3gxREltb2RlOgogICAgY2FzZSBFX1YzeDRCRm1vZGU6CiAg ICBjYXNlIEVfVjN4NEhGbW9kZToKICAgIGNhc2UgRV9WM3gyU0Ztb2RlOgogICAgY2FzZSBFX1Yz eDFERm1vZGU6CiAgICBjYXNlIEVfVjR4OFFJbW9kZToKICAgIGNhc2UgRV9WNHg0SEltb2RlOgog ICAgY2FzZSBFX1Y0eDJTSW1vZGU6CiAgICBjYXNlIEVfVjR4MURJbW9kZToKICAgIGNhc2UgRV9W NHg0QkZtb2RlOgogICAgY2FzZSBFX1Y0eDRIRm1vZGU6CiAgICBjYXNlIEVfVjR4MlNGbW9kZToK ICAgIGNhc2UgRV9WNHgxREZtb2RlOgogICAgICByZXR1cm4gVEFSR0VUX0ZMT0FUID8gVkVDX0FE VlNJTUQgfCBWRUNfU1RSVUNUIHwgVkVDX1BBUlRJQUwgOiAwOwoKICAgIC8qIFN0cnVjdHVyZXMg b2YgMTI4LWJpdCBBZHZhbmNlZCBTSU1EIHZlY3RvcnMuICAqLwogICAgY2FzZSBFX1YyeDE2UUlt b2RlOgogICAgY2FzZSBFX1YyeDhISW1vZGU6CiAgICBjYXNlIEVfVjJ4NFNJbW9kZToKICAgIGNh c2UgRV9WMngyREltb2RlOgogICAgY2FzZSBFX1YyeDhCRm1vZGU6CiAgICBjYXNlIEVfVjJ4OEhG bW9kZToKICAgIGNhc2UgRV9WMng0U0Ztb2RlOgogICAgY2FzZSBFX1YyeDJERm1vZGU6CiAgICBj YXNlIEVfVjN4MTZRSW1vZGU6CiAgICBjYXNlIEVfVjN4OEhJbW9kZToKICAgIGNhc2UgRV9WM3g0 U0ltb2RlOgogICAgY2FzZSBFX1YzeDJESW1vZGU6CiAgICBjYXNlIEVfVjN4OEJGbW9kZToKICAg IGNhc2UgRV9WM3g4SEZtb2RlOgogICAgY2FzZSBFX1YzeDRTRm1vZGU6CiAgICBjYXNlIEVfVjN4 MkRGbW9kZToKICAgIGNhc2UgRV9WNHgxNlFJbW9kZToKICAgIGNhc2UgRV9WNHg4SEltb2RlOgog ICAgY2FzZSBFX1Y0eDRTSW1vZGU6CiAgICBjYXNlIEVfVjR4MkRJbW9kZToKICAgIGNhc2UgRV9W NHg4QkZtb2RlOgogICAgY2FzZSBFX1Y0eDhIRm1vZGU6CiAgICBjYXNlIEVfVjR4NFNGbW9kZToK ICAgIGNhc2UgRV9WNHgyREZtb2RlOgogICAgICByZXR1cm4gVEFSR0VUX0ZMT0FUID8gVkVDX0FE VlNJTUQgfCBWRUNfU1RSVUNUIDogMDsKCiAgICAvKiA2NC1iaXQgQWR2YW5jZWQgU0lNRCB2ZWN0 b3JzLiAgKi8KICAgIGNhc2UgRV9WOFFJbW9kZToKICAgIGNhc2UgRV9WNEhJbW9kZToKICAgIGNh c2UgRV9WMlNJbW9kZToKICAgIGNhc2UgRV9WMURJbW9kZToKICAgIGNhc2UgRV9WNEhGbW9kZToK ICAgIGNhc2UgRV9WNEJGbW9kZToKICAgIGNhc2UgRV9WMlNGbW9kZToKICAgIGNhc2UgRV9WMURG bW9kZToKICAgIC8qIDEyOC1iaXQgQWR2YW5jZWQgU0lNRCB2ZWN0b3JzLiAgKi8KICAgIGNhc2Ug RV9WMTZRSW1vZGU6CiAgICBjYXNlIEVfVjhISW1vZGU6CiAgICBjYXNlIEVfVjRTSW1vZGU6CiAg ICBjYXNlIEVfVjJESW1vZGU6CiAgICBjYXNlIEVfVjhIRm1vZGU6CiAgICBjYXNlIEVfVjhCRm1v ZGU6CiAgICBjYXNlIEVfVjRTRm1vZGU6CiAgICBjYXNlIEVfVjJERm1vZGU6CiAgICAgIHJldHVy biBUQVJHRVRfRkxPQVQgPyBWRUNfQURWU0lNRCA6IDA7CgogICAgZGVmYXVsdDoKICAgICAgcmV0 dXJuIDA7CiAgICB9Cn0KCi8qIFJldHVybiB0cnVlIGlmIE1PREUgaXMgYW55IG9mIHRoZSBBZHZh bmNlZCBTSU1EIHN0cnVjdHVyZSBtb2Rlcy4gICovCmJvb2wKYWFyY2g2NF9hZHZzaW1kX3N0cnVj dF9tb2RlX3AgKG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgdW5zaWduZWQgaW50IHZlY19mbGFncyA9 IGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9yX21vZGUgKG1vZGUpOwogIHJldHVybiAodmVjX2ZsYWdz ICYgVkVDX0FEVlNJTUQpICYmICh2ZWNfZmxhZ3MgJiBWRUNfU1RSVUNUKTsKfQoKLyogUmV0dXJu IHRydWUgaWYgTU9ERSBpcyBhbiBBZHZhbmNlZCBTSU1EIEQtcmVnaXN0ZXIgc3RydWN0dXJlIG1v ZGUuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X2FkdnNpbWRfcGFydGlhbF9zdHJ1Y3RfbW9kZV9w IChtYWNoaW5lX21vZGUgbW9kZSkKewogIHJldHVybiAoYWFyY2g2NF9jbGFzc2lmeV92ZWN0b3Jf bW9kZSAobW9kZSkKCSAgPT0gKFZFQ19BRFZTSU1EIHwgVkVDX1NUUlVDVCB8IFZFQ19QQVJUSUFM KSk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIE1PREUgaXMgYW4gQWR2YW5jZWQgU0lNRCBRLXJlZ2lz dGVyIHN0cnVjdHVyZSBtb2RlLiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2NF9hZHZzaW1kX2Z1bGxf c3RydWN0X21vZGVfcCAobWFjaGluZV9tb2RlIG1vZGUpCnsKICByZXR1cm4gKGFhcmNoNjRfY2xh c3NpZnlfdmVjdG9yX21vZGUgKG1vZGUpID09IChWRUNfQURWU0lNRCB8IFZFQ19TVFJVQ1QpKTsK fQoKLyogUmV0dXJuIHRydWUgaWYgTU9ERSBpcyBhbnkgb2YgdGhlIGRhdGEgdmVjdG9yIG1vZGVz LCBpbmNsdWRpbmcKICAgc3RydWN0dXJlIG1vZGVzLiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2NF92 ZWN0b3JfZGF0YV9tb2RlX3AgKG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgcmV0dXJuIGFhcmNoNjRf Y2xhc3NpZnlfdmVjdG9yX21vZGUgKG1vZGUpICYgVkVDX0FOWV9EQVRBOwp9CgovKiBSZXR1cm4g dHJ1ZSBpZiBNT0RFIGlzIGFueSBmb3JtIG9mIFNWRSBtb2RlLCBpbmNsdWRpbmcgcHJlZGljYXRl cywKICAgdmVjdG9ycyBhbmQgc3RydWN0dXJlcy4gICovCmJvb2wKYWFyY2g2NF9zdmVfbW9kZV9w IChtYWNoaW5lX21vZGUgbW9kZSkKewogIHJldHVybiBhYXJjaDY0X2NsYXNzaWZ5X3ZlY3Rvcl9t b2RlIChtb2RlKSAmIFZFQ19BTllfU1ZFOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBNT0RFIGlzIGFu IFNWRSBkYXRhIHZlY3RvciBtb2RlOyBlaXRoZXIgYSBzaW5nbGUgdmVjdG9yCiAgIG9yIGEgc3Ry dWN0dXJlIG9mIHZlY3RvcnMuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X3N2ZV9kYXRhX21vZGVf cCAobWFjaGluZV9tb2RlIG1vZGUpCnsKICByZXR1cm4gYWFyY2g2NF9jbGFzc2lmeV92ZWN0b3Jf bW9kZSAobW9kZSkgJiBWRUNfU1ZFX0RBVEE7Cn0KCi8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGRl ZmluZWQgYnl0ZXMgaW4gb25lIGNvbnN0aXR1ZW50IHZlY3RvciBvZgogICBTVkUgbW9kZSBNT0RF LCB3aGljaCBoYXMgdmVjdG9yIGZsYWdzIFZFQ19GTEFHUy4gICovCnN0YXRpYyBwb2x5X2ludDY0 CmFhcmNoNjRfdmxfYnl0ZXMgKG1hY2hpbmVfbW9kZSBtb2RlLCB1bnNpZ25lZCBpbnQgdmVjX2Zs YWdzKQp7CiAgaWYgKHZlY19mbGFncyAmIFZFQ19QQVJUSUFMKQogICAgLyogQSBzaW5nbGUgcGFy dGlhbCB2ZWN0b3IuICAqLwogICAgcmV0dXJuIEdFVF9NT0RFX1NJWkUgKG1vZGUpOwoKICBpZiAo dmVjX2ZsYWdzICYgVkVDX1NWRV9EQVRBKQogICAgLyogQSBzaW5nbGUgdmVjdG9yIG9yIGEgdHVw bGUuICAqLwogICAgcmV0dXJuIEJZVEVTX1BFUl9TVkVfVkVDVE9SOwoKICAvKiBBIHNpbmdsZSBw cmVkaWNhdGUuICAqLwogIGdjY19hc3NlcnQgKHZlY19mbGFncyAmIFZFQ19TVkVfUFJFRCk7CiAg cmV0dXJuIEJZVEVTX1BFUl9TVkVfUFJFRDsKfQoKLyogSWYgTU9ERSBob2xkcyBhbiBhcnJheSBv ZiB2ZWN0b3JzLCByZXR1cm4gdGhlIG51bWJlciBvZiB2ZWN0b3JzCiAgIGluIHRoZSBhcnJheSwg b3RoZXJ3aXNlIHJldHVybiAxLiAgKi8KCnN0YXRpYyB1bnNpZ25lZCBpbnQKYWFyY2g2NF9sZG5f c3RuX3ZlY3RvcnMgKG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgdW5zaWduZWQgaW50IHZlY19mbGFn cyA9IGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9yX21vZGUgKG1vZGUpOwogIGlmICh2ZWNfZmxhZ3Mg PT0gKFZFQ19BRFZTSU1EIHwgVkVDX1BBUlRJQUwgfCBWRUNfU1RSVUNUKSkKICAgIHJldHVybiBl eGFjdF9kaXYgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCA4KS50b19jb25zdGFudCAoKTsKICBpZiAo dmVjX2ZsYWdzID09IChWRUNfQURWU0lNRCB8IFZFQ19TVFJVQ1QpKQogICAgcmV0dXJuIGV4YWN0 X2RpdiAoR0VUX01PREVfU0laRSAobW9kZSksIDE2KS50b19jb25zdGFudCAoKTsKICBpZiAodmVj X2ZsYWdzID09IChWRUNfU1ZFX0RBVEEgfCBWRUNfU1RSVUNUKSkKICAgIHJldHVybiBleGFjdF9k aXYgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLAoJCSAgICAgIEJZVEVTX1BFUl9TVkVfVkVDVE9SKS50 b19jb25zdGFudCAoKTsKICByZXR1cm4gMTsKfQoKLyogR2l2ZW4gYW4gQWR2YW5jZWQgU0lNRCB2 ZWN0b3IgbW9kZSBNT0RFIGFuZCBhIHR1cGxlIHNpemUgTkVMRU1TLCByZXR1cm4gdGhlCiAgIGNv cnJlc3BvbmRpbmcgdmVjdG9yIHN0cnVjdHVyZSBtb2RlLiAgKi8Kc3RhdGljIG9wdF9tYWNoaW5l X21vZGUKYWFyY2g2NF9hZHZzaW1kX3ZlY3Rvcl9hcnJheV9tb2RlIChtYWNoaW5lX21vZGUgbW9k ZSwKCQkJCSAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbmVsZW1zKQp7CiAgdW5zaWduZWQgaW50 IGZsYWdzID0gVkVDX0FEVlNJTUQgfCBWRUNfU1RSVUNUOwogIGlmIChrbm93bl9lcSAoR0VUX01P REVfU0laRSAobW9kZSksIDgpKQogICAgZmxhZ3MgfD0gVkVDX1BBUlRJQUw7CgogIG1hY2hpbmVf bW9kZSBzdHJ1Y3RfbW9kZTsKICBGT1JfRUFDSF9NT0RFX0lOX0NMQVNTIChzdHJ1Y3RfbW9kZSwg R0VUX01PREVfQ0xBU1MgKG1vZGUpKQogICAgaWYgKGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9yX21v ZGUgKHN0cnVjdF9tb2RlKSA9PSBmbGFncwoJJiYgR0VUX01PREVfSU5ORVIgKHN0cnVjdF9tb2Rl KSA9PSBHRVRfTU9ERV9JTk5FUiAobW9kZSkKCSYmIGtub3duX2VxIChHRVRfTU9ERV9OVU5JVFMg KHN0cnVjdF9tb2RlKSwKCSAgICAgR0VUX01PREVfTlVOSVRTIChtb2RlKSAqIG5lbGVtcykpCiAg ICAgIHJldHVybiBzdHJ1Y3RfbW9kZTsKICByZXR1cm4gb3B0X21hY2hpbmVfbW9kZSAoKTsKfQoK LyogUmV0dXJuIHRoZSBTVkUgdmVjdG9yIG1vZGUgdGhhdCBoYXMgTlVOSVRTIGVsZW1lbnRzIG9m IG1vZGUgSU5ORVJfTU9ERS4gICovCgpvcHRfbWFjaGluZV9tb2RlCmFhcmNoNjRfc3ZlX2RhdGFf bW9kZSAoc2NhbGFyX21vZGUgaW5uZXJfbW9kZSwgcG9seV91aW50NjQgbnVuaXRzKQp7CiAgZW51 bSBtb2RlX2NsYXNzIG1jbGFzcyA9IChpc19hIDxzY2FsYXJfZmxvYXRfbW9kZT4gKGlubmVyX21v ZGUpCgkJCSAgICA/IE1PREVfVkVDVE9SX0ZMT0FUIDogTU9ERV9WRUNUT1JfSU5UKTsKICBtYWNo aW5lX21vZGUgbW9kZTsKICBGT1JfRUFDSF9NT0RFX0lOX0NMQVNTIChtb2RlLCBtY2xhc3MpCiAg ICBpZiAoaW5uZXJfbW9kZSA9PSBHRVRfTU9ERV9JTk5FUiAobW9kZSkKCSYmIGtub3duX2VxIChu dW5pdHMsIEdFVF9NT0RFX05VTklUUyAobW9kZSkpCgkmJiBhYXJjaDY0X3N2ZV9kYXRhX21vZGVf cCAobW9kZSkpCiAgICAgIHJldHVybiBtb2RlOwogIHJldHVybiBvcHRfbWFjaGluZV9tb2RlICgp Owp9CgovKiBJbXBsZW1lbnQgdGFyZ2V0IGhvb2sgVEFSR0VUX0FSUkFZX01PREUuICAqLwpzdGF0 aWMgb3B0X21hY2hpbmVfbW9kZQphYXJjaDY0X2FycmF5X21vZGUgKG1hY2hpbmVfbW9kZSBtb2Rl LCB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIG5lbGVtcykKewogIGlmIChhYXJjaDY0X2NsYXNzaWZ5 X3ZlY3Rvcl9tb2RlIChtb2RlKSA9PSBWRUNfU1ZFX0RBVEEKICAgICAgJiYgSU5fUkFOR0UgKG5l bGVtcywgMiwgNCkpCiAgICByZXR1cm4gYWFyY2g2NF9zdmVfZGF0YV9tb2RlIChHRVRfTU9ERV9J Tk5FUiAobW9kZSksCgkJCQkgIEdFVF9NT0RFX05VTklUUyAobW9kZSkgKiBuZWxlbXMpOwogIGlm IChhYXJjaDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlIChtb2RlKSA9PSBWRUNfQURWU0lNRAogICAg ICAmJiBJTl9SQU5HRSAobmVsZW1zLCAyLCA0KSkKICAgIHJldHVybiBhYXJjaDY0X2FkdnNpbWRf dmVjdG9yX2FycmF5X21vZGUgKG1vZGUsIG5lbGVtcyk7CgogIHJldHVybiBvcHRfbWFjaGluZV9t b2RlICgpOwp9CgovKiBJbXBsZW1lbnQgdGFyZ2V0IGhvb2sgVEFSR0VUX0FSUkFZX01PREVfU1VQ UE9SVEVEX1AuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X2FycmF5X21vZGVfc3VwcG9ydGVkX3Ag KG1hY2hpbmVfbW9kZSBtb2RlLAoJCQkJdW5zaWduZWQgSE9TVF9XSURFX0lOVCBuZWxlbXMpCnsK ICBpZiAoVEFSR0VUX1NJTUQKICAgICAgJiYgKEFBUkNINjRfVkFMSURfU0lNRF9RUkVHX01PREUg KG1vZGUpCgkgIHx8IEFBUkNINjRfVkFMSURfU0lNRF9EUkVHX01PREUgKG1vZGUpKQogICAgICAm JiAobmVsZW1zID49IDIgJiYgbmVsZW1zIDw9IDQpKQogICAgcmV0dXJuIHRydWU7CgogIHJldHVy biBmYWxzZTsKfQoKLyogTU9ERSBpcyBzb21lIGZvcm0gb2YgU1ZFIHZlY3RvciBtb2RlLiAgRm9y IGRhdGEgbW9kZXMsIHJldHVybiB0aGUgbnVtYmVyCiAgIG9mIHZlY3RvciByZWdpc3RlciBiaXRz IHRoYXQgZWFjaCBlbGVtZW50IG9mIE1PREUgb2NjdXBpZXMsIHN1Y2ggYXMgNjQKICAgZm9yIGJv dGggVk54MkRJbW9kZSBhbmQgVk54MlNJbW9kZSAod2hlcmUgZWFjaCAzMi1iaXQgdmFsdWUgaXMg c3RvcmVkCiAgIGluIGEgNjQtYml0IGNvbnRhaW5lcikuICBGb3IgcHJlZGljYXRlIG1vZGVzLCBy ZXR1cm4gdGhlIG51bWJlciBvZgogICBkYXRhIGJpdHMgY29udHJvbGxlZCBieSBlYWNoIHNpZ25p ZmljYW50IHByZWRpY2F0ZSBiaXQuICAqLwoKc3RhdGljIHVuc2lnbmVkIGludAphYXJjaDY0X3N2 ZV9jb250YWluZXJfYml0cyAobWFjaGluZV9tb2RlIG1vZGUpCnsKICB1bnNpZ25lZCBpbnQgdmVj X2ZsYWdzID0gYWFyY2g2NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAobW9kZSk7CiAgcG9seV91aW50 NjQgdmVjdG9yX2JpdHMgPSAodmVjX2ZsYWdzICYgKFZFQ19QQVJUSUFMIHwgVkVDX1NWRV9QUkVE KQoJCQkgICAgID8gQklUU19QRVJfU1ZFX1ZFQ1RPUgoJCQkgICAgIDogR0VUX01PREVfQklUU0la RSAobW9kZSkpOwogIHJldHVybiB2ZWN0b3JfZWxlbWVudF9zaXplICh2ZWN0b3JfYml0cywgR0VU X01PREVfTlVOSVRTIChtb2RlKSk7Cn0KCi8qIFJldHVybiB0aGUgU1ZFIHByZWRpY2F0ZSBtb2Rl IHRvIHVzZSBmb3IgZWxlbWVudHMgdGhhdCBoYXZlCiAgIEVMRU1fTkJZVEVTIGJ5dGVzLCBpZiBz dWNoIGEgbW9kZSBleGlzdHMuICAqLwoKb3B0X21hY2hpbmVfbW9kZQphYXJjaDY0X3N2ZV9wcmVk X21vZGUgKHVuc2lnbmVkIGludCBlbGVtX25ieXRlcykKewogIGlmIChUQVJHRVRfU1ZFKQogICAg ewogICAgICBpZiAoZWxlbV9uYnl0ZXMgPT0gMSkKCXJldHVybiBWTngxNkJJbW9kZTsKICAgICAg aWYgKGVsZW1fbmJ5dGVzID09IDIpCglyZXR1cm4gVk54OEJJbW9kZTsKICAgICAgaWYgKGVsZW1f bmJ5dGVzID09IDQpCglyZXR1cm4gVk54NEJJbW9kZTsKICAgICAgaWYgKGVsZW1fbmJ5dGVzID09 IDgpCglyZXR1cm4gVk54MkJJbW9kZTsKICAgIH0KICByZXR1cm4gb3B0X21hY2hpbmVfbW9kZSAo KTsKfQoKLyogUmV0dXJuIHRoZSBTVkUgcHJlZGljYXRlIG1vZGUgdGhhdCBzaG91bGQgYmUgdXNl ZCB0byBjb250cm9sCiAgIFNWRSBtb2RlIE1PREUuICAqLwoKbWFjaGluZV9tb2RlCmFhcmNoNjRf c3ZlX3ByZWRfbW9kZSAobWFjaGluZV9tb2RlIG1vZGUpCnsKICB1bnNpZ25lZCBpbnQgYml0cyA9 IGFhcmNoNjRfc3ZlX2NvbnRhaW5lcl9iaXRzIChtb2RlKTsKICByZXR1cm4gYWFyY2g2NF9zdmVf cHJlZF9tb2RlIChiaXRzIC8gQklUU19QRVJfVU5JVCkucmVxdWlyZSAoKTsKfQoKLyogSW1wbGVt ZW50IFRBUkdFVF9WRUNUT1JJWkVfR0VUX01BU0tfTU9ERS4gICovCgpzdGF0aWMgb3B0X21hY2hp bmVfbW9kZQphYXJjaDY0X2dldF9tYXNrX21vZGUgKG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgdW5z aWduZWQgaW50IHZlY19mbGFncyA9IGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9yX21vZGUgKG1vZGUp OwogIGlmICh2ZWNfZmxhZ3MgJiBWRUNfU1ZFX0RBVEEpCiAgICByZXR1cm4gYWFyY2g2NF9zdmVf cHJlZF9tb2RlIChtb2RlKTsKCiAgcmV0dXJuIGRlZmF1bHRfZ2V0X21hc2tfbW9kZSAobW9kZSk7 Cn0KCi8qIFJldHVybiB0aGUgaW50ZWdlciBlbGVtZW50IG1vZGUgYXNzb2NpYXRlZCB3aXRoIFNW RSBtb2RlIE1PREUuICAqLwoKc3RhdGljIHNjYWxhcl9pbnRfbW9kZQphYXJjaDY0X3N2ZV9lbGVt ZW50X2ludF9tb2RlIChtYWNoaW5lX21vZGUgbW9kZSkKewogIHBvbHlfdWludDY0IHZlY3Rvcl9i aXRzID0gKEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX1ZFQ1RPUl9CT09MCgkJCSAgICAg PyBCSVRTX1BFUl9TVkVfVkVDVE9SCgkJCSAgICAgOiBHRVRfTU9ERV9CSVRTSVpFIChtb2RlKSk7 CiAgdW5zaWduZWQgaW50IGVsdF9iaXRzID0gdmVjdG9yX2VsZW1lbnRfc2l6ZSAodmVjdG9yX2Jp dHMsCgkJCQkJICAgICAgIEdFVF9NT0RFX05VTklUUyAobW9kZSkpOwogIHJldHVybiBpbnRfbW9k ZV9mb3Jfc2l6ZSAoZWx0X2JpdHMsIDApLnJlcXVpcmUgKCk7Cn0KCi8qIFJldHVybiBhbiBpbnRl Z2VyIGVsZW1lbnQgbW9kZSB0aGF0IGNvbnRhaW5zIGV4YWN0bHkKICAgYWFyY2g2NF9zdmVfY29u dGFpbmVyX2JpdHMgKE1PREUpIGJpdHMuICBUaGlzIGlzIHdpZGVyIHRoYW4KICAgYWFyY2g2NF9z dmVfZWxlbWVudF9pbnRfbW9kZSBpZiBNT0RFIGlzIGEgcGFydGlhbCB2ZWN0b3IsCiAgIG90aGVy d2lzZSBpdCdzIHRoZSBzYW1lLiAgKi8KCnN0YXRpYyBzY2FsYXJfaW50X21vZGUKYWFyY2g2NF9z dmVfY29udGFpbmVyX2ludF9tb2RlIChtYWNoaW5lX21vZGUgbW9kZSkKewogIHJldHVybiBpbnRf bW9kZV9mb3Jfc2l6ZSAoYWFyY2g2NF9zdmVfY29udGFpbmVyX2JpdHMgKG1vZGUpLCAwKS5yZXF1 aXJlICgpOwp9CgovKiBSZXR1cm4gdGhlIGludGVnZXIgdmVjdG9yIG1vZGUgYXNzb2NpYXRlZCB3 aXRoIFNWRSBtb2RlIE1PREUuCiAgIFVubGlrZSByZWxhdGVkX2ludF92ZWN0b3JfbW9kZSwgdGhp cyBjYW4gaGFuZGxlIHRoZSBjYXNlIGluIHdoaWNoCiAgIE1PREUgaXMgYSBwcmVkaWNhdGUgKGFu ZCB0aHVzIGhhcyBhIGRpZmZlcmVudCB0b3RhbCBzaXplKS4gICovCgptYWNoaW5lX21vZGUKYWFy Y2g2NF9zdmVfaW50X21vZGUgKG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgc2NhbGFyX2ludF9tb2Rl IGludF9tb2RlID0gYWFyY2g2NF9zdmVfZWxlbWVudF9pbnRfbW9kZSAobW9kZSk7CiAgcmV0dXJu IGFhcmNoNjRfc3ZlX2RhdGFfbW9kZSAoaW50X21vZGUsIEdFVF9NT0RFX05VTklUUyAobW9kZSkp LnJlcXVpcmUgKCk7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfVkVDVE9SSVpFX1JFTEFURURfTU9E RS4gICovCgpzdGF0aWMgb3B0X21hY2hpbmVfbW9kZQphYXJjaDY0X3ZlY3Rvcml6ZV9yZWxhdGVk X21vZGUgKG1hY2hpbmVfbW9kZSB2ZWN0b3JfbW9kZSwKCQkJCXNjYWxhcl9tb2RlIGVsZW1lbnRf bW9kZSwKCQkJCXBvbHlfdWludDY0IG51bml0cykKewogIHVuc2lnbmVkIGludCB2ZWNfZmxhZ3Mg PSBhYXJjaDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlICh2ZWN0b3JfbW9kZSk7CgogIC8qIElmIHdl J3JlIG9wZXJhdGluZyBvbiBTVkUgdmVjdG9ycywgdHJ5IHRvIHJldHVybiBhbiBTVkUgbW9kZS4g ICovCiAgcG9seV91aW50NjQgc3ZlX251bml0czsKICBpZiAoKHZlY19mbGFncyAmIFZFQ19TVkVf REFUQSkKICAgICAgJiYgbXVsdGlwbGVfcCAoQllURVNfUEVSX1NWRV9WRUNUT1IsCgkJICAgICBH RVRfTU9ERV9TSVpFIChlbGVtZW50X21vZGUpLCAmc3ZlX251bml0cykpCiAgICB7CiAgICAgIG1h Y2hpbmVfbW9kZSBzdmVfbW9kZTsKICAgICAgaWYgKG1heWJlX25lIChudW5pdHMsIDBVKSkKCXsK CSAgLyogVHJ5IHRvIGZpbmQgYSBmdWxsIG9yIHBhcnRpYWwgU1ZFIG1vZGUgd2l0aCBleGFjdGx5 CgkgICAgIE5VTklUUyB1bml0cy4gICovCgkgIGlmIChtdWx0aXBsZV9wIChzdmVfbnVuaXRzLCBu dW5pdHMpCgkgICAgICAmJiBhYXJjaDY0X3N2ZV9kYXRhX21vZGUgKGVsZW1lbnRfbW9kZSwKCQkJ CQludW5pdHMpLmV4aXN0cyAoJnN2ZV9tb2RlKSkKCSAgICByZXR1cm4gc3ZlX21vZGU7Cgl9CiAg ICAgIGVsc2UKCXsKCSAgLyogVGFrZSB0aGUgcHJlZmVycmVkIG51bWJlciBvZiB1bml0cyBmcm9t IHRoZSBudW1iZXIgb2YgYnl0ZXMKCSAgICAgdGhhdCBmaXQgaW4gVkVDVE9SX01PREUuICBXZSBh bHdheXMgc3RhcnQgYnkgImF1dG9kZXRlY3RpbmciCgkgICAgIGEgZnVsbCB2ZWN0b3IgbW9kZSB3 aXRoIHByZWZlcnJlZF9zaW1kX21vZGUsIHNvIHZlY3RvcnMKCSAgICAgY2hvc2VuIGhlcmUgd2ls bCBhbHNvIGJlIGZ1bGwgdmVjdG9yIG1vZGVzLiAgVGhlbgoJICAgICBhdXRvdmVjdG9yaXplX3Zl Y3Rvcl9tb2RlcyB0cmllcyBzbWFsbGVyIHN0YXJ0aW5nIG1vZGVzCgkgICAgIGFuZCB0aHVzIHNt YWxsZXIgcHJlZmVycmVkIG51bWJlcnMgb2YgdW5pdHMuICAqLwoJICBzdmVfbnVuaXRzID0gb3Jk ZXJlZF9taW4gKHN2ZV9udW5pdHMsIEdFVF9NT0RFX1NJWkUgKHZlY3Rvcl9tb2RlKSk7CgkgIGlm IChhYXJjaDY0X3N2ZV9kYXRhX21vZGUgKGVsZW1lbnRfbW9kZSwKCQkJCSAgICAgc3ZlX251bml0 cykuZXhpc3RzICgmc3ZlX21vZGUpKQoJICAgIHJldHVybiBzdmVfbW9kZTsKCX0KICAgIH0KCiAg LyogUHJlZmVyIHRvIHVzZSAxIDEyOC1iaXQgdmVjdG9yIGluc3RlYWQgb2YgMiA2NC1iaXQgdmVj dG9ycy4gICovCiAgaWYgKFRBUkdFVF9TSU1ECiAgICAgICYmICh2ZWNfZmxhZ3MgJiBWRUNfQURW U0lNRCkKICAgICAgJiYga25vd25fZXEgKG51bml0cywgMFUpCiAgICAgICYmIGtub3duX2VxIChH RVRfTU9ERV9CSVRTSVpFICh2ZWN0b3JfbW9kZSksIDY0VSkKICAgICAgJiYgbWF5YmVfZ2UgKEdF VF9NT0RFX0JJVFNJWkUgKGVsZW1lbnRfbW9kZSkKCQkgICAqIEdFVF9NT0RFX05VTklUUyAodmVj dG9yX21vZGUpLCAxMjhVKSkKICAgIHsKICAgICAgbWFjaGluZV9tb2RlIHJlcyA9IGFhcmNoNjRf c2ltZF9jb250YWluZXJfbW9kZSAoZWxlbWVudF9tb2RlLCAxMjgpOwogICAgICBpZiAoVkVDVE9S X01PREVfUCAocmVzKSkKCXJldHVybiByZXM7CiAgICB9CgogIHJldHVybiBkZWZhdWx0X3ZlY3Rv cml6ZV9yZWxhdGVkX21vZGUgKHZlY3Rvcl9tb2RlLCBlbGVtZW50X21vZGUsIG51bml0cyk7Cn0K Ci8qIEltcGxlbWVudCBUQVJHRVRfVkVDVE9SSVpFX1BSRUZFUlJFRF9ESVZfQVNfU0hJRlRTX09W RVJfTVVMVC4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3ZlY3Rvcml6ZV9wcmVmZXJyZWRfZGl2 X2FzX3NoaWZ0c19vdmVyX211bHQgKGNvbnN0X3RyZWUgdHlwZSkKewogIG1hY2hpbmVfbW9kZSBt b2RlID0gVFlQRV9NT0RFICh0eXBlKTsKICB1bnNpZ25lZCBpbnQgdmVjX2ZsYWdzID0gYWFyY2g2 NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAobW9kZSk7CiAgYm9vbCBzdmVfcCA9ICh2ZWNfZmxhZ3Mg JiBWRUNfQU5ZX1NWRSk7CiAgYm9vbCBzaW1kX3AgPSAodmVjX2ZsYWdzICYgVkVDX0FEVlNJTUQp OwoKICByZXR1cm4gKHN2ZV9wICYmIFRBUkdFVF9TVkUyKSB8fCAoc2ltZF9wICYmIFRBUkdFVF9T SU1EKTsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9QUkVGRVJSRURfRUxTRV9WQUxVRS4gIEZvciBi aW5hcnkgb3BlcmF0aW9ucywKICAgcHJlZmVyIHRvIHVzZSB0aGUgZmlyc3QgYXJpdGhtZXRpYyBv cGVyYW5kIGFzIHRoZSBlbHNlIHZhbHVlIGlmCiAgIHRoZSBlbHNlIHZhbHVlIGRvZXNuJ3QgbWF0 dGVyLCBzaW5jZSB0aGF0IGV4YWN0bHkgbWF0Y2hlcyB0aGUgU1ZFCiAgIGRlc3RydWN0aXZlIG1l cmdpbmcgZm9ybS4gIEZvciB0ZXJuYXJ5IG9wZXJhdGlvbnMgd2UgY291bGQgZWl0aGVyCiAgIHBp Y2sgdGhlIGZpcnN0IG9wZXJhbmQgYW5kIHVzZSBGTUFELWxpa2UgaW5zdHJ1Y3Rpb25zIG9yIHRo ZSBsYXN0CiAgIG9wZXJhbmQgYW5kIHVzZSBGTUxBLWxpa2UgaW5zdHJ1Y3Rpb25zOyB0aGUgbGF0 dGVyIHNlZW1zIG1vcmUKICAgbmF0dXJhbC4gICovCgpzdGF0aWMgdHJlZQphYXJjaDY0X3ByZWZl cnJlZF9lbHNlX3ZhbHVlICh1bnNpZ25lZCwgdHJlZSwgdW5zaWduZWQgaW50IG5vcHMsIHRyZWUg Km9wcykKewogIHJldHVybiBub3BzID09IDMgPyBvcHNbMl0gOiBvcHNbMF07Cn0KCi8qIEltcGxl bWVudCBUQVJHRVRfSEFSRF9SRUdOT19OUkVHUy4gICovCgpzdGF0aWMgdW5zaWduZWQgaW50CmFh cmNoNjRfaGFyZF9yZWdub19ucmVncyAodW5zaWduZWQgcmVnbm8sIG1hY2hpbmVfbW9kZSBtb2Rl KQp7CiAgLyogPz8/IExvZ2ljYWxseSB3ZSBzaG91bGQgb25seSBuZWVkIHRvIHByb3ZpZGUgYSB2 YWx1ZSB3aGVuCiAgICAgSEFSRF9SRUdOT19NT0RFX09LIHNheXMgdGhhdCB0aGUgY29tYmluYXRp b24gaXMgdmFsaWQsCiAgICAgYnV0IGF0IHRoZSBtb21lbnQgd2UgbmVlZCB0byBoYW5kbGUgYWxs IG1vZGVzLiAgSnVzdCBpZ25vcmUKICAgICBhbnkgcnVudGltZSBwYXJ0cyBmb3IgcmVnaXN0ZXJz IHRoYXQgY2FuJ3Qgc3RvcmUgdGhlbS4gICovCiAgSE9TVF9XSURFX0lOVCBsb3dlc3Rfc2l6ZSA9 IGNvbnN0YW50X2xvd2VyX2JvdW5kIChHRVRfTU9ERV9TSVpFIChtb2RlKSk7CiAgc3dpdGNoIChh YXJjaDY0X3JlZ25vX3JlZ2NsYXNzIChyZWdubykpCiAgICB7CiAgICBjYXNlIEZQX1JFR1M6CiAg ICBjYXNlIEZQX0xPX1JFR1M6CiAgICBjYXNlIEZQX0xPOF9SRUdTOgogICAgICB7Cgl1bnNpZ25l ZCBpbnQgdmVjX2ZsYWdzID0gYWFyY2g2NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAobW9kZSk7Cglp ZiAodmVjX2ZsYWdzICYgVkVDX1NWRV9EQVRBKQoJICByZXR1cm4gZXhhY3RfZGl2IChHRVRfTU9E RV9TSVpFIChtb2RlKSwKCQkJICAgIGFhcmNoNjRfdmxfYnl0ZXMgKG1vZGUsIHZlY19mbGFncykp LnRvX2NvbnN0YW50ICgpOwoJaWYgKHZlY19mbGFncyA9PSAoVkVDX0FEVlNJTUQgfCBWRUNfU1RS VUNUIHwgVkVDX1BBUlRJQUwpKQoJICByZXR1cm4gR0VUX01PREVfU0laRSAobW9kZSkudG9fY29u c3RhbnQgKCkgLyA4OwoJcmV0dXJuIENFSUwgKGxvd2VzdF9zaXplLCBVTklUU19QRVJfVlJFRyk7 CiAgICAgIH0KICAgIGNhc2UgUFJfUkVHUzoKICAgIGNhc2UgUFJfTE9fUkVHUzoKICAgIGNhc2Ug UFJfSElfUkVHUzoKICAgIGNhc2UgRkZSX1JFR1M6CiAgICBjYXNlIFBSX0FORF9GRlJfUkVHUzoK ICAgICAgcmV0dXJuIDE7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gQ0VJTCAobG93ZXN0X3Np emUsIFVOSVRTX1BFUl9XT1JEKTsKICAgIH0KICBnY2NfdW5yZWFjaGFibGUgKCk7Cn0KCi8qIElt cGxlbWVudCBUQVJHRVRfSEFSRF9SRUdOT19NT0RFX09LLiAgKi8KCnN0YXRpYyBib29sCmFhcmNo NjRfaGFyZF9yZWdub19tb2RlX29rICh1bnNpZ25lZCByZWdubywgbWFjaGluZV9tb2RlIG1vZGUp CnsKICBpZiAobW9kZSA9PSBWOERJbW9kZSkKICAgIHJldHVybiBJTl9SQU5HRSAocmVnbm8sIFIw X1JFR05VTSwgUjIzX1JFR05VTSkKICAgICAgICAgICAmJiBtdWx0aXBsZV9wIChyZWdubyAtIFIw X1JFR05VTSwgMik7CgogIGlmIChHRVRfTU9ERV9DTEFTUyAobW9kZSkgPT0gTU9ERV9DQykKICAg IHJldHVybiByZWdubyA9PSBDQ19SRUdOVU07CgogIGlmIChyZWdubyA9PSBWR19SRUdOVU0pCiAg ICAvKiBUaGlzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIF9VbndpbmRfV29yZC4gICovCiAg ICByZXR1cm4gbW9kZSA9PSBESW1vZGU7CgogIHVuc2lnbmVkIGludCB2ZWNfZmxhZ3MgPSBhYXJj aDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlIChtb2RlKTsKICBpZiAodmVjX2ZsYWdzICYgVkVDX1NW RV9QUkVEKQogICAgcmV0dXJuIHByX29yX2Zmcl9yZWdudW1fcCAocmVnbm8pOwoKICBpZiAocHJf b3JfZmZyX3JlZ251bV9wIChyZWdubykpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChyZWdubyA9 PSBTUF9SRUdOVU0pCiAgICAvKiBUaGUgcHVycG9zZSBvZiBjb21wYXJpbmcgd2l0aCBwdHJfbW9k ZSBpcyB0byBzdXBwb3J0IHRoZQogICAgICAgZ2xvYmFsIHJlZ2lzdGVyIHZhcmlhYmxlIGFzc29j aWF0ZWQgd2l0aCB0aGUgc3RhY2sgcG9pbnRlcgogICAgICAgcmVnaXN0ZXIgdmlhIHRoZSBzeW50 YXggb2YgYXNtICgid3NwIikgaW4gSUxQMzIuICAqLwogICAgcmV0dXJuIG1vZGUgPT0gUG1vZGUg fHwgbW9kZSA9PSBwdHJfbW9kZTsKCiAgaWYgKHJlZ25vID09IEZSQU1FX1BPSU5URVJfUkVHTlVN IHx8IHJlZ25vID09IEFSR19QT0lOVEVSX1JFR05VTSkKICAgIHJldHVybiBtb2RlID09IFBtb2Rl OwoKICBpZiAoR1BfUkVHTlVNX1AgKHJlZ25vKSkKICAgIHsKICAgICAgaWYgKHZlY19mbGFncyAm IChWRUNfQU5ZX1NWRSB8IFZFQ19TVFJVQ1QpKQoJcmV0dXJuIGZhbHNlOwogICAgICBpZiAoa25v d25fbGUgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCA4KSkKCXJldHVybiB0cnVlOwogICAgICBpZiAo a25vd25fbGUgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCAxNikpCglyZXR1cm4gKHJlZ25vICYgMSkg PT0gMDsKICAgIH0KICBlbHNlIGlmIChGUF9SRUdOVU1fUCAocmVnbm8pKQogICAgewogICAgICBp ZiAodmVjX2ZsYWdzICYgVkVDX1NUUlVDVCkKCXJldHVybiBlbmRfaGFyZF9yZWdubyAobW9kZSwg cmVnbm8pIC0gMSA8PSBWMzFfUkVHTlVNOwogICAgICBlbHNlCglyZXR1cm4gIVZFQ1RPUl9NT0RF X1AgKG1vZGUpIHx8IHZlY19mbGFncyAhPSAwOwogICAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCi8q IFJldHVybiB0cnVlIGlmIGEgZnVuY3Rpb24gd2l0aCB0eXBlIEZOVFlQRSByZXR1cm5zIGl0cyB2 YWx1ZSBpbgogICBTVkUgdmVjdG9yIG9yIHByZWRpY2F0ZSByZWdpc3RlcnMuICAqLwoKc3RhdGlj IGJvb2wKYWFyY2g2NF9yZXR1cm5zX3ZhbHVlX2luX3N2ZV9yZWdzX3AgKGNvbnN0X3RyZWUgZm50 eXBlKQp7CiAgdHJlZSByZXR1cm5fdHlwZSA9IFRSRUVfVFlQRSAoZm50eXBlKTsKCiAgcHVyZV9z Y2FsYWJsZV90eXBlX2luZm8gcHN0X2luZm87CiAgc3dpdGNoIChwc3RfaW5mby5hbmFseXplIChy ZXR1cm5fdHlwZSkpCiAgICB7CiAgICBjYXNlIHB1cmVfc2NhbGFibGVfdHlwZV9pbmZvOjpJU19Q U1Q6CiAgICAgIHJldHVybiAocHN0X2luZm8ubnVtX3pyICgpIDw9IE5VTV9GUF9BUkdfUkVHUwoJ ICAgICAgJiYgcHN0X2luZm8ubnVtX3ByICgpIDw9IE5VTV9QUl9BUkdfUkVHUyk7CgogICAgY2Fz ZSBwdXJlX3NjYWxhYmxlX3R5cGVfaW5mbzo6RE9FU05UX01BVFRFUjoKICAgICAgZ2NjX2Fzc2Vy dCAoYWFyY2g2NF9yZXR1cm5faW5fbWVtb3J5XzEgKHJldHVybl90eXBlKSk7CiAgICAgIHJldHVy biBmYWxzZTsKCiAgICBjYXNlIHB1cmVfc2NhbGFibGVfdHlwZV9pbmZvOjpOT19BQklfSURFTlRJ VFk6CiAgICBjYXNlIHB1cmVfc2NhbGFibGVfdHlwZV9pbmZvOjpJU05UX1BTVDoKICAgICAgcmV0 dXJuIGZhbHNlOwogICAgfQogIGdjY191bnJlYWNoYWJsZSAoKTsKfQoKLyogUmV0dXJuIHRydWUg aWYgYSBmdW5jdGlvbiB3aXRoIHR5cGUgRk5UWVBFIHRha2VzIGFyZ3VtZW50cyBpbgogICBTVkUg dmVjdG9yIG9yIHByZWRpY2F0ZSByZWdpc3RlcnMuICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF90 YWtlc19hcmd1bWVudHNfaW5fc3ZlX3JlZ3NfcCAoY29uc3RfdHJlZSBmbnR5cGUpCnsKICBDVU1V TEFUSVZFX0FSR1MgYXJnc19zb19mYXJfdjsKICBhYXJjaDY0X2luaXRfY3VtdWxhdGl2ZV9hcmdz ICgmYXJnc19zb19mYXJfdiwgTlVMTF9UUkVFLCBOVUxMX1JUWCwKCQkJCU5VTExfVFJFRSwgMCwg dHJ1ZSk7CiAgY3VtdWxhdGl2ZV9hcmdzX3QgYXJnc19zb19mYXIgPSBwYWNrX2N1bXVsYXRpdmVf YXJncyAoJmFyZ3Nfc29fZmFyX3YpOwoKICBmb3IgKHRyZWUgY2hhaW4gPSBUWVBFX0FSR19UWVBF UyAoZm50eXBlKTsKICAgICAgIGNoYWluICYmIGNoYWluICE9IHZvaWRfbGlzdF9ub2RlOwogICAg ICAgY2hhaW4gPSBUUkVFX0NIQUlOIChjaGFpbikpCiAgICB7CiAgICAgIHRyZWUgYXJnX3R5cGUg PSBUUkVFX1ZBTFVFIChjaGFpbik7CiAgICAgIGlmIChhcmdfdHlwZSA9PSBlcnJvcl9tYXJrX25v ZGUpCglyZXR1cm4gZmFsc2U7CgogICAgICBmdW5jdGlvbl9hcmdfaW5mbyBhcmcgKGFyZ190eXBl LCAvKm5hbWVkPSovdHJ1ZSk7CiAgICAgIGFwcGx5X3Bhc3NfYnlfcmVmZXJlbmNlX3J1bGVzICgm YXJnc19zb19mYXJfdiwgYXJnKTsKICAgICAgcHVyZV9zY2FsYWJsZV90eXBlX2luZm8gcHN0X2lu Zm87CiAgICAgIGlmIChwc3RfaW5mby5hbmFseXplX3JlZ2lzdGVycyAoYXJnLnR5cGUpKQoJewoJ ICB1bnNpZ25lZCBpbnQgZW5kX3pyID0gYXJnc19zb19mYXJfdi5hYXBjc19udnJuICsgcHN0X2lu Zm8ubnVtX3pyICgpOwoJICB1bnNpZ25lZCBpbnQgZW5kX3ByID0gYXJnc19zb19mYXJfdi5hYXBj c19ucHJuICsgcHN0X2luZm8ubnVtX3ByICgpOwoJICBnY2NfYXNzZXJ0IChlbmRfenIgPD0gTlVN X0ZQX0FSR19SRUdTICYmIGVuZF9wciA8PSBOVU1fUFJfQVJHX1JFR1MpOwoJICByZXR1cm4gdHJ1 ZTsKCX0KCiAgICAgIHRhcmdldG0uY2FsbHMuZnVuY3Rpb25fYXJnX2FkdmFuY2UgKGFyZ3Nfc29f ZmFyLCBhcmcpOwogICAgfQogIHJldHVybiBmYWxzZTsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9G TlRZUEVfQUJJLiAgKi8KCnN0YXRpYyBjb25zdCBwcmVkZWZpbmVkX2Z1bmN0aW9uX2FiaSAmCmFh cmNoNjRfZm50eXBlX2FiaSAoY29uc3RfdHJlZSBmbnR5cGUpCnsKICBpZiAobG9va3VwX2F0dHJp YnV0ZSAoImFhcmNoNjRfdmVjdG9yX3BjcyIsIFRZUEVfQVRUUklCVVRFUyAoZm50eXBlKSkpCiAg ICByZXR1cm4gYWFyY2g2NF9zaW1kX2FiaSAoKTsKCiAgaWYgKGFhcmNoNjRfcmV0dXJuc192YWx1 ZV9pbl9zdmVfcmVnc19wIChmbnR5cGUpCiAgICAgIHx8IGFhcmNoNjRfdGFrZXNfYXJndW1lbnRz X2luX3N2ZV9yZWdzX3AgKGZudHlwZSkpCiAgICByZXR1cm4gYWFyY2g2NF9zdmVfYWJpICgpOwoK ICByZXR1cm4gZGVmYXVsdF9mdW5jdGlvbl9hYmk7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfQ09N UEFUSUJMRV9WRUNUT1JfVFlQRVNfUC4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X2NvbXBhdGli bGVfdmVjdG9yX3R5cGVzX3AgKGNvbnN0X3RyZWUgdHlwZTEsIGNvbnN0X3RyZWUgdHlwZTIpCnsK ICByZXR1cm4gKGFhcmNoNjRfc3ZlOjpidWlsdGluX3R5cGVfcCAodHlwZTEpCgkgID09IGFhcmNo NjRfc3ZlOjpidWlsdGluX3R5cGVfcCAodHlwZTIpKTsKfQoKLyogUmV0dXJuIHRydWUgaWYgd2Ug c2hvdWxkIGVtaXQgQ0ZJIGZvciByZWdpc3RlciBSRUdOTy4gICovCgpzdGF0aWMgYm9vbAphYXJj aDY0X2VtaXRfY2ZpX2Zvcl9yZWdfcCAodW5zaWduZWQgaW50IHJlZ25vKQp7CiAgcmV0dXJuIChH UF9SRUdOVU1fUCAocmVnbm8pCgkgIHx8ICFkZWZhdWx0X2Z1bmN0aW9uX2FiaS5jbG9iYmVyc19m dWxsX3JlZ19wIChyZWdubykpOwp9CgovKiBSZXR1cm4gdGhlIG1vZGUgd2Ugc2hvdWxkIHVzZSB0 byBzYXZlIGFuZCByZXN0b3JlIHJlZ2lzdGVyIFJFR05PLiAgKi8KCnN0YXRpYyBtYWNoaW5lX21v ZGUKYWFyY2g2NF9yZWdfc2F2ZV9tb2RlICh1bnNpZ25lZCBpbnQgcmVnbm8pCnsKICBpZiAoR1Bf UkVHTlVNX1AgKHJlZ25vKSkKICAgIHJldHVybiBESW1vZGU7CgogIGlmIChGUF9SRUdOVU1fUCAo cmVnbm8pKQogICAgc3dpdGNoIChjcnRsLT5hYmktPmlkICgpKQogICAgICB7CiAgICAgIGNhc2Ug QVJNX1BDU19BQVBDUzY0OgoJLyogT25seSB0aGUgbG93IDY0IGJpdHMgYXJlIHNhdmVkIGJ5IHRo ZSBiYXNlIFBDUy4gICovCglyZXR1cm4gREZtb2RlOwoKICAgICAgY2FzZSBBUk1fUENTX1NJTUQ6 CgkvKiBUaGUgdmVjdG9yIFBDUyBzYXZlcyB0aGUgbG93IDEyOCBiaXRzICh3aGljaCBpcyB0aGUg ZnVsbAoJICAgcmVnaXN0ZXIgb24gbm9uLVNWRSB0YXJnZXRzKS4gICovCglyZXR1cm4gVEZtb2Rl OwoKICAgICAgY2FzZSBBUk1fUENTX1NWRToKCS8qIFVzZSB2ZWN0b3JzIG9mIERJbW9kZSBmb3Ig cmVnaXN0ZXJzIHRoYXQgbmVlZCBmcmFtZQoJICAgaW5mb3JtYXRpb24sIHNvIHRoYXQgdGhlIGZp cnN0IDY0IGJ5dGVzIG9mIHRoZSBzYXZlIHNsb3QKCSAgIGFyZSBhbHdheXMgdGhlIGVxdWl2YWxl bnQgb2Ygd2hhdCBzdG9yaW5nIEQ8bj4gd291bGQgZ2l2ZS4gICovCglpZiAoYWFyY2g2NF9lbWl0 X2NmaV9mb3JfcmVnX3AgKHJlZ25vKSkKCSAgcmV0dXJuIFZOeDJESW1vZGU7CgoJLyogVXNlIHZl Y3RvcnMgb2YgYnl0ZXMgb3RoZXJ3aXNlLCBzbyB0aGF0IHRoZSBsYXlvdXQgaXMKCSAgIGVuZGlh bi1hZ25vc3RpYywgYW5kIHNvIHRoYXQgd2UgY2FuIHVzZSBMRFIgYW5kIFNUUiBmb3IKCSAgIGJp Zy1lbmRpYW4gdGFyZ2V0cy4gICovCglyZXR1cm4gVk54MTZRSW1vZGU7CgogICAgICBjYXNlIEFS TV9QQ1NfVExTREVTQzoKICAgICAgY2FzZSBBUk1fUENTX1VOS05PV046CglicmVhazsKICAgICAg fQoKICBpZiAoUFJfUkVHTlVNX1AgKHJlZ25vKSkKICAgIC8qIFNhdmUgdGhlIGZ1bGwgcHJlZGlj YXRlIHJlZ2lzdGVyLiAgKi8KICAgIHJldHVybiBWTngxNkJJbW9kZTsKCiAgZ2NjX3VucmVhY2hh YmxlICgpOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX0lOU05fQ0FMTEVFX0FCSS4gICovCgpjb25z dCBwcmVkZWZpbmVkX2Z1bmN0aW9uX2FiaSAmCmFhcmNoNjRfaW5zbl9jYWxsZWVfYWJpIChjb25z dCBydHhfaW5zbiAqaW5zbikKewogIHJ0eCBwYXQgPSBQQVRURVJOIChpbnNuKTsKICBnY2NfYXNz ZXJ0IChHRVRfQ09ERSAocGF0KSA9PSBQQVJBTExFTCk7CiAgcnR4IHVuc3BlYyA9IFhWRUNFWFAg KHBhdCwgMCwgMSk7CiAgZ2NjX2Fzc2VydCAoR0VUX0NPREUgKHVuc3BlYykgPT0gVU5TUEVDCgkg ICAgICAmJiBYSU5UICh1bnNwZWMsIDEpID09IFVOU1BFQ19DQUxMRUVfQUJJKTsKICByZXR1cm4g ZnVuY3Rpb25fYWJpc1tJTlRWQUwgKFhWRUNFWFAgKHVuc3BlYywgMCwgMCkpXTsKfQoKLyogSW1w bGVtZW50IFRBUkdFVF9IQVJEX1JFR05PX0NBTExfUEFSVF9DTE9CQkVSRUQuICBUaGUgY2FsbGVl IG9ubHkgc2F2ZXMKICAgdGhlIGxvd2VyIDY0IGJpdHMgb2YgYSAxMjgtYml0IHJlZ2lzdGVyLiAg VGVsbCB0aGUgY29tcGlsZXIgdGhlIGNhbGxlZQogICBjbG9iYmVycyB0aGUgdG9wIDY0IGJpdHMg d2hlbiByZXN0b3JpbmcgdGhlIGJvdHRvbSA2NCBiaXRzLiAgKi8KCnN0YXRpYyBib29sCmFhcmNo NjRfaGFyZF9yZWdub19jYWxsX3BhcnRfY2xvYmJlcmVkICh1bnNpZ25lZCBpbnQgYWJpX2lkLAoJ CQkJCXVuc2lnbmVkIGludCByZWdubywKCQkJCQltYWNoaW5lX21vZGUgbW9kZSkKewogIGlmIChG UF9SRUdOVU1fUCAocmVnbm8pICYmIGFiaV9pZCAhPSBBUk1fUENTX1NWRSkKICAgIHsKICAgICAg cG9seV9pbnQ2NCBwZXJfcmVnaXN0ZXJfc2l6ZSA9IEdFVF9NT0RFX1NJWkUgKG1vZGUpOwogICAg ICB1bnNpZ25lZCBpbnQgbnJlZ3MgPSBoYXJkX3JlZ25vX25yZWdzIChyZWdubywgbW9kZSk7CiAg ICAgIGlmIChucmVncyA+IDEpCglwZXJfcmVnaXN0ZXJfc2l6ZSA9IGV4YWN0X2RpdiAocGVyX3Jl Z2lzdGVyX3NpemUsIG5yZWdzKTsKICAgICAgaWYgKGFiaV9pZCA9PSBBUk1fUENTX1NJTUQgfHwg YWJpX2lkID09IEFSTV9QQ1NfVExTREVTQykKCXJldHVybiBtYXliZV9ndCAocGVyX3JlZ2lzdGVy X3NpemUsIDE2KTsKICAgICAgcmV0dXJuIG1heWJlX2d0IChwZXJfcmVnaXN0ZXJfc2l6ZSwgOCk7 CiAgICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovKiBJbXBsZW1lbnQgUkVHTU9ERV9OQVRVUkFMX1NJ WkUuICAqLwpwb2x5X3VpbnQ2NAphYXJjaDY0X3JlZ21vZGVfbmF0dXJhbF9zaXplIChtYWNoaW5l X21vZGUgbW9kZSkKewogIC8qIFRoZSBuYXR1cmFsIHNpemUgZm9yIFNWRSBkYXRhIG1vZGVzIGlz IG9uZSBTVkUgZGF0YSB2ZWN0b3IsCiAgICAgYW5kIHNpbWlsYXJseSBmb3IgcHJlZGljYXRlcy4g IFdlIGNhbid0IGluZGVwZW5kZW50bHkgbW9kaWZ5CiAgICAgYW55dGhpbmcgc21hbGxlciB0aGFu IHRoYXQuICAqLwogIC8qID8/PyBGb3Igbm93LCBvbmx5IGRvIHRoaXMgZm9yIHZhcmlhYmxlLXdp ZHRoIFNWRSByZWdpc3RlcnMuCiAgICAgRG9pbmcgaXQgZm9yIGNvbnN0YW50LXNpemVkIHJlZ2lz dGVycyBicmVha3MgbG93ZXItc3VicmVnLmNjLiAgKi8KICAvKiA/Pz8gQW5kIG9uY2UgdGhhdCdz IGZpeGVkLCB3ZSBzaG91bGQgcHJvYmFibHkgaGF2ZSBzaW1pbGFyCiAgICAgY29kZSBmb3IgQWR2 YW5jZWQgU0lNRC4gICovCiAgaWYgKCFhYXJjaDY0X3N2ZV92Zy5pc19jb25zdGFudCAoKSkKICAg IHsKICAgICAgdW5zaWduZWQgaW50IHZlY19mbGFncyA9IGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9y X21vZGUgKG1vZGUpOwogICAgICBpZiAodmVjX2ZsYWdzICYgVkVDX1NWRV9QUkVEKQoJcmV0dXJu IEJZVEVTX1BFUl9TVkVfUFJFRDsKICAgICAgaWYgKHZlY19mbGFncyAmIFZFQ19TVkVfREFUQSkK CXJldHVybiBCWVRFU19QRVJfU1ZFX1ZFQ1RPUjsKICAgIH0KICByZXR1cm4gVU5JVFNfUEVSX1dP UkQ7Cn0KCi8qIEltcGxlbWVudCBIQVJEX1JFR05PX0NBTExFUl9TQVZFX01PREUuICAqLwptYWNo aW5lX21vZGUKYWFyY2g2NF9oYXJkX3JlZ25vX2NhbGxlcl9zYXZlX21vZGUgKHVuc2lnbmVkIHJl Z25vLCB1bnNpZ25lZCwKCQkJCSAgICAgbWFjaGluZV9tb2RlIG1vZGUpCnsKICAvKiBUaGUgcHJl ZGljYXRlIG1vZGUgZGV0ZXJtaW5lcyB3aGljaCBiaXRzIGFyZSBzaWduaWZpY2FudCBhbmQKICAg ICB3aGljaCBhcmUgImRvbid0IGNhcmUiLiAgRGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIGxhbmVz IHdvdWxkCiAgICAgbG9zZSBkYXRhIHdoaWxlIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBsYW5l cyB3b3VsZCBtYWtlIGJpdHMKICAgICB1bm5lY2Vzc2FyaWx5IHNpZ25pZmljYW50LiAgKi8KICBp ZiAoUFJfUkVHTlVNX1AgKHJlZ25vKSkKICAgIHJldHVybiBtb2RlOwogIGlmIChrbm93bl9nZSAo R0VUX01PREVfU0laRSAobW9kZSksIDQpKQogICAgcmV0dXJuIG1vZGU7CiAgZWxzZQogICAgcmV0 dXJuIFNJbW9kZTsKfQoKLyogUmV0dXJuIHRydWUgaWYgSSdzIGJpdHMgYXJlIGNvbnNlY3V0aXZl IG9uZXMgZnJvbSB0aGUgTVNCLiAgKi8KYm9vbAphYXJjaDY0X2hpZ2hfYml0c19hbGxfb25lc19w IChIT1NUX1dJREVfSU5UIGkpCnsKICByZXR1cm4gZXhhY3RfbG9nMiAoLWkpICE9IEhPU1RfV0lE RV9JTlRfTTE7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfQ09OU1RBTlRfQUxJR05NRU5ULiAgTWFr ZSBzdHJpbmdzIHdvcmQtYWxpZ25lZCBzbwogICB0aGF0IHN0cmNweSBmcm9tIGNvbnN0YW50cyB3 aWxsIGJlIGZhc3Rlci4gICovCgpzdGF0aWMgSE9TVF9XSURFX0lOVAphYXJjaDY0X2NvbnN0YW50 X2FsaWdubWVudCAoY29uc3RfdHJlZSBleHAsIEhPU1RfV0lERV9JTlQgYWxpZ24pCnsKICBpZiAo VFJFRV9DT0RFIChleHApID09IFNUUklOR19DU1QgJiYgIW9wdGltaXplX3NpemUpCiAgICByZXR1 cm4gTUFYIChhbGlnbiwgQklUU19QRVJfV09SRCk7CiAgcmV0dXJuIGFsaWduOwp9CgovKiBSZXR1 cm4gdHJ1ZSBpZiBjYWxscyB0byBERUNMIHNob3VsZCBiZSB0cmVhdGVkIGFzCiAgIGxvbmctY2Fs bHMgKGllIGNhbGxlZCB2aWEgYSByZWdpc3RlcikuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X2Rl Y2xfaXNfbG9uZ19jYWxsX3AgKGNvbnN0X3RyZWUgZGVjbCBBVFRSSUJVVEVfVU5VU0VEKQp7CiAg cmV0dXJuIGZhbHNlOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBjYWxscyB0byBzeW1ib2wtcmVmIFNZ TSBzaG91bGQgYmUgdHJlYXRlZCBhcwogICBsb25nLWNhbGxzIChpZSBjYWxsZWQgdmlhIGEgcmVn aXN0ZXIpLiAgKi8KYm9vbAphYXJjaDY0X2lzX2xvbmdfY2FsbF9wIChydHggc3ltKQp7CiAgcmV0 dXJuIGFhcmNoNjRfZGVjbF9pc19sb25nX2NhbGxfcCAoU1lNQk9MX1JFRl9ERUNMIChzeW0pKTsK fQoKLyogUmV0dXJuIHRydWUgaWYgY2FsbHMgdG8gc3ltYm9sLXJlZiBTWU0gc2hvdWxkIG5vdCBn byB0aHJvdWdoCiAgIHBsdCBzdHVicy4gICovCgpib29sCmFhcmNoNjRfaXNfbm9wbHRfY2FsbF9w IChydHggc3ltKQp7CiAgY29uc3RfdHJlZSBkZWNsID0gU1lNQk9MX1JFRl9ERUNMIChzeW0pOwoK ICBpZiAoZmxhZ19waWMKICAgICAgJiYgZGVjbAogICAgICAmJiAoIWZsYWdfcGx0CgkgIHx8IGxv b2t1cF9hdHRyaWJ1dGUgKCJub3BsdCIsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpKQogICAgICAm JiAhdGFyZ2V0bS5iaW5kc19sb2NhbF9wIChkZWNsKSkKICAgIHJldHVybiB0cnVlOwoKICByZXR1 cm4gZmFsc2U7Cn0KCi8qIEVtaXQgYW4gaW5zbiB0aGF0J3MgYSBzaW1wbGUgc2luZ2xlLXNldC4g IEJvdGggdGhlIG9wZXJhbmRzIG11c3QgYmUKICAga25vd24gdG8gYmUgdmFsaWQuICAqLwppbmxp bmUgc3RhdGljIHJ0eF9pbnNuICoKZW1pdF9zZXRfaW5zbiAocnR4IHgsIHJ0eCB5KQp7CiAgcmV0 dXJuIGVtaXRfaW5zbiAoZ2VuX3J0eF9TRVQgKHgsIHkpKTsKfQoKLyogWCBhbmQgWSBhcmUgdHdv IHRoaW5ncyB0byBjb21wYXJlIHVzaW5nIENPREUuICBFbWl0IHRoZSBjb21wYXJlIGluc24gYW5k CiAgIHJldHVybiB0aGUgcnR4IGZvciByZWdpc3RlciAwIGluIHRoZSBwcm9wZXIgbW9kZS4gICov CnJ0eAphYXJjaDY0X2dlbl9jb21wYXJlX3JlZyAoUlRYX0NPREUgY29kZSwgcnR4IHgsIHJ0eCB5 KQp7CiAgbWFjaGluZV9tb2RlIGNtcF9tb2RlID0gR0VUX01PREUgKHgpOwogIG1hY2hpbmVfbW9k ZSBjY19tb2RlOwogIHJ0eCBjY19yZWc7CgogIGlmIChjbXBfbW9kZSA9PSBUSW1vZGUpCiAgICB7 CiAgICAgIGdjY19hc3NlcnQgKGNvZGUgPT0gTkUpOwoKICAgICAgY2NfbW9kZSA9IENDbW9kZTsK ICAgICAgY2NfcmVnID0gZ2VuX3J0eF9SRUcgKGNjX21vZGUsIENDX1JFR05VTSk7CgogICAgICBy dHggeF9sbyA9IG9wZXJhbmRfc3Vid29yZCAoeCwgMCwgMCwgVEltb2RlKTsKICAgICAgcnR4IHlf bG8gPSBvcGVyYW5kX3N1YndvcmQgKHksIDAsIDAsIFRJbW9kZSk7CiAgICAgIGVtaXRfc2V0X2lu c24gKGNjX3JlZywgZ2VuX3J0eF9DT01QQVJFIChjY19tb2RlLCB4X2xvLCB5X2xvKSk7CgogICAg ICBydHggeF9oaSA9IG9wZXJhbmRfc3Vid29yZCAoeCwgMSwgMCwgVEltb2RlKTsKICAgICAgcnR4 IHlfaGkgPSBvcGVyYW5kX3N1YndvcmQgKHksIDEsIDAsIFRJbW9kZSk7CiAgICAgIGVtaXRfaW5z biAoZ2VuX2NjbXBjY2RpIChjY19yZWcsIGNjX3JlZywgeF9oaSwgeV9oaSwKCQkJICAgICAgIGdl bl9ydHhfRVEgKGNjX21vZGUsIGNjX3JlZywgY29uc3QwX3J0eCksCgkJCSAgICAgICBHRU5fSU5U IChBQVJDSDY0X0VRKSkpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgY2NfbW9kZSA9IFNFTEVD VF9DQ19NT0RFIChjb2RlLCB4LCB5KTsKICAgICAgY2NfcmVnID0gZ2VuX3J0eF9SRUcgKGNjX21v ZGUsIENDX1JFR05VTSk7CiAgICAgIGVtaXRfc2V0X2luc24gKGNjX3JlZywgZ2VuX3J0eF9DT01Q QVJFIChjY19tb2RlLCB4LCB5KSk7CiAgICB9CiAgcmV0dXJuIGNjX3JlZzsKfQoKLyogU2ltaWxh cmx5LCBidXQgbWF5YmUgemVyby1leHRlbmQgWSBpZiBZX01PREUgPCBTSW1vZGUuICAqLwoKc3Rh dGljIHJ0eAphYXJjaDY0X2dlbl9jb21wYXJlX3JlZ19tYXliZV96ZSAoUlRYX0NPREUgY29kZSwg cnR4IHgsIHJ0eCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZV9t b2RlIHlfbW9kZSkKewogIGlmICh5X21vZGUgPT0gRV9RSW1vZGUgfHwgeV9tb2RlID09IEVfSElt b2RlKQogICAgewogICAgICBpZiAoQ09OU1RfSU5UX1AgKHkpKQoJewoJICB5ID0gR0VOX0lOVCAo SU5UVkFMICh5KSAmIEdFVF9NT0RFX01BU0sgKHlfbW9kZSkpOwoJICB5X21vZGUgPSBTSW1vZGU7 Cgl9CiAgICAgIGVsc2UKCXsKCSAgcnR4IHQsIGNjX3JlZzsKCSAgbWFjaGluZV9tb2RlIGNjX21v ZGU7CgoJICB0ID0gZ2VuX3J0eF9aRVJPX0VYVEVORCAoU0ltb2RlLCB5KTsKCSAgdCA9IGdlbl9y dHhfQ09NUEFSRSAoQ0NfU1dQbW9kZSwgdCwgeCk7CgkgIGNjX21vZGUgPSBDQ19TV1Btb2RlOwoJ ICBjY19yZWcgPSBnZW5fcnR4X1JFRyAoY2NfbW9kZSwgQ0NfUkVHTlVNKTsKCSAgZW1pdF9zZXRf aW5zbiAoY2NfcmVnLCB0KTsKCSAgcmV0dXJuIGNjX3JlZzsKCX0KICAgIH0KCiAgaWYgKCFhYXJj aDY0X3BsdXNfb3BlcmFuZCAoeSwgeV9tb2RlKSkKICAgIHkgPSBmb3JjZV9yZWcgKHlfbW9kZSwg eSk7CgogIHJldHVybiBhYXJjaDY0X2dlbl9jb21wYXJlX3JlZyAoY29kZSwgeCwgeSk7Cn0KCi8q IENvbnNpZGVyIHRoZSBvcGVyYXRpb246CgogICAgIE9QRVJBTkRTWzBdID0gQ09ERSAoT1BFUkFO RFNbMV0sIE9QRVJBTkRTWzJdKSArIE9QRVJBTkRTWzNdCgogICB3aGVyZToKCiAgIC0gQ09ERSBp cyBbU1VdTUFYIG9yIFtTVV1NSU4KICAgLSBPUEVSQU5EU1syXSBhbmQgT1BFUkFORFNbM10gYXJl IGNvbnN0YW50IGludGVnZXJzCiAgIC0gT1BFUkFORFNbM10gaXMgYSBwb3NpdGl2ZSBvciBuZWdh dGl2ZSBzaGlmdGVkIDEyLWJpdCBpbW1lZGlhdGUKICAgLSBhbGwgb3BlcmFuZHMgaGF2ZSBtb2Rl IE1PREUKCiAgIERlY2lkZSB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB0aGUg b3BlcmF0aW9uIHVzaW5nOgoKICAgICBTVUJTIDx0bXA+LCBPUEVSQU5EU1sxXSwgLU9QRVJBTkRT WzNdCiAgICAgb3IKICAgICBBRERTIDx0bXA+LCBPUEVSQU5EU1sxXSwgT1BFUkFORFNbM10KCiAg IGZvbGxvd2VkIGJ5OgoKICAgICA8aW5zbj4gT1BFUkFORFNbMF0sIDx0bXA+LCBbd3hdenIsIDxj b25kPgoKICAgd2hlcmUgPGluc24+IGlzIG9uZSBvZiBDU0VMLCBDU0lOViBvciBDU0lOQy4gIFJl dHVybiB0cnVlIGlmIHNvLgogICBJZiBHRU5FUkFURV9QIGlzIHRydWUsIGFsc28gdXBkYXRlIE9Q RVJBTkRTIGFzIGZvbGxvd3M6CgogICAgIE9QRVJBTkRTWzRdID0gLU9QRVJBTkRTWzNdCiAgICAg T1BFUkFORFNbNV0gPSB0aGUgcnRsIGNvbmRpdGlvbiByZXByZXNlbnRpbmcgPGNvbmQ+CiAgICAg T1BFUkFORFNbNl0gPSA8dG1wPgogICAgIE9QRVJBTkRTWzddID0gMCBmb3IgQ1NFTCwgLTEgZm9y IENTSU5WIG9yIDEgZm9yIENTSU5DLiAgKi8KYm9vbAphYXJjaDY0X21heG1pbl9wbHVzX2NvbnN0 IChydHhfY29kZSBjb2RlLCBydHggKm9wZXJhbmRzLCBib29sIGdlbmVyYXRlX3ApCnsKICBzaWdu b3Agc2duID0gKGNvZGUgPT0gVU1BWCB8fCBjb2RlID09IFVNSU4gPyBVTlNJR05FRCA6IFNJR05F RCk7CiAgcnR4IGRzdCA9IG9wZXJhbmRzWzBdOwogIHJ0eCBtYXhtaW5fb3AgPSBvcGVyYW5kc1sy XTsKICBydHggYWRkX29wID0gb3BlcmFuZHNbM107CiAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRf TU9ERSAoZHN0KTsKCiAgLyogbWF4ICh4LCB5KSAtIHogPT0gKHggPj0geSArIDEgPyB4IDogeSkg LSB6CgkJICAgID09ICh4ID49IHkgPyB4IDogeSkgLSB6CgkJICAgID09ICh4ID4geSA/IHggOiB5 KSAtIHoKCQkgICAgPT0gKHggPiB5IC0gMSA/IHggOiB5KSAtIHoKCiAgICAgbWluICh4LCB5KSAt IHogPT0gKHggPD0geSAtIDEgPyB4IDogeSkgLSB6CgkJICAgID09ICh4IDw9IHkgPyB4IDogeSkg LSB6CgkJICAgID09ICh4IDwgeSA/IHggOiB5KSAtIHoKCQkgICAgPT0gKHggPCB5ICsgMSA/IHgg OiB5KSAtIHoKCiAgICAgQ2hlY2sgd2hldGhlciB6IGlzIGluIHsgeSAtIDEsIHksIHkgKyAxIH0g YW5kIHBpY2sgdGhlIGZvcm0ocykgZm9yCiAgICAgd2hpY2ggeCBpcyBjb21wYXJlZCB3aXRoIHou ICBTZXQgRElGRiB0byB5IC0gei4gIFRodXMgdGhlIHN1cHBvcnRlZAogICAgIGNvbWJpbmF0aW9u cyBhcmUgYXMgZm9sbG93cywgd2l0aCBESUZGIGJlaW5nIHRoZSB2YWx1ZSBhZnRlciB0aGUgIjoi OgoKICAgICBtYXggKHgsIHkpIC0geiA9PSB4ID49IHkgKyAxID8geCAtICh5ICsgMSkgOiAtMSAg IFt6ID09IHkgKyAxXQoJCSAgICA9PSB4ID49IHkgPyB4IC0geSA6IDAgICAgICAgICAgICAgIFt6 ID09IHldCgkJICAgID09IHggPiB5ID8geCAtIHkgOiAwICAgICAgICAgICAgICAgW3ogPT0geV0K CQkgICAgPT0geCA+IHkgLSAxID8geCAtICh5IC0gMSkgOiAxICAgICBbeiA9PSB5IC0gMV0KCiAg ICAgbWluICh4LCB5KSAtIHogPT0geCA8PSB5IC0gMSA/IHggLSAoeSAtIDEpIDogMSAgICBbeiA9 PSB5IC0gMV0KCQkgICAgPT0geCA8PSB5ID8geCAtIHkgOiAwICAgICAgICAgICAgICBbeiA9PSB5 XQoJCSAgICA9PSB4IDwgeSA/IHggLSB5IDogMCAgICAgICAgICAgICAgIFt6ID09IHldCgkJICAg ID09IHggPCB5ICsgMSA/IHggLSAoeSArIDEpIDogLTEgICAgW3ogPT0geSArIDFdLiAgKi8KICBh dXRvIG1heG1pbl92YWwgPSBydHhfbW9kZV90IChtYXhtaW5fb3AsIG1vZGUpOwogIGF1dG8gYWRk X3ZhbCA9IHJ0eF9tb2RlX3QgKGFkZF9vcCwgbW9kZSk7CiAgYXV0byBzdWJfdmFsID0gd2k6Om5l ZyAoYWRkX3ZhbCk7CiAgYXV0byBkaWZmID0gd2k6OnN1YiAobWF4bWluX3ZhbCwgc3ViX3ZhbCk7 CiAgaWYgKCEoZGlmZiA9PSAwCgl8fCAoZGlmZiA9PSAxICYmIHdpOjpndF9wIChtYXhtaW5fdmFs LCBzdWJfdmFsLCBzZ24pKQoJfHwgKGRpZmYgPT0gLTEgJiYgd2k6Omx0X3AgKG1heG1pbl92YWws IHN1Yl92YWwsIHNnbikpKSkKICAgIHJldHVybiBmYWxzZTsKCiAgaWYgKCFnZW5lcmF0ZV9wKQog ICAgcmV0dXJuIHRydWU7CgogIHJ0eF9jb2RlIGNtcDsKICBzd2l0Y2ggKGNvZGUpCiAgICB7CiAg ICBjYXNlIFNNQVg6CiAgICAgIGNtcCA9IGRpZmYgPT0gMSA/IEdUIDogR0U7CiAgICAgIGJyZWFr OwogICAgY2FzZSBVTUFYOgogICAgICBjbXAgPSBkaWZmID09IDEgPyBHVFUgOiBHRVU7CiAgICAg IGJyZWFrOwogICAgY2FzZSBTTUlOOgogICAgICBjbXAgPSBkaWZmID09IC0xID8gTFQgOiBMRTsK ICAgICAgYnJlYWs7CiAgICBjYXNlIFVNSU46CiAgICAgIGNtcCA9IGRpZmYgPT0gLTEgPyBMVFUg OiBMRVU7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZ2NjX3VucmVhY2hhYmxlICgp OwogICAgfQogIHJ0eCBjYyA9IGdlbl9ydHhfUkVHIChDQ21vZGUsIENDX1JFR05VTSk7CgogIG9w ZXJhbmRzWzRdID0gaW1tZWRfd2lkZV9pbnRfY29uc3QgKHN1Yl92YWwsIG1vZGUpOwogIG9wZXJh bmRzWzVdID0gZ2VuX3J0eF9mbXRfZWUgKGNtcCwgVk9JRG1vZGUsIGNjLCBjb25zdDBfcnR4KTsK ICBpZiAoY2FuX2NyZWF0ZV9wc2V1ZG9fcCAoKSkKICAgIG9wZXJhbmRzWzZdID0gZ2VuX3JlZ19y dHggKG1vZGUpOwogIGVsc2UKICAgIG9wZXJhbmRzWzZdID0gZHN0OwogIG9wZXJhbmRzWzddID0g aW1tZWRfd2lkZV9pbnRfY29uc3QgKGRpZmYsIG1vZGUpOwoKICByZXR1cm4gdHJ1ZTsKfQoKCi8q IEJ1aWxkIHRoZSBTWU1CT0xfUkVGIGZvciBfX3Rsc19nZXRfYWRkci4gICovCgpzdGF0aWMgR1RZ KCgpKSBydHggdGxzX2dldF9hZGRyX2xpYmZ1bmM7CgpydHgKYWFyY2g2NF90bHNfZ2V0X2FkZHIg KHZvaWQpCnsKICBpZiAoIXRsc19nZXRfYWRkcl9saWJmdW5jKQogICAgdGxzX2dldF9hZGRyX2xp YmZ1bmMgPSBpbml0X29uZV9saWJmdW5jICgiX190bHNfZ2V0X2FkZHIiKTsKICByZXR1cm4gdGxz X2dldF9hZGRyX2xpYmZ1bmM7Cn0KCi8qIFJldHVybiB0aGUgVExTIG1vZGVsIHRvIHVzZSBmb3Ig QUREUi4gICovCgpzdGF0aWMgZW51bSB0bHNfbW9kZWwKdGxzX3N5bWJvbGljX29wZXJhbmRfdHlw ZSAocnR4IGFkZHIpCnsKICBlbnVtIHRsc19tb2RlbCB0bHNfa2luZCA9IFRMU19NT0RFTF9OT05F OwogIHBvbHlfaW50NjQgb2Zmc2V0OwogIGFkZHIgPSBzdHJpcF9vZmZzZXRfYW5kX3NhbHQgKGFk ZHIsICZvZmZzZXQpOwogIGlmIChTWU1CT0xfUkVGX1AgKGFkZHIpKQogICAgdGxzX2tpbmQgPSBT WU1CT0xfUkVGX1RMU19NT0RFTCAoYWRkcik7CgogIHJldHVybiB0bHNfa2luZDsKfQoKLyogV2Un bGwgYWxsb3cgbG9fc3VtJ3MgaW4gYWRkcmVzc2VzIGluIG91ciBsZWdpdGltYXRlIGFkZHJlc3Nl cwogICBzbyB0aGF0IGNvbWJpbmUgd291bGQgdGFrZSBjYXJlIG9mIGNvbWJpbmluZyBhZGRyZXNz ZXMgd2hlcmUKICAgbmVjZXNzYXJ5LCBidXQgZm9yIGdlbmVyYXRpb24gcHVycG9zZXMsIHdlJ2xs IGdlbmVyYXRlIHRoZSBhZGRyZXNzCiAgIGFzIDoKICAgUlRMICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEFic29sdXRlCiAgIHRtcCA9IGhpIChzeW1ib2xfcmVmKTsgICAgICAgICAgICBh ZHJwICB4MSwgZm9vCiAgIGRlc3QgPSBsb19zdW0gKHRtcCwgc3ltYm9sX3JlZik7ICBhZGQgZGVz dCwgeDEsIDpsb18xMjpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5v cAoKICAgUElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMUwogICBhZHJwIHgxLCA6 Z290OmZvbyAgICAgICAgICAgICAgICAgYWRycCB0bXAsIDp0bHNnZDpmb28KICAgbGRyICB4MSwg Wzpnb3RfbG8xMjpmb29dICAgICAgICAgIGFkZCAgZGVzdCwgdG1wLCA6dGxzZ2RfbG8xMjpmb28K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsICAgX190bHNfZ2V0X2FkZHIK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcAoKICAgTG9hZCBUTFMgc3lt Ym9sLCBkZXBlbmRpbmcgb24gVExTIG1lY2hhbmlzbSBhbmQgVExTIGFjY2VzcyBtb2RlbC4KCiAg IEdsb2JhbCBEeW5hbWljIC0gVHJhZGl0aW9uYWwgVExTOgogICBhZHJwIHRtcCwgOnRsc2dkOmlt bQogICBhZGQgIGRlc3QsIHRtcCwgIzp0bHNnZF9sbzEyOmltbQogICBibCAgIF9fdGxzX2dldF9h ZGRyCgogICBHbG9iYWwgRHluYW1pYyAtIFRMUyBEZXNjcmlwdG9yczoKICAgYWRycCBkZXN0LCA6 dGxzZGVzYzppbW0KICAgbGRyICB0bXAsIFtkZXN0LCAjOnRsc2Rlc2NfbG8xMjppbW1dCiAgIGFk ZCAgZGVzdCwgZGVzdCwgIzp0bHNkZXNjX2xvMTI6aW1tCiAgIGJsciAgdG1wCiAgIG1ycyAgdHAs IHRwaWRyX2VsMAogICBhZGQgIGRlc3QsIGRlc3QsIHRwCgogICBJbml0aWFsIEV4ZWM6CiAgIG1y cyAgdHAsIHRwaWRyX2VsMAogICBhZHJwIHRtcCwgOmdvdHRwcmVsOmltbQogICBsZHIgIGRlc3Qs IFt0bXAsICM6Z290dHByZWxfbG8xMjppbW1dCiAgIGFkZCAgZGVzdCwgZGVzdCwgdHAKCiAgIExv Y2FsIEV4ZWM6CiAgIG1ycyAgdHAsIHRwaWRyX2VsMAogICBhZGQgIHQwLCB0cCwgIzp0cHJlbF9o aTEyOmltbSwgbHNsICMxMgogICBhZGQgIHQwLCB0MCwgIzp0cHJlbF9sbzEyX25jOmltbQoqLwoK c3RhdGljIHZvaWQKYWFyY2g2NF9sb2FkX3N5bXJlZl9hcHByb3ByaWF0ZWx5IChydHggZGVzdCwg cnR4IGltbSwKCQkJCSAgIGVudW0gYWFyY2g2NF9zeW1ib2xfdHlwZSB0eXBlKQp7CiAgc3dpdGNo ICh0eXBlKQogICAgewogICAgY2FzZSBTWU1CT0xfU01BTExfQUJTT0xVVEU6CiAgICAgIHsKCS8q IEluIElMUDMyLCB0aGUgbW9kZSBvZiBkZXN0IGNhbiBiZSBlaXRoZXIgU0ltb2RlIG9yIERJbW9k ZS4gICovCglydHggdG1wX3JlZyA9IGRlc3Q7CgltYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RF IChkZXN0KTsKCglnY2NfYXNzZXJ0IChtb2RlID09IFBtb2RlIHx8IG1vZGUgPT0gcHRyX21vZGUp OwoKCWlmIChjYW5fY3JlYXRlX3BzZXVkb19wICgpKQoJICB0bXBfcmVnID0gZ2VuX3JlZ19ydHgg KG1vZGUpOwoKCWVtaXRfbW92ZV9pbnNuICh0bXBfcmVnLCBnZW5fcnR4X0hJR0ggKG1vZGUsIGNv cHlfcnR4IChpbW0pKSk7CgllbWl0X2luc24gKGdlbl9hZGRfbG9zeW0gKGRlc3QsIHRtcF9yZWcs IGltbSkpOwoJcmV0dXJuOwogICAgICB9CgogICAgY2FzZSBTWU1CT0xfVElOWV9BQlNPTFVURToK ICAgICAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAoZGVzdCwgaW1tKSk7CiAgICAgIHJldHVybjsK CiAgICBjYXNlIFNZTUJPTF9TTUFMTF9HT1RfMjhLOgogICAgICB7CgltYWNoaW5lX21vZGUgbW9k ZSA9IEdFVF9NT0RFIChkZXN0KTsKCXJ0eCBncF9ydHggPSBwaWNfb2Zmc2V0X3RhYmxlX3J0eDsK CXJ0eCBpbnNuOwoJcnR4IG1lbTsKCgkvKiBOT1RFOiBwaWNfb2Zmc2V0X3RhYmxlX3J0eCBjYW4g YmUgTlVMTF9SVFgsIGJlY2F1c2Ugd2UgY2FuIHJlYWNoCgkgICBoZXJlIGJlZm9yZSBydGwgZXhw YW5kLiAgVHJlZSBJVk9QVCB3aWxsIGdlbmVyYXRlIHJ0bCBwYXR0ZXJuIHRvCgkgICBkZWNpZGUg cnR4IGNvc3RzLCBpbiB3aGljaCBjYXNlIHBpY19vZmZzZXRfdGFibGVfcnR4IGlzIG5vdAoJICAg aW5pdGlhbGl6ZWQuICBGb3IgdGhhdCBjYXNlIG5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGZpcnN0 IGFkcnAKCSAgIGluc3RydWN0aW9uIGFzIHRoZSBmaW5hbCBjb3N0IGZvciBnbG9iYWwgdmFyaWFi bGUgYWNjZXNzIGlzCgkgICBvbmUgaW5zdHJ1Y3Rpb24uICAqLwoJaWYgKGdwX3J0eCAhPSBOVUxM KQoJICB7CgkgICAgLyogLWZwaWMgZm9yIC1tY21vZGVsPXNtYWxsIGFsbG93IDMySyBHT1QgdGFi bGUgc2l6ZSAoYnV0IHdlIGFyZQoJICAgICAgIHVzaW5nIHRoZSBwYWdlIGJhc2UgYXMgR09UIGJh c2UsIHRoZSBmaXJzdCBwYWdlIG1heSBiZSB3YXN0ZWQsCgkgICAgICAgaW4gdGhlIHdvcnN0IHNj ZW5hcmlvLCB0aGVyZSBpcyBvbmx5IDI4SyBzcGFjZSBmb3IgR09UKS4KCgkgICAgICAgVGhlIGdl bmVyYXRlIGluc3RydWN0aW9uIHNlcXVlbmNlIGZvciBhY2Nlc3NpbmcgZ2xvYmFsIHZhcmlhYmxl CgkgICAgICAgaXM6CgoJCSBsZHIgcmVnLCBbcGljX29mZnNldF90YWJsZV9ydHgsICM6Z290cGFn ZV9sbzE1OnN5bV0KCgkgICAgICAgT25seSBvbmUgaW5zdHJ1Y3Rpb24gbmVlZGVkLiBCdXQgd2Ug bXVzdCBpbml0aWFsaXplCgkgICAgICAgcGljX29mZnNldF90YWJsZV9ydHggcHJvcGVybHkuICBX ZSBnZW5lcmF0ZSBpbml0aWFsaXplIGluc24gZm9yCgkgICAgICAgZXZlcnkgZ2xvYmFsIGFjY2Vz cywgYW5kIGFsbG93IENTRSB0byByZW1vdmUgYWxsIHJlZHVuZGFudC4KCgkgICAgICAgVGhlIGZp bmFsIGluc3RydWN0aW9uIHNlcXVlbmNlcyB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nCgkg ICAgICAgZm9yIG11bHRpcGx5IGdsb2JhbCB2YXJpYWJsZXMgYWNjZXNzLgoKCQkgYWRycCBwaWNf b2Zmc2V0X3RhYmxlX3J0eCwgX0dMT0JBTF9PRkZTRVRfVEFCTEVfCgoJCSBsZHIgcmVnLCBbcGlj X29mZnNldF90YWJsZV9ydHgsICM6Z290cGFnZV9sbzE1OnN5bTFdCgkJIGxkciByZWcsIFtwaWNf b2Zmc2V0X3RhYmxlX3J0eCwgIzpnb3RwYWdlX2xvMTU6c3ltMl0KCQkgbGRyIHJlZywgW3BpY19v ZmZzZXRfdGFibGVfcnR4LCAjOmdvdHBhZ2VfbG8xNTpzeW0zXQoJCSAuLi4gICovCgoJICAgIHJ0 eCBzID0gZ2VuX3J0eF9TWU1CT0xfUkVGIChQbW9kZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIp OwoJICAgIGNydGwtPnVzZXNfcGljX29mZnNldF90YWJsZSA9IDE7CgkgICAgZW1pdF9tb3ZlX2lu c24gKGdwX3J0eCwgZ2VuX3J0eF9ISUdIIChQbW9kZSwgcykpOwoKCSAgICBpZiAobW9kZSAhPSBH RVRfTU9ERSAoZ3BfcnR4KSkKICAgICAgICAgICAgIGdwX3J0eCA9IGdlbl9sb3dwYXJ0IChtb2Rl LCBncF9ydHgpOwoKCSAgfQoKCWlmIChtb2RlID09IHB0cl9tb2RlKQoJICB7CgkgICAgaWYgKG1v ZGUgPT0gREltb2RlKQoJICAgICAgaW5zbiA9IGdlbl9sZHJfZ290X3NtYWxsXzI4a19kaSAoZGVz dCwgZ3BfcnR4LCBpbW0pOwoJICAgIGVsc2UKCSAgICAgIGluc24gPSBnZW5fbGRyX2dvdF9zbWFs bF8yOGtfc2kgKGRlc3QsIGdwX3J0eCwgaW1tKTsKCgkgICAgbWVtID0gWFZFQ0VYUCAoU0VUX1NS QyAoaW5zbiksIDAsIDApOwoJICB9CgllbHNlCgkgIHsKCSAgICBnY2NfYXNzZXJ0IChtb2RlID09 IFBtb2RlKTsKCgkgICAgaW5zbiA9IGdlbl9sZHJfZ290X3NtYWxsXzI4a19zaWRpIChkZXN0LCBn cF9ydHgsIGltbSk7CgkgICAgbWVtID0gWFZFQ0VYUCAoWEVYUCAoU0VUX1NSQyAoaW5zbiksIDAp LCAwLCAwKTsKCSAgfQoKCS8qIFRoZSBvcGVyYW5kIGlzIGV4cGVjdGVkIHRvIGJlIE1FTS4gIFdo ZW5ldmVyIHRoZSByZWxhdGVkIGluc24KCSAgIHBhdHRlcm4gY2hhbmdlZCwgYWJvdmUgY29kZSB3 aGljaCBjYWxjdWxhdGUgbWVtIHNob3VsZCBiZQoJICAgdXBkYXRlZC4gICovCglnY2NfYXNzZXJ0 IChNRU1fUCAobWVtKSk7CglNRU1fUkVBRE9OTFlfUCAobWVtKSA9IDE7CglNRU1fTk9UUkFQX1Ag KG1lbSkgPSAxOwoJZW1pdF9pbnNuIChpbnNuKTsKCXJldHVybjsKICAgICAgfQoKICAgIGNhc2Ug U1lNQk9MX1NNQUxMX0dPVF80RzoKICAgICAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAoZGVzdCwg aW1tKSk7CiAgICAgIHJldHVybjsKCiAgICBjYXNlIFNZTUJPTF9TTUFMTF9UTFNHRDoKICAgICAg ewoJcnR4X2luc24gKmluc25zOwoJLyogVGhlIHJldHVybiB0eXBlIG9mIF9fdGxzX2dldF9hZGRy IGlzIHRoZSBDIHBvaW50ZXIgdHlwZQoJICAgc28gdXNlIHB0cl9tb2RlLiAgKi8KCXJ0eCByZXN1 bHQgPSBnZW5fcnR4X1JFRyAocHRyX21vZGUsIFIwX1JFR05VTSk7CglydHggdG1wX3JlZyA9IGRl c3Q7CgoJaWYgKEdFVF9NT0RFIChkZXN0KSAhPSBwdHJfbW9kZSkKCSAgdG1wX3JlZyA9IGNhbl9j cmVhdGVfcHNldWRvX3AgKCkgPyBnZW5fcmVnX3J0eCAocHRyX21vZGUpIDogcmVzdWx0OwoKCXN0 YXJ0X3NlcXVlbmNlICgpOwoJaWYgKHB0cl9tb2RlID09IFNJbW9kZSkKCSAgYWFyY2g2NF9lbWl0 X2NhbGxfaW5zbiAoZ2VuX3Rsc2dkX3NtYWxsX3NpIChyZXN1bHQsIGltbSkpOwoJZWxzZQoJICBh YXJjaDY0X2VtaXRfY2FsbF9pbnNuIChnZW5fdGxzZ2Rfc21hbGxfZGkgKHJlc3VsdCwgaW1tKSk7 CglpbnNucyA9IGdldF9pbnNucyAoKTsKCWVuZF9zZXF1ZW5jZSAoKTsKCglSVExfQ09OU1RfQ0FM TF9QIChpbnNucykgPSAxOwoJZW1pdF9saWJjYWxsX2Jsb2NrIChpbnNucywgdG1wX3JlZywgcmVz dWx0LCBpbW0pOwoJLyogQ29udmVydCBiYWNrIHRvIHRoZSBtb2RlIG9mIHRoZSBkZXN0IGFkZGlu ZyBhIHplcm9fZXh0ZW5kCgkgICBmcm9tIFNJbW9kZSAocHRyX21vZGUpIHRvIERJbW9kZSAoUG1v ZGUpLiAqLwoJaWYgKGRlc3QgIT0gdG1wX3JlZykKCSAgY29udmVydF9tb3ZlIChkZXN0LCB0bXBf cmVnLCB0cnVlKTsKCXJldHVybjsKICAgICAgfQoKICAgIGNhc2UgU1lNQk9MX1NNQUxMX1RMU0RF U0M6CiAgICAgIHsKCW1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKGRlc3QpOwoJcnR4IHgw ID0gZ2VuX3J0eF9SRUcgKG1vZGUsIFIwX1JFR05VTSk7CglydHggdHA7CgoJZ2NjX2Fzc2VydCAo bW9kZSA9PSBQbW9kZSB8fCBtb2RlID09IHB0cl9tb2RlKTsKCgkvKiBJbiBJTFAzMiwgdGhlIGdv dCBlbnRyeSBpcyBhbHdheXMgb2YgU0ltb2RlIHNpemUuICBVbmxpa2UKCSAgIHNtYWxsIEdPVCwg dGhlIGRlc3QgaXMgZml4ZWQgYXQgcmVnIDAuICAqLwoJaWYgKFRBUkdFVF9JTFAzMikKCSAgZW1p dF9pbnNuIChnZW5fdGxzZGVzY19zbWFsbF9zaSAoaW1tKSk7CgllbHNlCgkgIGVtaXRfaW5zbiAo Z2VuX3Rsc2Rlc2Nfc21hbGxfZGkgKGltbSkpOwoJdHAgPSBhYXJjaDY0X2xvYWRfdHAgKE5VTEwp OwoKCWlmIChtb2RlICE9IFBtb2RlKQoJICB0cCA9IGdlbl9sb3dwYXJ0IChtb2RlLCB0cCk7CgoJ ZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAoZGVzdCwgZ2VuX3J0eF9QTFVTIChtb2RlLCB0cCwgeDAp KSk7CglpZiAoUkVHX1AgKGRlc3QpKQoJICBzZXRfdW5pcXVlX3JlZ19ub3RlIChnZXRfbGFzdF9p bnNuICgpLCBSRUdfRVFVSVYsIGltbSk7CglyZXR1cm47CiAgICAgIH0KCiAgICBjYXNlIFNZTUJP TF9TTUFMTF9UTFNJRToKICAgICAgewoJLyogSW4gSUxQMzIsIHRoZSBtb2RlIG9mIGRlc3QgY2Fu IGJlIGVpdGhlciBTSW1vZGUgb3IgREltb2RlLAoJICAgd2hpbGUgdGhlIGdvdCBlbnRyeSBpcyBh bHdheXMgb2YgU0ltb2RlIHNpemUuICBUaGUgbW9kZSBvZgoJICAgZGVzdCBkZXBlbmRzIG9uIGhv dyBkZXN0IGlzIHVzZWQ6IGlmIGRlc3QgaXMgYXNzaWduZWQgdG8gYQoJICAgcG9pbnRlciAoZS5n LiBpbiB0aGUgbWVtb3J5KSwgaXQgaGFzIFNJbW9kZTsgaXQgbWF5IGhhdmUKCSAgIERJbW9kZSBp ZiBkZXN0IGlzIGRlcmVmZXJlbmNlZCB0byBhY2Nlc3MgdGhlIG1lbWVvcnkuCgkgICBUaGlzIGlz IHdoeSB3ZSBoYXZlIHRvIGhhbmRsZSB0aHJlZSBkaWZmZXJlbnQgdGxzaWVfc21hbGwKCSAgIHBh dHRlcm5zIGhlcmUgKHR3byBwYXR0ZXJucyBmb3IgSUxQMzIpLiAgKi8KCW1hY2hpbmVfbW9kZSBt b2RlID0gR0VUX01PREUgKGRlc3QpOwoJcnR4IHRtcF9yZWcgPSBnZW5fcmVnX3J0eCAobW9kZSk7 CglydHggdHAgPSBhYXJjaDY0X2xvYWRfdHAgKE5VTEwpOwoKCWlmIChtb2RlID09IHB0cl9tb2Rl KQoJICB7CgkgICAgaWYgKG1vZGUgPT0gREltb2RlKQoJICAgICAgZW1pdF9pbnNuIChnZW5fdGxz aWVfc21hbGxfZGkgKHRtcF9yZWcsIGltbSkpOwoJICAgIGVsc2UKCSAgICAgIHsKCQllbWl0X2lu c24gKGdlbl90bHNpZV9zbWFsbF9zaSAodG1wX3JlZywgaW1tKSk7CgkJdHAgPSBnZW5fbG93cGFy dCAobW9kZSwgdHApOwoJICAgICAgfQoJICB9CgllbHNlCgkgIHsKCSAgICBnY2NfYXNzZXJ0ICht b2RlID09IFBtb2RlKTsKCSAgICBlbWl0X2luc24gKGdlbl90bHNpZV9zbWFsbF9zaWRpICh0bXBf cmVnLCBpbW0pKTsKCSAgfQoKCWVtaXRfaW5zbiAoZ2VuX3J0eF9TRVQgKGRlc3QsIGdlbl9ydHhf UExVUyAobW9kZSwgdHAsIHRtcF9yZWcpKSk7CglpZiAoUkVHX1AgKGRlc3QpKQoJICBzZXRfdW5p cXVlX3JlZ19ub3RlIChnZXRfbGFzdF9pbnNuICgpLCBSRUdfRVFVSVYsIGltbSk7CglyZXR1cm47 CiAgICAgIH0KCiAgICBjYXNlIFNZTUJPTF9UTFNMRTEyOgogICAgY2FzZSBTWU1CT0xfVExTTEUy NDoKICAgIGNhc2UgU1lNQk9MX1RMU0xFMzI6CiAgICBjYXNlIFNZTUJPTF9UTFNMRTQ4OgogICAg ICB7CgltYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFIChkZXN0KTsKCXJ0eCB0cCA9IGFhcmNo NjRfbG9hZF90cCAoTlVMTCk7CgoJaWYgKG1vZGUgIT0gUG1vZGUpCgkgIHRwID0gZ2VuX2xvd3Bh cnQgKG1vZGUsIHRwKTsKCglzd2l0Y2ggKHR5cGUpCgkgIHsKCSAgY2FzZSBTWU1CT0xfVExTTEUx MjoKCSAgICBlbWl0X2luc24gKChtb2RlID09IERJbW9kZSA/IGdlbl90bHNsZTEyX2RpIDogZ2Vu X3Rsc2xlMTJfc2kpCgkJCShkZXN0LCB0cCwgaW1tKSk7CgkgICAgYnJlYWs7CgkgIGNhc2UgU1lN Qk9MX1RMU0xFMjQ6CgkgICAgZW1pdF9pbnNuICgobW9kZSA9PSBESW1vZGUgPyBnZW5fdGxzbGUy NF9kaSA6IGdlbl90bHNsZTI0X3NpKQoJCQkoZGVzdCwgdHAsIGltbSkpOwoJICBicmVhazsKCSAg Y2FzZSBTWU1CT0xfVExTTEUzMjoKCSAgICBlbWl0X2luc24gKChtb2RlID09IERJbW9kZSA/IGdl bl90bHNsZTMyX2RpIDogZ2VuX3Rsc2xlMzJfc2kpCgkJCShkZXN0LCBpbW0pKTsKCSAgICBlbWl0 X2luc24gKChtb2RlID09IERJbW9kZSA/IGdlbl9hZGRkaTMgOiBnZW5fYWRkc2kzKQoJCQkoZGVz dCwgZGVzdCwgdHApKTsKCSAgYnJlYWs7CgkgIGNhc2UgU1lNQk9MX1RMU0xFNDg6CgkgICAgZW1p dF9pbnNuICgobW9kZSA9PSBESW1vZGUgPyBnZW5fdGxzbGU0OF9kaSA6IGdlbl90bHNsZTQ4X3Np KQoJCQkoZGVzdCwgaW1tKSk7CgkgICAgZW1pdF9pbnNuICgobW9kZSA9PSBESW1vZGUgPyBnZW5f YWRkZGkzIDogZ2VuX2FkZHNpMykKCQkJKGRlc3QsIGRlc3QsIHRwKSk7CgkgICAgYnJlYWs7Cgkg IGRlZmF1bHQ6CgkgICAgZ2NjX3VucmVhY2hhYmxlICgpOwoJICB9CgoJaWYgKFJFR19QIChkZXN0 KSkKCSAgc2V0X3VuaXF1ZV9yZWdfbm90ZSAoZ2V0X2xhc3RfaW5zbiAoKSwgUkVHX0VRVUlWLCBp bW0pOwoJcmV0dXJuOwogICAgICB9CgogICAgY2FzZSBTWU1CT0xfVElOWV9HT1Q6CiAgICAgIHsK CXJ0eCBpbnNuOwoJbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRfTU9ERSAoZGVzdCk7CgoJaWYgKG1v ZGUgPT0gcHRyX21vZGUpCgkgIGluc24gPSBnZW5fbGRyX2dvdF90aW55IChtb2RlLCBkZXN0LCBp bW0pOwoJZWxzZQoJICB7CgkgICAgZ2NjX2Fzc2VydCAobW9kZSA9PSBQbW9kZSk7CgkgICAgaW5z biA9IGdlbl9sZHJfZ290X3Rpbnlfc2lkaSAoZGVzdCwgaW1tKTsKCSAgfQoKCWVtaXRfaW5zbiAo aW5zbik7CglyZXR1cm47CiAgICAgIH0KCiAgICBjYXNlIFNZTUJPTF9USU5ZX1RMU0lFOgogICAg ICB7CgltYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFIChkZXN0KTsKCXJ0eCB0cCA9IGFhcmNo NjRfbG9hZF90cCAoTlVMTCk7CgoJaWYgKG1vZGUgPT0gcHRyX21vZGUpCgkgIHsKCSAgICBpZiAo bW9kZSA9PSBESW1vZGUpCgkgICAgICBlbWl0X2luc24gKGdlbl90bHNpZV90aW55X2RpIChkZXN0 LCBpbW0sIHRwKSk7CgkgICAgZWxzZQoJICAgICAgewoJCXRwID0gZ2VuX2xvd3BhcnQgKG1vZGUs IHRwKTsKCQllbWl0X2luc24gKGdlbl90bHNpZV90aW55X3NpIChkZXN0LCBpbW0sIHRwKSk7Cgkg ICAgICB9CgkgIH0KCWVsc2UKCSAgewoJICAgIGdjY19hc3NlcnQgKG1vZGUgPT0gUG1vZGUpOwoJ ICAgIGVtaXRfaW5zbiAoZ2VuX3Rsc2llX3Rpbnlfc2lkaSAoZGVzdCwgaW1tLCB0cCkpOwoJICB9 CgoJaWYgKFJFR19QIChkZXN0KSkKCSAgc2V0X3VuaXF1ZV9yZWdfbm90ZSAoZ2V0X2xhc3RfaW5z biAoKSwgUkVHX0VRVUlWLCBpbW0pOwoJcmV0dXJuOwogICAgICB9CgogICAgZGVmYXVsdDoKICAg ICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgfQp9CgovKiBFbWl0IGEgbW92ZSBmcm9tIFNSQyB0 byBERVNULiAgQXNzdW1lIHRoYXQgdGhlIG1vdmUgZXhwYW5kZXJzIGNhbgogICBoYW5kbGUgYWxs IG1vdmVzIGlmICFjYW5fY3JlYXRlX3BzZXVkb19wICgpLiAgVGhlIGRpc3RpbmN0aW9uIGlzCiAg IGltcG9ydGFudCBiZWNhdXNlLCB1bmxpa2UgZW1pdF9tb3ZlX2luc24sIHRoZSBtb3ZlIGV4cGFu ZGVycyBrbm93CiAgIGhvdyB0byBmb3JjZSBQbW9kZSBvYmplY3RzIGludG8gdGhlIGNvbnN0YW50 IHBvb2wgZXZlbiB3aGVuIHRoZQogICBjb25zdGFudCBwb29sIGFkZHJlc3MgaXMgbm90IGl0c2Vs ZiBsZWdpdGltYXRlLiAgKi8Kc3RhdGljIHJ0eAphYXJjaDY0X2VtaXRfbW92ZSAocnR4IGRlc3Qs IHJ0eCBzcmMpCnsKICByZXR1cm4gKGNhbl9jcmVhdGVfcHNldWRvX3AgKCkKCSAgPyBlbWl0X21v dmVfaW5zbiAoZGVzdCwgc3JjKQoJICA6IGVtaXRfbW92ZV9pbnNuXzEgKGRlc3QsIHNyYykpOwp9 CgovKiBBcHBseSBVTk9QVEFCIHRvIE9QIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIERFU1QuICAq LwoKc3RhdGljIHZvaWQKYWFyY2g2NF9lbWl0X3Vub3AgKHJ0eCBkZXN0LCBvcHRhYiB1bm9wdGFi LCBydHggb3ApCnsKICBydHggdG1wID0gZXhwYW5kX3Vub3AgKEdFVF9NT0RFIChkZXN0KSwgdW5v cHRhYiwgb3AsIGRlc3QsIDApOwogIGlmIChkZXN0ICE9IHRtcCkKICAgIGVtaXRfbW92ZV9pbnNu IChkZXN0LCB0bXApOwp9CgovKiBBcHBseSBCSU5PUFRBQiB0byBPUDAgYW5kIE9QMSBhbmQgc3Rv cmUgdGhlIHJlc3VsdCBpbiBERVNULiAgKi8KCnN0YXRpYyB2b2lkCmFhcmNoNjRfZW1pdF9iaW5v cCAocnR4IGRlc3QsIG9wdGFiIGJpbm9wdGFiLCBydHggb3AwLCBydHggb3AxKQp7CiAgcnR4IHRt cCA9IGV4cGFuZF9iaW5vcCAoR0VUX01PREUgKGRlc3QpLCBiaW5vcHRhYiwgb3AwLCBvcDEsIGRl c3QsIDAsCgkJCSAgT1BUQUJfRElSRUNUKTsKICBpZiAoZGVzdCAhPSB0bXApCiAgICBlbWl0X21v dmVfaW5zbiAoZGVzdCwgdG1wKTsKfQoKLyogU3BsaXQgYSAxMjgtYml0IG1vdmUgb3BlcmF0aW9u IGludG8gdHdvIDY0LWJpdCBtb3ZlIG9wZXJhdGlvbnMsCiAgIHRha2luZyBjYXJlIHRvIGhhbmRs ZSBwYXJ0aWFsIG92ZXJsYXAgb2YgcmVnaXN0ZXIgdG8gcmVnaXN0ZXIKICAgY29waWVzLiAgU3Bl Y2lhbCBjYXNlcyBhcmUgbmVlZGVkIHdoZW4gbW92aW5nIGJldHdlZW4gR1AgcmVncyBhbmQKICAg RlAgcmVncy4gIFNSQyBjYW4gYmUgYSByZWdpc3RlciwgY29uc3RhbnQgb3IgbWVtb3J5OyBEU1Qg YSByZWdpc3RlcgogICBvciBtZW1vcnkuICBJZiBlaXRoZXIgb3BlcmFuZCBpcyBtZW1vcnkgaXQg bXVzdCBub3QgaGF2ZSBhbnkgc2lkZQogICBlZmZlY3RzLiAgKi8Kdm9pZAphYXJjaDY0X3NwbGl0 XzEyOGJpdF9tb3ZlIChydHggZHN0LCBydHggc3JjKQp7CiAgcnR4IGRzdF9sbywgZHN0X2hpOwog IHJ0eCBzcmNfbG8sIHNyY19oaTsKCiAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRfTU9ERSAoZHN0 KTsKCiAgZ2NjX2Fzc2VydCAobW9kZSA9PSBUSW1vZGUgfHwgbW9kZSA9PSBURm1vZGUgfHwgbW9k ZSA9PSBURG1vZGUpOwogIGdjY19hc3NlcnQgKCEoc2lkZV9lZmZlY3RzX3AgKHNyYykgfHwgc2lk ZV9lZmZlY3RzX3AgKGRzdCkpKTsKICBnY2NfYXNzZXJ0IChtb2RlID09IEdFVF9NT0RFIChzcmMp IHx8IEdFVF9NT0RFIChzcmMpID09IFZPSURtb2RlKTsKCiAgaWYgKFJFR19QIChkc3QpICYmIFJF R19QIChzcmMpKQogICAgewogICAgICBpbnQgc3JjX3JlZ25vID0gUkVHTk8gKHNyYyk7CiAgICAg IGludCBkc3RfcmVnbm8gPSBSRUdOTyAoZHN0KTsKCiAgICAgIC8qIEhhbmRsZSBGUCA8LT4gR1Ag cmVncy4gICovCiAgICAgIGlmIChGUF9SRUdOVU1fUCAoZHN0X3JlZ25vKSAmJiBHUF9SRUdOVU1f UCAoc3JjX3JlZ25vKSkKCXsKCSAgc3JjX2xvID0gZ2VuX2xvd3BhcnQgKHdvcmRfbW9kZSwgc3Jj KTsKCSAgc3JjX2hpID0gZ2VuX2hpZ2hwYXJ0ICh3b3JkX21vZGUsIHNyYyk7CgoJICBlbWl0X2lu c24gKGdlbl9hYXJjaDY0X21vdmxvd19kaSAobW9kZSwgZHN0LCBzcmNfbG8pKTsKCSAgZW1pdF9p bnNuIChnZW5fYWFyY2g2NF9tb3ZoaWdoX2RpIChtb2RlLCBkc3QsIHNyY19oaSkpOwoJICByZXR1 cm47Cgl9CiAgICAgIGVsc2UgaWYgKEdQX1JFR05VTV9QIChkc3RfcmVnbm8pICYmIEZQX1JFR05V TV9QIChzcmNfcmVnbm8pKQoJewoJICBkc3RfbG8gPSBnZW5fbG93cGFydCAod29yZF9tb2RlLCBk c3QpOwoJICBkc3RfaGkgPSBnZW5faGlnaHBhcnQgKHdvcmRfbW9kZSwgZHN0KTsKCgkgIGVtaXRf aW5zbiAoZ2VuX2FhcmNoNjRfbW92ZGlfbG93IChtb2RlLCBkc3RfbG8sIHNyYykpOwoJICBlbWl0 X2luc24gKGdlbl9hYXJjaDY0X21vdmRpX2hpZ2ggKG1vZGUsIGRzdF9oaSwgc3JjKSk7CgkgIHJl dHVybjsKCX0KICAgIH0KCiAgZHN0X2xvID0gZ2VuX2xvd3BhcnQgKHdvcmRfbW9kZSwgZHN0KTsK ICBkc3RfaGkgPSBnZW5faGlnaHBhcnQgKHdvcmRfbW9kZSwgZHN0KTsKICBzcmNfbG8gPSBnZW5f bG93cGFydCAod29yZF9tb2RlLCBzcmMpOwogIHNyY19oaSA9IGdlbl9oaWdocGFydF9tb2RlICh3 b3JkX21vZGUsIG1vZGUsIHNyYyk7CgogIC8qIEF0IG1vc3Qgb25lIHBhaXJpbmcgbWF5IG92ZXJs YXAuICAqLwogIGlmIChyZWdfb3ZlcmxhcF9tZW50aW9uZWRfcCAoZHN0X2xvLCBzcmNfaGkpKQog ICAgewogICAgICBhYXJjaDY0X2VtaXRfbW92ZSAoZHN0X2hpLCBzcmNfaGkpOwogICAgICBhYXJj aDY0X2VtaXRfbW92ZSAoZHN0X2xvLCBzcmNfbG8pOwogICAgfQogIGVsc2UKICAgIHsKICAgICAg YWFyY2g2NF9lbWl0X21vdmUgKGRzdF9sbywgc3JjX2xvKTsKICAgICAgYWFyY2g2NF9lbWl0X21v dmUgKGRzdF9oaSwgc3JjX2hpKTsKICAgIH0KfQoKLyogUmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxk IHNwbGl0IGEgbW92ZSBmcm9tIDEyOC1iaXQgdmFsdWUgU1JDCiAgIHRvIDEyOC1iaXQgcmVnaXN0 ZXIgREVTVC4gICovCgpib29sCmFhcmNoNjRfc3BsaXRfMTI4Yml0X21vdmVfcCAocnR4IGRzdCwg cnR4IHNyYykKewogIGlmIChGUF9SRUdOVU1fUCAoUkVHTk8gKGRzdCkpKQogICAgcmV0dXJuIFJF R19QIChzcmMpICYmICFGUF9SRUdOVU1fUCAoUkVHTk8gKHNyYykpOwogIC8qIEFsbCBtb3ZlcyB0 byBHUFJzIG5lZWQgdG8gYmUgc3BsaXQuICAqLwogIHJldHVybiB0cnVlOwp9CgovKiBTcGxpdCBh IGNvbXBsZXggU0lNRCBtb3ZlLiAgKi8KCnZvaWQKYWFyY2g2NF9zcGxpdF9zaW1kX21vdmUgKHJ0 eCBkc3QsIHJ0eCBzcmMpCnsKICBtYWNoaW5lX21vZGUgc3JjX21vZGUgPSBHRVRfTU9ERSAoc3Jj KTsKICBtYWNoaW5lX21vZGUgZHN0X21vZGUgPSBHRVRfTU9ERSAoZHN0KTsKCiAgZ2NjX2Fzc2Vy dCAoVkVDVE9SX01PREVfUCAoZHN0X21vZGUpKTsKCiAgaWYgKFJFR19QIChkc3QpICYmIFJFR19Q IChzcmMpKQogICAgewogICAgICBnY2NfYXNzZXJ0IChWRUNUT1JfTU9ERV9QIChzcmNfbW9kZSkp OwogICAgICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X3NwbGl0X3NpbWRfbW92IChzcmNfbW9kZSwg ZHN0LCBzcmMpKTsKICAgIH0KfQoKYm9vbAphYXJjaDY0X3plcm9fZXh0ZW5kX2NvbnN0X2VxICht YWNoaW5lX21vZGUgeG1vZGUsIHJ0eCB4LAoJCQkgICAgICBtYWNoaW5lX21vZGUgeW1vZGUsIHJ0 eCB5KQp7CiAgcnR4IHIgPSBzaW1wbGlmeV9jb25zdF91bmFyeV9vcGVyYXRpb24gKFpFUk9fRVhU RU5ELCB4bW9kZSwgeSwgeW1vZGUpOwogIGdjY19hc3NlcnQgKHIgIT0gTlVMTCk7CiAgcmV0dXJu IHJ0eF9lcXVhbF9wICh4LCByKTsKfQoKLyogUmV0dXJuIFRBUkdFVCBpZiBpdCBpcyBub25udWxs IGFuZCBhIHJlZ2lzdGVyIG9mIG1vZGUgTU9ERS4KICAgT3RoZXJ3aXNlLCByZXR1cm4gYSBmcmVz aCByZWdpc3RlciBvZiBtb2RlIE1PREUgaWYgd2UgY2FuLAogICBvciBUQVJHRVQgcmVpbnRlcnBy ZXRlZCBhcyBNT0RFIGlmIHdlIGNhbid0LiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF90YXJnZXRf cmVnIChydHggdGFyZ2V0LCBtYWNoaW5lX21vZGUgbW9kZSkKewogIGlmICh0YXJnZXQgJiYgUkVH X1AgKHRhcmdldCkgJiYgR0VUX01PREUgKHRhcmdldCkgPT0gbW9kZSkKICAgIHJldHVybiB0YXJn ZXQ7CiAgaWYgKCFjYW5fY3JlYXRlX3BzZXVkb19wICgpKQogICAgewogICAgICBnY2NfYXNzZXJ0 ICh0YXJnZXQpOwogICAgICByZXR1cm4gZ2VuX2xvd3BhcnQgKG1vZGUsIHRhcmdldCk7CiAgICB9 CiAgcmV0dXJuIGdlbl9yZWdfcnR4IChtb2RlKTsKfQoKLyogUmV0dXJuIGEgcmVnaXN0ZXIgdGhh dCBjb250YWlucyB0aGUgY29uc3RhbnQgaW4gQlVJTERFUiwgZ2l2ZW4gdGhhdAogICB0aGUgY29u c3RhbnQgaXMgYSBsZWdpdGltYXRlIG1vdmUgb3BlcmFuZC4gIFVzZSBUQVJHRVQgYXMgdGhlIHJl Z2lzdGVyCiAgIGlmIGl0IGlzIG5vbm51bGwgYW5kIGNvbnZlbmllbnQuICAqLwoKc3RhdGljIHJ0 eAphYXJjaDY0X2VtaXRfc2V0X2ltbWVkaWF0ZSAocnR4IHRhcmdldCwgcnR4X3ZlY3Rvcl9idWls ZGVyICZidWlsZGVyKQp7CiAgcnR4IHNyYyA9IGJ1aWxkZXIuYnVpbGQgKCk7CiAgdGFyZ2V0ID0g YWFyY2g2NF90YXJnZXRfcmVnICh0YXJnZXQsIEdFVF9NT0RFIChzcmMpKTsKICBlbWl0X2luc24g KGdlbl9ydHhfU0VUICh0YXJnZXQsIHNyYykpOwogIHJldHVybiB0YXJnZXQ7Cn0KCnN0YXRpYyBy dHgKYWFyY2g2NF9mb3JjZV90ZW1wb3JhcnkgKG1hY2hpbmVfbW9kZSBtb2RlLCBydHggeCwgcnR4 IHZhbHVlKQp7CiAgaWYgKGNhbl9jcmVhdGVfcHNldWRvX3AgKCkpCiAgICByZXR1cm4gZm9yY2Vf cmVnIChtb2RlLCB2YWx1ZSk7CiAgZWxzZQogICAgewogICAgICBnY2NfYXNzZXJ0ICh4KTsKICAg ICAgYWFyY2g2NF9lbWl0X21vdmUgKHgsIHZhbHVlKTsKICAgICAgcmV0dXJuIHg7CiAgICB9Cn0K Ci8qIFJldHVybiB0cnVlIGlmIHByZWRpY2F0ZSB2YWx1ZSBYIGlzIGEgY29uc3RhbnQgaW4gd2hp Y2ggZXZlcnkgZWxlbWVudAogICBpcyBhIENPTlNUX0lOVC4gIFdoZW4gcmV0dXJuaW5nIHRydWUs IGRlc2NyaWJlIFggaW4gQlVJTERFUiBhcyBhIFZOeDE2QkkKICAgdmFsdWUsIGkuZS4gYXMgYSBw cmVkaWNhdGUgaW4gd2hpY2ggYWxsIGJpdHMgYXJlIHNpZ25pZmljYW50LiAgKi8KCnN0YXRpYyBi b29sCmFhcmNoNjRfZ2V0X3N2ZV9wcmVkX2JpdHMgKHJ0eF92ZWN0b3JfYnVpbGRlciAmYnVpbGRl ciwgcnR4IHgpCnsKICBpZiAoIUNPTlNUX1ZFQ1RPUl9QICh4KSkKICAgIHJldHVybiBmYWxzZTsK CiAgdW5zaWduZWQgaW50IGZhY3RvciA9IHZlY3Rvcl9lbGVtZW50X3NpemUgKEdFVF9NT0RFX05V TklUUyAoVk54MTZCSW1vZGUpLAoJCQkJCSAgICAgR0VUX01PREVfTlVOSVRTIChHRVRfTU9ERSAo eCkpKTsKICB1bnNpZ25lZCBpbnQgbnBhdHRlcm5zID0gQ09OU1RfVkVDVE9SX05QQVRURVJOUyAo eCkgKiBmYWN0b3I7CiAgdW5zaWduZWQgaW50IG5lbHRzX3Blcl9wYXR0ZXJuID0gQ09OU1RfVkVD VE9SX05FTFRTX1BFUl9QQVRURVJOICh4KTsKICBidWlsZGVyLm5ld192ZWN0b3IgKFZOeDE2Qklt b2RlLCBucGF0dGVybnMsIG5lbHRzX3Blcl9wYXR0ZXJuKTsKCiAgdW5zaWduZWQgaW50IG5lbHRz ID0gY29uc3RfdmVjdG9yX2VuY29kZWRfbmVsdHMgKHgpOwogIGZvciAodW5zaWduZWQgaW50IGkg PSAwOyBpIDwgbmVsdHM7ICsraSkKICAgIHsKICAgICAgcnR4IGVsdCA9IENPTlNUX1ZFQ1RPUl9F TkNPREVEX0VMVCAoeCwgaSk7CiAgICAgIGlmICghQ09OU1RfSU5UX1AgKGVsdCkpCglyZXR1cm4g ZmFsc2U7CgogICAgICBidWlsZGVyLnF1aWNrX3B1c2ggKGVsdCk7CiAgICAgIGZvciAodW5zaWdu ZWQgaW50IGogPSAxOyBqIDwgZmFjdG9yOyArK2opCglidWlsZGVyLnF1aWNrX3B1c2ggKGNvbnN0 MF9ydHgpOwogICAgfQogIGJ1aWxkZXIuZmluYWxpemUgKCk7CiAgcmV0dXJuIHRydWU7Cn0KCi8q IEJVSUxERVIgY29udGFpbnMgYSBwcmVkaWNhdGUgY29uc3RhbnQgb2YgbW9kZSBWTngxNkJJLiAg UmV0dXJuIHRoZQogICB3aWRlc3QgcHJlZGljYXRlIGVsZW1lbnQgc2l6ZSBpdCBjYW4gaGF2ZSAo dGhhdCBpcywgdGhlIGxhcmdlc3Qgc2l6ZQogICBmb3Igd2hpY2ggZWFjaCBlbGVtZW50IHdvdWxk IHN0aWxsIGJlIDAgb3IgMSkuICAqLwoKdW5zaWduZWQgaW50CmFhcmNoNjRfd2lkZXN0X3N2ZV9w cmVkX2VsdF9zaXplIChydHhfdmVjdG9yX2J1aWxkZXIgJmJ1aWxkZXIpCnsKICAvKiBTdGFydCB3 aXRoIHRoZSBtb3N0IG9wdGltaXN0aWMgYXNzdW1wdGlvbjogdGhhdCB3ZSBvbmx5IG5lZWQKICAg ICBvbmUgYml0IHBlciBwYXR0ZXJuLiAgVGhpcyBpcyB3aGF0IHdlIHdpbGwgdXNlIGlmIG9ubHkg dGhlIGZpcnN0CiAgICAgYml0IGluIGVhY2ggcGF0dGVybiBpcyBldmVyIHNldC4gICovCiAgdW5z aWduZWQgaW50IG1hc2sgPSBHRVRfTU9ERV9TSVpFIChESW1vZGUpOwogIG1hc2sgfD0gYnVpbGRl ci5ucGF0dGVybnMgKCk7CgogIC8qIExvb2sgZm9yIHNldCBiaXRzLiAgKi8KICB1bnNpZ25lZCBp bnQgbmVsdHMgPSBidWlsZGVyLmVuY29kZWRfbmVsdHMgKCk7CiAgZm9yICh1bnNpZ25lZCBpbnQg aSA9IDE7IGkgPCBuZWx0czsgKytpKQogICAgaWYgKElOVFZBTCAoYnVpbGRlci5lbHQgKGkpKSAh PSAwKQogICAgICB7CglpZiAoaSAmIDEpCgkgIHJldHVybiAxOwoJbWFzayB8PSBpOwogICAgICB9 CiAgcmV0dXJuIG1hc2sgJiAtbWFzazsKfQoKLyogSWYgVk54MTZCSW1vZGUgcnR4IFggaXMgYSBj YW5vbmljYWwgUFRSVUUgZm9yIGEgcHJlZGljYXRlIG1vZGUsCiAgIHJldHVybiB0aGF0IHByZWRp Y2F0ZSBtb2RlLCBvdGhlcndpc2UgcmV0dXJuIG9wdF9tYWNoaW5lX21vZGUgKCkuICAqLwoKb3B0 X21hY2hpbmVfbW9kZQphYXJjaDY0X3B0cnVlX2FsbF9tb2RlIChydHggeCkKewogIGdjY19hc3Nl cnQgKEdFVF9NT0RFICh4KSA9PSBWTngxNkJJbW9kZSk7CiAgaWYgKCFDT05TVF9WRUNUT1JfUCAo eCkKICAgICAgfHwgIUNPTlNUX1ZFQ1RPUl9EVVBMSUNBVEVfUCAoeCkKICAgICAgfHwgIUNPTlNU X0lOVF9QIChDT05TVF9WRUNUT1JfRU5DT0RFRF9FTFQgKHgsIDApKQogICAgICB8fCBJTlRWQUwg KENPTlNUX1ZFQ1RPUl9FTkNPREVEX0VMVCAoeCwgMCkpID09IDApCiAgICByZXR1cm4gb3B0X21h Y2hpbmVfbW9kZSAoKTsKCiAgdW5zaWduZWQgaW50IG5lbHRzID0gY29uc3RfdmVjdG9yX2VuY29k ZWRfbmVsdHMgKHgpOwogIGZvciAodW5zaWduZWQgaW50IGkgPSAxOyBpIDwgbmVsdHM7ICsraSkK ICAgIGlmIChDT05TVF9WRUNUT1JfRU5DT0RFRF9FTFQgKHgsIGkpICE9IGNvbnN0MF9ydHgpCiAg ICAgIHJldHVybiBvcHRfbWFjaGluZV9tb2RlICgpOwoKICByZXR1cm4gYWFyY2g2NF9zdmVfcHJl ZF9tb2RlIChuZWx0cyk7Cn0KCi8qIEJVSUxERVIgaXMgYSBwcmVkaWNhdGUgY29uc3RhbnQgb2Yg bW9kZSBWTngxNkJJLiAgQ29uc2lkZXIgdGhlIHZhbHVlCiAgIHRoYXQgdGhlIGNvbnN0YW50IHdv dWxkIGhhdmUgd2l0aCBwcmVkaWNhdGUgZWxlbWVudCBzaXplIEVMVF9TSVpFCiAgIChpZ25vcmlu ZyB0aGUgdXBwZXIgYml0cyBpbiBlYWNoIGVsZW1lbnQpIGFuZCByZXR1cm46CgogICAqIC0xIGlm IGFsbCBiaXRzIGFyZSBzZXQKICAgKiBOIGlmIHRoZSBwcmVkaWNhdGUgaGFzIE4gbGVhZGluZyBz ZXQgYml0cyBmb2xsb3dlZCBieSBhbGwgY2xlYXIgYml0cwogICAqIDAgaWYgdGhlIHByZWRpY2F0 ZSBkb2VzIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBmb3Jtcy4gICovCgppbnQKYWFyY2g2NF9wYXJ0 aWFsX3B0cnVlX2xlbmd0aCAocnR4X3ZlY3Rvcl9idWlsZGVyICZidWlsZGVyLAoJCQkgICAgICB1 bnNpZ25lZCBpbnQgZWx0X3NpemUpCnsKICAvKiBJZiBuZWx0c19wZXJfcGF0dGVybiBpcyAzLCB3 ZSBoYXZlIHNldCBiaXRzIGZvbGxvd2VkIGJ5IGNsZWFyIGJpdHMKICAgICBmb2xsb3dlZCBieSBz ZXQgYml0cy4gICovCiAgaWYgKGJ1aWxkZXIubmVsdHNfcGVyX3BhdHRlcm4gKCkgPT0gMykKICAg IHJldHVybiAwOwoKICAvKiBTa2lwIG92ZXIgbGVhZGluZyBzZXQgYml0cy4gICovCiAgdW5zaWdu ZWQgaW50IG5lbHRzID0gYnVpbGRlci5lbmNvZGVkX25lbHRzICgpOwogIHVuc2lnbmVkIGludCBp ID0gMDsKICBmb3IgKDsgaSA8IG5lbHRzOyBpICs9IGVsdF9zaXplKQogICAgaWYgKElOVFZBTCAo YnVpbGRlci5lbHQgKGkpKSA9PSAwKQogICAgICBicmVhazsKICB1bnNpZ25lZCBpbnQgdmwgPSBp IC8gZWx0X3NpemU7CgogIC8qIENoZWNrIGZvciB0aGUgYWxsLXRydWUgY2FzZS4gICovCiAgaWYg KGkgPT0gbmVsdHMpCiAgICByZXR1cm4gLTE7CgogIC8qIElmIG5lbHRzX3Blcl9wYXR0ZXJuIGlz IDEsIHRoZW4gZWl0aGVyIFZMIGlzIHplcm8sIG9yIHdlIGhhdmUgYQogICAgIHJlcGVhdGluZyBw YXR0ZXJuIG9mIHNldCBiaXRzIGZvbGxvd2VkIGJ5IGNsZWFyIGJpdHMuICAqLwogIGlmIChidWls ZGVyLm5lbHRzX3Blcl9wYXR0ZXJuICgpICE9IDIpCiAgICByZXR1cm4gMDsKCiAgLyogV2UgaGF2 ZSBhICJmb3JlZ3JvdW5kIiB2YWx1ZSBhbmQgYSBkdXBsaWNhdGVkICJiYWNrZ3JvdW5kIiB2YWx1 ZS4KICAgICBJZiB0aGUgYmFja2dyb3VuZCBtaWdodCByZXBlYXQgYW5kIHRoZSBsYXN0IHNldCBi aXQgYmVsb25ncyB0byBpdCwKICAgICB3ZSBtaWdodCBoYXZlIHNldCBiaXRzIGZvbGxvd2VkIGJ5 IGNsZWFyIGJpdHMgZm9sbG93ZWQgYnkgc2V0IGJpdHMuICAqLwogIGlmIChpID4gYnVpbGRlci5u cGF0dGVybnMgKCkgJiYgbWF5YmVfbmUgKG5lbHRzLCBidWlsZGVyLmZ1bGxfbmVsdHMgKCkpKQog ICAgcmV0dXJuIDA7CgogIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN0IGFyZSBhbGwgY2xlYXIu ICAqLwogIGZvciAoOyBpIDwgbmVsdHM7IGkgKz0gZWx0X3NpemUpCiAgICBpZiAoSU5UVkFMIChi dWlsZGVyLmVsdCAoaSkpICE9IDApCiAgICAgIHJldHVybiAwOwoKICByZXR1cm4gdmw7Cn0KCi8q IFNlZSBpZiB0aGVyZSBpcyBhbiBzdnBhdHRlcm4gdGhhdCBlbmNvZGVzIGFuIFNWRSBwcmVkaWNh dGUgb2YgbW9kZQogICBQUkVEX01PREUgaW4gd2hpY2ggdGhlIGZpcnN0IFZMIGJpdHMgYXJlIHNl dCBhbmQgdGhlIHJlc3QgYXJlIGNsZWFyLgogICBSZXR1cm4gdGhlIHBhdHRlcm4gaWYgc28sIG90 aGVyd2lzZSByZXR1cm4gQUFSQ0g2NF9OVU1fU1ZQQVRURVJOUy4KICAgQSBWTCBvZiAtMSBpbmRp Y2F0ZXMgYW4gYWxsLXRydWUgdmVjdG9yLiAgKi8KCmFhcmNoNjRfc3ZwYXR0ZXJuCmFhcmNoNjRf c3ZwYXR0ZXJuX2Zvcl92bCAobWFjaGluZV9tb2RlIHByZWRfbW9kZSwgaW50IHZsKQp7CiAgaWYg KHZsIDwgMCkKICAgIHJldHVybiBBQVJDSDY0X1NWX0FMTDsKCiAgaWYgKG1heWJlX2d0ICh2bCwg R0VUX01PREVfTlVOSVRTIChwcmVkX21vZGUpKSkKICAgIHJldHVybiBBQVJDSDY0X05VTV9TVlBB VFRFUk5TOwoKICBpZiAodmwgPj0gMSAmJiB2bCA8PSA4KQogICAgcmV0dXJuIGFhcmNoNjRfc3Zw YXR0ZXJuIChBQVJDSDY0X1NWX1ZMMSArICh2bCAtIDEpKTsKCiAgaWYgKHZsID49IDE2ICYmIHZs IDw9IDI1NiAmJiBwb3cycF9od2kgKHZsKSkKICAgIHJldHVybiBhYXJjaDY0X3N2cGF0dGVybiAo QUFSQ0g2NF9TVl9WTDE2ICsgKGV4YWN0X2xvZzIgKHZsKSAtIDQpKTsKCiAgaW50IG1heF92bDsK ICBpZiAoR0VUX01PREVfTlVOSVRTIChwcmVkX21vZGUpLmlzX2NvbnN0YW50ICgmbWF4X3ZsKSkK ICAgIHsKICAgICAgaWYgKHZsID09IChtYXhfdmwgLyAzKSAqIDMpCglyZXR1cm4gQUFSQ0g2NF9T Vl9NVUwzOwogICAgICAvKiBUaGVzZSB3b3VsZCBvbmx5IHRyaWdnZXIgZm9yIG5vbi1wb3dlci1v Zi0yIGxlbmd0aHMuICAqLwogICAgICBpZiAodmwgPT0gKG1heF92bCAmIC00KSkKCXJldHVybiBB QVJDSDY0X1NWX01VTDQ7CiAgICAgIGlmICh2bCA9PSAoMSA8PCBmbG9vcl9sb2cyIChtYXhfdmwp KSkKCXJldHVybiBBQVJDSDY0X1NWX1BPVzI7CiAgICAgIGlmICh2bCA9PSBtYXhfdmwpCglyZXR1 cm4gQUFSQ0g2NF9TVl9BTEw7CiAgICB9CiAgcmV0dXJuIEFBUkNINjRfTlVNX1NWUEFUVEVSTlM7 Cn0KCi8qIFJldHVybiBhIFZOeDE2Qkltb2RlIGNvbnN0YW50IGluIHdoaWNoIGV2ZXJ5IHNlcXVl bmNlIG9mIEVMVF9TSVpFCiAgIGJpdHMgaGFzIHRoZSBsb3dlc3QgYml0IHNldCBhbmQgdGhlIHVw cGVyIGJpdHMgY2xlYXIuICBUaGlzIGlzIHRoZQogICBWTngxNkJJbW9kZSBlcXVpdmFsZW50IG9m IGEgUFRSVUUgZm9yIGNvbnRyb2xsaW5nIGVsZW1lbnRzIG9mCiAgIEVMVF9TSVpFIGJ5dGVzLiAg SG93ZXZlciwgYmVjYXVzZSB0aGUgY29uc3RhbnQgaXMgVk54MTZCSW1vZGUsCiAgIGFsbCBiaXRz IGFyZSBzaWduaWZpY2FudCwgZXZlbiB0aGUgdXBwZXIgemVyb3MuICAqLwoKcnR4CmFhcmNoNjRf cHRydWVfYWxsICh1bnNpZ25lZCBpbnQgZWx0X3NpemUpCnsKICBydHhfdmVjdG9yX2J1aWxkZXIg YnVpbGRlciAoVk54MTZCSW1vZGUsIGVsdF9zaXplLCAxKTsKICBidWlsZGVyLnF1aWNrX3B1c2gg KGNvbnN0MV9ydHgpOwogIGZvciAodW5zaWduZWQgaW50IGkgPSAxOyBpIDwgZWx0X3NpemU7ICsr aSkKICAgIGJ1aWxkZXIucXVpY2tfcHVzaCAoY29uc3QwX3J0eCk7CiAgcmV0dXJuIGJ1aWxkZXIu YnVpbGQgKCk7Cn0KCi8qIFJldHVybiBhbiBhbGwtdHJ1ZSBwcmVkaWNhdGUgcmVnaXN0ZXIgb2Yg bW9kZSBNT0RFLiAgKi8KCnJ0eAphYXJjaDY0X3B0cnVlX3JlZyAobWFjaGluZV9tb2RlIG1vZGUp CnsKICBnY2NfYXNzZXJ0IChHRVRfTU9ERV9DTEFTUyAobW9kZSkgPT0gTU9ERV9WRUNUT1JfQk9P TCk7CiAgcnR4IHJlZyA9IGZvcmNlX3JlZyAoVk54MTZCSW1vZGUsIENPTlNUTTFfUlRYIChWTngx NkJJbW9kZSkpOwogIHJldHVybiBnZW5fbG93cGFydCAobW9kZSwgcmVnKTsKfQoKLyogUmV0dXJu IGFuIGFsbC1mYWxzZSBwcmVkaWNhdGUgcmVnaXN0ZXIgb2YgbW9kZSBNT0RFLiAgKi8KCnJ0eAph YXJjaDY0X3BmYWxzZV9yZWcgKG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgZ2NjX2Fzc2VydCAoR0VU X01PREVfQ0xBU1MgKG1vZGUpID09IE1PREVfVkVDVE9SX0JPT0wpOwogIHJ0eCByZWcgPSBmb3Jj ZV9yZWcgKFZOeDE2Qkltb2RlLCBDT05TVDBfUlRYIChWTngxNkJJbW9kZSkpOwogIHJldHVybiBn ZW5fbG93cGFydCAobW9kZSwgcmVnKTsKfQoKLyogUFJFRDFbMF0gaXMgYSBQVEVTVCBwcmVkaWNh dGUgYW5kIFBSRUQxWzFdIGlzIGFuIGFhcmNoNjRfc3ZlX3B0cnVlX2ZsYWcKICAgZm9yIGl0LiAg UFJFRDJbMF0gaXMgdGhlIHByZWRpY2F0ZSBmb3IgdGhlIGluc3RydWN0aW9uIHdob3NlIHJlc3Vs dAogICBpcyB0ZXN0ZWQgYnkgdGhlIFBURVNUIGFuZCBQUkVEMlsxXSBpcyBhZ2FpbiBhbiBhYXJj aDY0X3N2ZV9wdHJ1ZV9mbGFnCiAgIGZvciBpdC4gIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwcm92 ZSB0aGF0IHRoZSB0d28gcHJlZGljYXRlcyBhcmUKICAgZXF1aXZhbGVudCBmb3IgUFRFU1QgcHVy cG9zZXM7IHRoYXQgaXMsIGlmIHdlIGNhbiByZXBsYWNlIFBSRUQyWzBdCiAgIHdpdGggUFJFRDFb MF0gd2l0aG91dCBjaGFuZ2luZyBiZWhhdmlvci4gICovCgpib29sCmFhcmNoNjRfc3ZlX3NhbWVf cHJlZF9mb3JfcHRlc3RfcCAocnR4ICpwcmVkMSwgcnR4ICpwcmVkMikKewogIG1hY2hpbmVfbW9k ZSBtb2RlID0gR0VUX01PREUgKHByZWQxWzBdKTsKICBnY2NfYXNzZXJ0IChHRVRfTU9ERV9DTEFT UyAobW9kZSkgPT0gTU9ERV9WRUNUT1JfQk9PTAoJICAgICAgJiYgbW9kZSA9PSBHRVRfTU9ERSAo cHJlZDJbMF0pCgkgICAgICAmJiBhYXJjaDY0X3N2ZV9wdHJ1ZV9mbGFnIChwcmVkMVsxXSwgU0lt b2RlKQoJICAgICAgJiYgYWFyY2g2NF9zdmVfcHRydWVfZmxhZyAocHJlZDJbMV0sIFNJbW9kZSkp OwoKICBib29sIHB0cnVlMV9wID0gKHByZWQxWzBdID09IENPTlNUTTFfUlRYIChtb2RlKQoJCSAg IHx8IElOVFZBTCAocHJlZDFbMV0pID09IFNWRV9LTk9XTl9QVFJVRSk7CiAgYm9vbCBwdHJ1ZTJf cCA9IChwcmVkMlswXSA9PSBDT05TVE0xX1JUWCAobW9kZSkKCQkgICB8fCBJTlRWQUwgKHByZWQy WzFdKSA9PSBTVkVfS05PV05fUFRSVUUpOwogIHJldHVybiAocHRydWUxX3AgJiYgcHRydWUyX3Ap IHx8IHJ0eF9lcXVhbF9wIChwcmVkMVswXSwgcHJlZDJbMF0pOwp9CgovKiBFbWl0IGEgY29tcGFy aXNvbiBDTVAgYmV0d2VlbiBPUDAgYW5kIE9QMSwgYm90aCBvZiB3aGljaCBoYXZlIG1vZGUKICAg REFUQV9NT0RFLCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgaW4gYSBwcmVkaWNhdGUgb2YgbW9kZSBQ UkVEX01PREUuCiAgIFVzZSBUQVJHRVQgYXMgdGhlIHRhcmdldCByZWdpc3RlciBpZiBub25udWxs IGFuZCBjb252ZW5pZW50LiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF9zdmVfZW1pdF9pbnRfY21w IChydHggdGFyZ2V0LCBtYWNoaW5lX21vZGUgcHJlZF9tb2RlLCBydHhfY29kZSBjbXAsCgkJCSAg bWFjaGluZV9tb2RlIGRhdGFfbW9kZSwgcnR4IG9wMSwgcnR4IG9wMikKewogIGluc25fY29kZSBp Y29kZSA9IGNvZGVfZm9yX2FhcmNoNjRfcHJlZF9jbXAgKGNtcCwgZGF0YV9tb2RlKTsKICBleHBh bmRfb3BlcmFuZCBvcHNbNV07CiAgY3JlYXRlX291dHB1dF9vcGVyYW5kICgmb3BzWzBdLCB0YXJn ZXQsIHByZWRfbW9kZSk7CiAgY3JlYXRlX2lucHV0X29wZXJhbmQgKCZvcHNbMV0sIENPTlNUTTFf UlRYIChwcmVkX21vZGUpLCBwcmVkX21vZGUpOwogIGNyZWF0ZV9pbnRlZ2VyX29wZXJhbmQgKCZv cHNbMl0sIFNWRV9LTk9XTl9QVFJVRSk7CiAgY3JlYXRlX2lucHV0X29wZXJhbmQgKCZvcHNbM10s IG9wMSwgZGF0YV9tb2RlKTsKICBjcmVhdGVfaW5wdXRfb3BlcmFuZCAoJm9wc1s0XSwgb3AyLCBk YXRhX21vZGUpOwogIGV4cGFuZF9pbnNuIChpY29kZSwgNSwgb3BzKTsKICByZXR1cm4gb3BzWzBd LnZhbHVlOwp9CgovKiBVc2UgYSBjb21wYXJpc29uIHRvIGNvbnZlcnQgaW50ZWdlciB2ZWN0b3Ig U1JDIGludG8gTU9ERSwgd2hpY2ggaXMKICAgdGhlIGNvcnJlc3BvbmRpbmcgU1ZFIHByZWRpY2F0 ZSBtb2RlLiAgVXNlIFRBUkdFVCBmb3IgdGhlIHJlc3VsdAogICBpZiBpdCdzIG5vbm51bGwgYW5k IGNvbnZlbmllbnQuICAqLwoKcnR4CmFhcmNoNjRfY29udmVydF9zdmVfZGF0YV90b19wcmVkIChy dHggdGFyZ2V0LCBtYWNoaW5lX21vZGUgbW9kZSwgcnR4IHNyYykKewogIG1hY2hpbmVfbW9kZSBz cmNfbW9kZSA9IEdFVF9NT0RFIChzcmMpOwogIHJldHVybiBhYXJjaDY0X3N2ZV9lbWl0X2ludF9j bXAgKHRhcmdldCwgbW9kZSwgTkUsIHNyY19tb2RlLAoJCQkJICAgc3JjLCBDT05TVDBfUlRYIChz cmNfbW9kZSkpOwp9CgovKiBSZXR1cm4gdGhlIGFzc2VtYmx5IHRva2VuIGZvciBzdnByZm9wIHZh bHVlIFBSRk9QLiAgKi8KCnN0YXRpYyBjb25zdCBjaGFyICoKc3ZwcmZvcF90b2tlbiAoZW51bSBh YXJjaDY0X3N2cHJmb3AgcHJmb3ApCnsKICBzd2l0Y2ggKHByZm9wKQogICAgewojZGVmaW5lIENB U0UoVVBQRVIsIExPV0VSLCBWQUxVRSkgY2FzZSBBQVJDSDY0X1NWXyMjVVBQRVI6IHJldHVybiAj TE9XRVI7CiAgICBBQVJDSDY0X0ZPUl9TVlBSRk9QIChDQVNFKQojdW5kZWYgQ0FTRQogICAgY2Fz ZSBBQVJDSDY0X05VTV9TVlBSRk9QUzoKICAgICAgYnJlYWs7CiAgICB9CiAgZ2NjX3VucmVhY2hh YmxlICgpOwp9CgovKiBSZXR1cm4gdGhlIGFzc2VtYmx5IHN0cmluZyBmb3IgYW4gU1ZFIHByZWZl dGNoIG9wZXJhdGlvbiB3aXRoCiAgIG1uZW1vbmljIE1ORU1PTklDLCBnaXZlbiB0aGF0IFBSRk9Q X1JUWCBpcyB0aGUgcHJlZmV0Y2ggb3BlcmF0aW9uCiAgIGFuZCB0aGF0IFNVRkZJWCBpcyB0aGUg Zm9ybWF0IGZvciB0aGUgcmVtYWluaW5nIG9wZXJhbmRzLiAgKi8KCmNoYXIgKgphYXJjaDY0X291 dHB1dF9zdmVfcHJlZmV0Y2ggKGNvbnN0IGNoYXIgKm1uZW1vbmljLCBydHggcHJmb3BfcnR4LAoJ CQkgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCkKewogIHN0YXRpYyBjaGFyIGJ1ZmZlclsxMjhdOwog IGFhcmNoNjRfc3ZwcmZvcCBwcmZvcCA9IChhYXJjaDY0X3N2cHJmb3ApIElOVFZBTCAocHJmb3Bf cnR4KTsKICB1bnNpZ25lZCBpbnQgd3JpdHRlbiA9IHNucHJpbnRmIChidWZmZXIsIHNpemVvZiAo YnVmZmVyKSwgIiVzXHQlcywgJXMiLAoJCQkJICAgbW5lbW9uaWMsIHN2cHJmb3BfdG9rZW4gKHBy Zm9wKSwgc3VmZml4KTsKICBnY2NfYXNzZXJ0ICh3cml0dGVuIDwgc2l6ZW9mIChidWZmZXIpKTsK ICByZXR1cm4gYnVmZmVyOwp9CgovKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBjYWxjdWxhdGUgdGhl IG51bWJlciBvZiBlbGVtZW50cyBpbiBQQVRURVJOCiAgIGF0IGNvbXBpbGUgdGltZSwgZ2l2ZW4g dGhhdCB0aGVyZSBhcmUgTkVMVFNfUEVSX1ZRIGVsZW1lbnRzIHBlcgogICAxMjgtYml0IGJsb2Nr LiAgUmV0dXJuIHRoZSB2YWx1ZSBpZiBzbywgb3RoZXJ3aXNlIHJldHVybiAtMS4gICovCgpIT1NU X1dJREVfSU5UCmFhcmNoNjRfZm9sZF9zdmVfY250X3BhdCAoYWFyY2g2NF9zdnBhdHRlcm4gcGF0 dGVybiwgdW5zaWduZWQgaW50IG5lbHRzX3Blcl92cSkKewogIHVuc2lnbmVkIGludCB2bCwgY29u c3Rfdmc7CiAgaWYgKHBhdHRlcm4gPj0gQUFSQ0g2NF9TVl9WTDEgJiYgcGF0dGVybiA8PSBBQVJD SDY0X1NWX1ZMOCkKICAgIHZsID0gMSArIChwYXR0ZXJuIC0gQUFSQ0g2NF9TVl9WTDEpOwogIGVs c2UgaWYgKHBhdHRlcm4gPj0gQUFSQ0g2NF9TVl9WTDE2ICYmIHBhdHRlcm4gPD0gQUFSQ0g2NF9T Vl9WTDI1NikKICAgIHZsID0gMTYgPDwgKHBhdHRlcm4gLSBBQVJDSDY0X1NWX1ZMMTYpOwogIGVs c2UgaWYgKGFhcmNoNjRfc3ZlX3ZnLmlzX2NvbnN0YW50ICgmY29uc3RfdmcpKQogICAgewogICAg ICAvKiBUaGVyZSBhcmUgdHdvIHZlY3RvciBncmFudWxlcyBwZXIgcXVhZHdvcmQuICAqLwogICAg ICB1bnNpZ25lZCBpbnQgbmVsdHMgPSAoY29uc3RfdmcgLyAyKSAqIG5lbHRzX3Blcl92cTsKICAg ICAgc3dpdGNoIChwYXR0ZXJuKQoJewoJY2FzZSBBQVJDSDY0X1NWX1BPVzI6IHJldHVybiAxIDw8 IGZsb29yX2xvZzIgKG5lbHRzKTsKCWNhc2UgQUFSQ0g2NF9TVl9NVUw0OiByZXR1cm4gbmVsdHMg JiAtNDsKCWNhc2UgQUFSQ0g2NF9TVl9NVUwzOiByZXR1cm4gKG5lbHRzIC8gMykgKiAzOwoJY2Fz ZSBBQVJDSDY0X1NWX0FMTDogcmV0dXJuIG5lbHRzOwoJZGVmYXVsdDogZ2NjX3VucmVhY2hhYmxl ICgpOwoJfQogICAgfQogIGVsc2UKICAgIHJldHVybiAtMTsKCiAgLyogVGhlcmUgYXJlIHR3byB2 ZWN0b3IgZ3JhbnVsZXMgcGVyIHF1YWR3b3JkLiAgKi8KICBwb2x5X3VpbnQ2NCBuZWx0c19hbGwg PSBleGFjdF9kaXYgKGFhcmNoNjRfc3ZlX3ZnLCAyKSAqIG5lbHRzX3Blcl92cTsKICBpZiAoa25v d25fbGUgKHZsLCBuZWx0c19hbGwpKQogICAgcmV0dXJuIHZsOwoKICAvKiBSZXF1ZXN0aW5nIG1v cmUgZWxlbWVudHMgdGhhbiBhcmUgYXZhaWxhYmxlIHJlc3VsdHMgaW4gYSBQRkFMU0UuICAqLwog IGlmIChrbm93bl9ndCAodmwsIG5lbHRzX2FsbCkpCiAgICByZXR1cm4gMDsKCiAgcmV0dXJuIC0x Owp9CgovKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gbW92ZSBWQUxVRSBpbnRvIGEgcmVnaXN0ZXIg dXNpbmcgYSBzaW5nbGUKICAgQ05UW0JIV0RdIGluc3RydWN0aW9uLiAgKi8KCnN0YXRpYyBib29s CmFhcmNoNjRfc3ZlX2NudF9pbW1lZGlhdGVfcCAocG9seV9pbnQ2NCB2YWx1ZSkKewogIEhPU1Rf V0lERV9JTlQgZmFjdG9yID0gdmFsdWUuY29lZmZzWzBdOwogIC8qIFRoZSBjb2VmZmljaWVudCBt dXN0IGJlIFsxLCAxNl0gKiB7MiwgNCwgOCwgMTZ9LiAgKi8KICByZXR1cm4gKHZhbHVlLmNvZWZm c1sxXSA9PSBmYWN0b3IKCSAgJiYgSU5fUkFOR0UgKGZhY3RvciwgMiwgMTYgKiAxNikKCSAgJiYg KGZhY3RvciAmIDEpID09IDAKCSAgJiYgZmFjdG9yIDw9IDE2ICogKGZhY3RvciAmIC1mYWN0b3Ip KTsKfQoKLyogTGlrZXdpc2UgZm9yIHJ0eCBYLiAgKi8KCmJvb2wKYWFyY2g2NF9zdmVfY250X2lt bWVkaWF0ZV9wIChydHggeCkKewogIHBvbHlfaW50NjQgdmFsdWU7CiAgcmV0dXJuIHBvbHlfaW50 X3J0eF9wICh4LCAmdmFsdWUpICYmIGFhcmNoNjRfc3ZlX2NudF9pbW1lZGlhdGVfcCAodmFsdWUp Owp9CgovKiBSZXR1cm4gdGhlIGFzbSBzdHJpbmcgZm9yIGFuIGluc3RydWN0aW9uIHdpdGggYSBD TlQtbGlrZSB2ZWN0b3Igc2l6ZQogICBvcGVyYW5kIChhIHZlY3RvciBwYXR0ZXJuIGZvbGxvd2Vk IGJ5IGEgbXVsdGlwbGllciBpbiB0aGUgcmFuZ2UgWzEsIDE2XSkuCiAgIFBSRUZJWCBpcyB0aGUg bW5lbW9uaWMgd2l0aG91dCB0aGUgc2l6ZSBzdWZmaXggYW5kIE9QRVJBTkRTIGlzIHRoZQogICBm aXJzdCBwYXJ0IG9mIHRoZSBvcGVyYW5kcyB0ZW1wbGF0ZSAodGhlIHBhcnQgdGhhdCBjb21lcyBi ZWZvcmUgdGhlCiAgIHZlY3RvciBzaXplIGl0c2VsZikuICBQQVRURVJOIGlzIHRoZSBwYXR0ZXJu IHRvIHVzZS4gIEZBQ1RPUiBpcyB0aGUKICAgbnVtYmVyIG9mIHF1YWR3b3Jkcy4gIE5FTFRTX1BF Ul9WUSwgaWYgbm9uemVybywgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cwogICBpbiBlYWNoIHF1 YWR3b3JkLiAgSWYgaXQgaXMgemVybywgd2UgY2FuIHVzZSBhbnkgZWxlbWVudCBzaXplLiAgKi8K CnN0YXRpYyBjaGFyICoKYWFyY2g2NF9vdXRwdXRfc3ZlX2NudF9pbW1lZGlhdGUgKGNvbnN0IGNo YXIgKnByZWZpeCwgY29uc3QgY2hhciAqb3BlcmFuZHMsCgkJCQkgIGFhcmNoNjRfc3ZwYXR0ZXJu IHBhdHRlcm4sCgkJCQkgIHVuc2lnbmVkIGludCBmYWN0b3IsCgkJCQkgIHVuc2lnbmVkIGludCBu ZWx0c19wZXJfdnEpCnsKICBzdGF0aWMgY2hhciBidWZmZXJbc2l6ZW9mICgic3FpbmNkXHQleDAs ICV3MCwgdmwyNTYsIG11bCAjMTYiKV07CgogIGlmIChuZWx0c19wZXJfdnEgPT0gMCkKICAgIC8q IFRoZXJlIGlzIHNvbWUgb3ZlcmxhcCBpbiB0aGUgcmFuZ2VzIG9mIHRoZSBmb3VyIENOVCBpbnN0 cnVjdGlvbnMuCiAgICAgICBIZXJlIHdlIGFsd2F5cyB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxl IGVsZW1lbnQgc2l6ZSwgc28gdGhhdCB0aGUKICAgICAgIG11bHRpcGxpZXIgaXMgMSB3aGVyZWV2 ZXIgcG9zc2libGUuICAqLwogICAgbmVsdHNfcGVyX3ZxID0gZmFjdG9yICYgLWZhY3RvcjsKICBp bnQgc2hpZnQgPSBzdGQ6Om1pbiAoZXhhY3RfbG9nMiAobmVsdHNfcGVyX3ZxKSwgNCk7CiAgZ2Nj X2Fzc2VydCAoSU5fUkFOR0UgKHNoaWZ0LCAxLCA0KSk7CiAgY2hhciBzdWZmaXggPSAiZHdoYiJb c2hpZnQgLSAxXTsKCiAgZmFjdG9yID4+PSBzaGlmdDsKICB1bnNpZ25lZCBpbnQgd3JpdHRlbjsK ICBpZiAocGF0dGVybiA9PSBBQVJDSDY0X1NWX0FMTCAmJiBmYWN0b3IgPT0gMSkKICAgIHdyaXR0 ZW4gPSBzbnByaW50ZiAoYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksICIlcyVjXHQlcyIsCgkJCXBy ZWZpeCwgc3VmZml4LCBvcGVyYW5kcyk7CiAgZWxzZSBpZiAoZmFjdG9yID09IDEpCiAgICB3cml0 dGVuID0gc25wcmludGYgKGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCAiJXMlY1x0JXMsICVzIiwK CQkJcHJlZml4LCBzdWZmaXgsIG9wZXJhbmRzLCBzdnBhdHRlcm5fdG9rZW4gKHBhdHRlcm4pKTsK ICBlbHNlCiAgICB3cml0dGVuID0gc25wcmludGYgKGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCAi JXMlY1x0JXMsICVzLCBtdWwgIyVkIiwKCQkJcHJlZml4LCBzdWZmaXgsIG9wZXJhbmRzLCBzdnBh dHRlcm5fdG9rZW4gKHBhdHRlcm4pLAoJCQlmYWN0b3IpOwogIGdjY19hc3NlcnQgKHdyaXR0ZW4g PCBzaXplb2YgKGJ1ZmZlcikpOwogIHJldHVybiBidWZmZXI7Cn0KCi8qIFJldHVybiB0aGUgYXNt IHN0cmluZyBmb3IgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBhIENOVC1saWtlIHZlY3RvciBzaXplCiAg IG9wZXJhbmQgKGEgdmVjdG9yIHBhdHRlcm4gZm9sbG93ZWQgYnkgYSBtdWx0aXBsaWVyIGluIHRo ZSByYW5nZSBbMSwgMTZdKS4KICAgUFJFRklYIGlzIHRoZSBtbmVtb25pYyB3aXRob3V0IHRoZSBz aXplIHN1ZmZpeCBhbmQgT1BFUkFORFMgaXMgdGhlCiAgIGZpcnN0IHBhcnQgb2YgdGhlIG9wZXJh bmRzIHRlbXBsYXRlICh0aGUgcGFydCB0aGF0IGNvbWVzIGJlZm9yZSB0aGUKICAgdmVjdG9yIHNp emUgaXRzZWxmKS4gIFggaXMgdGhlIHZhbHVlIG9mIHRoZSB2ZWN0b3Igc2l6ZSBvcGVyYW5kLAog ICBhcyBhIHBvbHlub21pYWwgaW50ZWdlciBydHg7IHdlIG5lZWQgdG8gY29udmVydCB0aGlzIGlu dG8gYW4gImFsbCIKICAgcGF0dGVybiB3aXRoIGEgbXVsdGlwbGllci4gICovCgpjaGFyICoKYWFy Y2g2NF9vdXRwdXRfc3ZlX2NudF9pbW1lZGlhdGUgKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3Qg Y2hhciAqb3BlcmFuZHMsCgkJCQkgIHJ0eCB4KQp7CiAgcG9seV9pbnQ2NCB2YWx1ZSA9IHJ0eF90 b19wb2x5X2ludDY0ICh4KTsKICBnY2NfYXNzZXJ0IChhYXJjaDY0X3N2ZV9jbnRfaW1tZWRpYXRl X3AgKHZhbHVlKSk7CiAgcmV0dXJuIGFhcmNoNjRfb3V0cHV0X3N2ZV9jbnRfaW1tZWRpYXRlIChw cmVmaXgsIG9wZXJhbmRzLCBBQVJDSDY0X1NWX0FMTCwKCQkJCQkgICB2YWx1ZS5jb2VmZnNbMV0s IDApOwp9CgovKiBSZXR1cm4gdGhlIGFzbSBzdHJpbmcgZm9yIGFuIGluc3RydWN0aW9uIHdpdGgg YSBDTlQtbGlrZSB2ZWN0b3Igc2l6ZQogICBvcGVyYW5kIChhIHZlY3RvciBwYXR0ZXJuIGZvbGxv d2VkIGJ5IGEgbXVsdGlwbGllciBpbiB0aGUgcmFuZ2UgWzEsIDE2XSkuCiAgIFBSRUZJWCBpcyB0 aGUgbW5lbW9uaWMgd2l0aG91dCB0aGUgc2l6ZSBzdWZmaXggYW5kIE9QRVJBTkRTIGlzIHRoZQog ICBmaXJzdCBwYXJ0IG9mIHRoZSBvcGVyYW5kcyB0ZW1wbGF0ZSAodGhlIHBhcnQgdGhhdCBjb21l cyBiZWZvcmUgdGhlCiAgIHZlY3RvciBzaXplIGl0c2VsZikuICBDTlRfUEFUWzAuLjJdIGFyZSB0 aGUgb3BlcmFuZHMgb2YgdGhlCiAgIFVOU1BFQ19TVkVfQ05UX1BBVDsgc2VlIGFhcmNoNjRfc3Zl X2NudF9wYXQgZm9yIGRldGFpbHMuICAqLwoKY2hhciAqCmFhcmNoNjRfb3V0cHV0X3N2ZV9jbnRf cGF0X2ltbWVkaWF0ZSAoY29uc3QgY2hhciAqcHJlZml4LAoJCQkJICAgICAgY29uc3QgY2hhciAq b3BlcmFuZHMsIHJ0eCAqY250X3BhdCkKewogIGFhcmNoNjRfc3ZwYXR0ZXJuIHBhdHRlcm4gPSAo YWFyY2g2NF9zdnBhdHRlcm4pIElOVFZBTCAoY250X3BhdFswXSk7CiAgdW5zaWduZWQgaW50IG5l bHRzX3Blcl92cSA9IElOVFZBTCAoY250X3BhdFsxXSk7CiAgdW5zaWduZWQgaW50IGZhY3RvciA9 IElOVFZBTCAoY250X3BhdFsyXSkgKiBuZWx0c19wZXJfdnE7CiAgcmV0dXJuIGFhcmNoNjRfb3V0 cHV0X3N2ZV9jbnRfaW1tZWRpYXRlIChwcmVmaXgsIG9wZXJhbmRzLCBwYXR0ZXJuLAoJCQkJCSAg IGZhY3RvciwgbmVsdHNfcGVyX3ZxKTsKfQoKLyogUmV0dXJuIHRydWUgaWYgd2UgY2FuIGFkZCBY IHVzaW5nIGEgc2luZ2xlIFNWRSBJTkMgb3IgREVDIGluc3RydWN0aW9uLiAgKi8KCmJvb2wKYWFy Y2g2NF9zdmVfc2NhbGFyX2luY19kZWNfaW1tZWRpYXRlX3AgKHJ0eCB4KQp7CiAgcG9seV9pbnQ2 NCB2YWx1ZTsKICByZXR1cm4gKHBvbHlfaW50X3J0eF9wICh4LCAmdmFsdWUpCgkgICYmIChhYXJj aDY0X3N2ZV9jbnRfaW1tZWRpYXRlX3AgKHZhbHVlKQoJICAgICAgfHwgYWFyY2g2NF9zdmVfY250 X2ltbWVkaWF0ZV9wICgtdmFsdWUpKSk7Cn0KCi8qIFJldHVybiB0aGUgYXNtIHN0cmluZyBmb3Ig YWRkaW5nIFNWRSBJTkMvREVDIGltbWVkaWF0ZSBPRkZTRVQgdG8KICAgb3BlcmFuZCAwLiAgKi8K CmNoYXIgKgphYXJjaDY0X291dHB1dF9zdmVfc2NhbGFyX2luY19kZWMgKHJ0eCBvZmZzZXQpCnsK ICBwb2x5X2ludDY0IG9mZnNldF92YWx1ZSA9IHJ0eF90b19wb2x5X2ludDY0IChvZmZzZXQpOwog IGdjY19hc3NlcnQgKG9mZnNldF92YWx1ZS5jb2VmZnNbMF0gPT0gb2Zmc2V0X3ZhbHVlLmNvZWZm c1sxXSk7CiAgaWYgKG9mZnNldF92YWx1ZS5jb2VmZnNbMV0gPiAwKQogICAgcmV0dXJuIGFhcmNo NjRfb3V0cHV0X3N2ZV9jbnRfaW1tZWRpYXRlICgiaW5jIiwgIiV4MCIsIEFBUkNINjRfU1ZfQUxM LAoJCQkJCSAgICAgb2Zmc2V0X3ZhbHVlLmNvZWZmc1sxXSwgMCk7CiAgZWxzZQogICAgcmV0dXJu IGFhcmNoNjRfb3V0cHV0X3N2ZV9jbnRfaW1tZWRpYXRlICgiZGVjIiwgIiV4MCIsIEFBUkNINjRf U1ZfQUxMLAoJCQkJCSAgICAgLW9mZnNldF92YWx1ZS5jb2VmZnNbMV0sIDApOwp9CgovKiBSZXR1 cm4gdHJ1ZSBpZiB3ZSBjYW4gYWRkIFZBTFVFIHRvIGEgcmVnaXN0ZXIgdXNpbmcgYSBzaW5nbGUg QUREVkwKICAgb3IgQUREUEwgaW5zdHJ1Y3Rpb24uICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF9z dmVfYWRkdmxfYWRkcGxfaW1tZWRpYXRlX3AgKHBvbHlfaW50NjQgdmFsdWUpCnsKICBIT1NUX1dJ REVfSU5UIGZhY3RvciA9IHZhbHVlLmNvZWZmc1swXTsKICBpZiAoZmFjdG9yID09IDAgfHwgdmFs dWUuY29lZmZzWzFdICE9IGZhY3RvcikKICAgIHJldHVybiBmYWxzZTsKICAvKiBGQUNUT1IgY291 bnRzIFZHIC8gMiwgc28gYSB2YWx1ZSBvZiAyIGlzIG9uZSBwcmVkaWNhdGUgd2lkdGgKICAgICBh bmQgYSB2YWx1ZSBvZiAxNiBpcyBvbmUgdmVjdG9yIHdpZHRoLiAgKi8KICByZXR1cm4gKCgoZmFj dG9yICYgMTUpID09IDAgJiYgSU5fUkFOR0UgKGZhY3RvciwgLTMyICogMTYsIDMxICogMTYpKQoJ ICB8fCAoKGZhY3RvciAmIDEpID09IDAgJiYgSU5fUkFOR0UgKGZhY3RvciwgLTMyICogMiwgMzEg KiAyKSkpOwp9CgovKiBMaWtld2lzZSBmb3IgcnR4IFguICAqLwoKYm9vbAphYXJjaDY0X3N2ZV9h ZGR2bF9hZGRwbF9pbW1lZGlhdGVfcCAocnR4IHgpCnsKICBwb2x5X2ludDY0IHZhbHVlOwogIHJl dHVybiAocG9seV9pbnRfcnR4X3AgKHgsICZ2YWx1ZSkKCSAgJiYgYWFyY2g2NF9zdmVfYWRkdmxf YWRkcGxfaW1tZWRpYXRlX3AgKHZhbHVlKSk7Cn0KCi8qIFJldHVybiB0aGUgYXNtIHN0cmluZyBm b3IgYWRkaW5nIEFERFZMIG9yIEFERFBMIGltbWVkaWF0ZSBPRkZTRVQKICAgdG8gb3BlcmFuZCAx IGFuZCBzdG9yaW5nIHRoZSByZXN1bHQgaW4gb3BlcmFuZCAwLiAgKi8KCmNoYXIgKgphYXJjaDY0 X291dHB1dF9zdmVfYWRkdmxfYWRkcGwgKHJ0eCBvZmZzZXQpCnsKICBzdGF0aWMgY2hhciBidWZm ZXJbc2l6ZW9mICgiYWRkcGxcdCV4MCwgJXgxLCAjLSIpICsgMyAqIHNpemVvZiAoaW50KV07CiAg cG9seV9pbnQ2NCBvZmZzZXRfdmFsdWUgPSBydHhfdG9fcG9seV9pbnQ2NCAob2Zmc2V0KTsKICBn Y2NfYXNzZXJ0IChhYXJjaDY0X3N2ZV9hZGR2bF9hZGRwbF9pbW1lZGlhdGVfcCAob2Zmc2V0X3Zh bHVlKSk7CgogIGludCBmYWN0b3IgPSBvZmZzZXRfdmFsdWUuY29lZmZzWzFdOwogIGlmICgoZmFj dG9yICYgMTUpID09IDApCiAgICBzbnByaW50ZiAoYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksICJh ZGR2bFx0JSV4MCwgJSV4MSwgIyVkIiwgZmFjdG9yIC8gMTYpOwogIGVsc2UKICAgIHNucHJpbnRm IChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgImFkZHBsXHQlJXgwLCAlJXgxLCAjJWQiLCBmYWN0 b3IgLyAyKTsKICByZXR1cm4gYnVmZmVyOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBYIGlzIGEgdmFs aWQgaW1tZWRpYXRlIGZvciBhbiBTVkUgdmVjdG9yIElOQyBvciBERUMKICAgaW5zdHJ1Y3Rpb24u ICBJZiBpdCBpcywgc3RvcmUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBlYWNoIHZlY3Rvcgog ICBxdWFkd29yZCBpbiAqTkVMVFNfUEVSX1ZRX09VVCAoaWYgbm9ubnVsbCkgYW5kIHN0b3JlIHRo ZSBtdWx0aXBsaWNhdGlvbgogICBmYWN0b3IgaW4gKkZBQ1RPUl9PVVQgKGlmIG5vbm51bGwpLiAg Ki8KCmJvb2wKYWFyY2g2NF9zdmVfdmVjdG9yX2luY19kZWNfaW1tZWRpYXRlX3AgKHJ0eCB4LCBp bnQgKmZhY3Rvcl9vdXQsCgkJCQkJdW5zaWduZWQgaW50ICpuZWx0c19wZXJfdnFfb3V0KQp7CiAg cnR4IGVsdDsKICBwb2x5X2ludDY0IHZhbHVlOwoKICBpZiAoIWNvbnN0X3ZlY19kdXBsaWNhdGVf cCAoeCwgJmVsdCkKICAgICAgfHwgIXBvbHlfaW50X3J0eF9wIChlbHQsICZ2YWx1ZSkpCiAgICBy ZXR1cm4gZmFsc2U7CgogIHVuc2lnbmVkIGludCBuZWx0c19wZXJfdnEgPSAxMjggLyBHRVRfTU9E RV9VTklUX0JJVFNJWkUgKEdFVF9NT0RFICh4KSk7CiAgaWYgKG5lbHRzX3Blcl92cSAhPSA4ICYm IG5lbHRzX3Blcl92cSAhPSA0ICYmIG5lbHRzX3Blcl92cSAhPSAyKQogICAgLyogVGhlcmUncyBu byB2ZWN0b3IgSU5DQi4gICovCiAgICByZXR1cm4gZmFsc2U7CgogIEhPU1RfV0lERV9JTlQgZmFj dG9yID0gdmFsdWUuY29lZmZzWzBdOwogIGlmICh2YWx1ZS5jb2VmZnNbMV0gIT0gZmFjdG9yKQog ICAgcmV0dXJuIGZhbHNlOwoKICAvKiBUaGUgY29lZmZpY2llbnQgbXVzdCBiZSBbMSwgMTZdICog TkVMVFNfUEVSX1ZRLiAgKi8KICBpZiAoKGZhY3RvciAlIG5lbHRzX3Blcl92cSkgIT0gMAogICAg ICB8fCAhSU5fUkFOR0UgKGFicyAoZmFjdG9yKSwgbmVsdHNfcGVyX3ZxLCAxNiAqIG5lbHRzX3Bl cl92cSkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChmYWN0b3Jfb3V0KQogICAgKmZhY3Rvcl9v dXQgPSBmYWN0b3I7CiAgaWYgKG5lbHRzX3Blcl92cV9vdXQpCiAgICAqbmVsdHNfcGVyX3ZxX291 dCA9IG5lbHRzX3Blcl92cTsKICByZXR1cm4gdHJ1ZTsKfQoKLyogUmV0dXJuIHRydWUgaWYgWCBp cyBhIHZhbGlkIGltbWVkaWF0ZSBmb3IgYW4gU1ZFIHZlY3RvciBJTkMgb3IgREVDCiAgIGluc3Ry dWN0aW9uLiAgKi8KCmJvb2wKYWFyY2g2NF9zdmVfdmVjdG9yX2luY19kZWNfaW1tZWRpYXRlX3Ag KHJ0eCB4KQp7CiAgcmV0dXJuIGFhcmNoNjRfc3ZlX3ZlY3Rvcl9pbmNfZGVjX2ltbWVkaWF0ZV9w ICh4LCBOVUxMLCBOVUxMKTsKfQoKLyogUmV0dXJuIHRoZSBhc20gdGVtcGxhdGUgZm9yIGFuIFNW RSB2ZWN0b3IgSU5DIG9yIERFQyBpbnN0cnVjdGlvbi4KICAgT1BFUkFORFMgZ2l2ZXMgdGhlIG9w ZXJhbmRzIGJlZm9yZSB0aGUgdmVjdG9yIGNvdW50IGFuZCBYIGlzIHRoZQogICB2YWx1ZSBvZiB0 aGUgdmVjdG9yIGNvdW50IG9wZXJhbmQgaXRzZWxmLiAgKi8KCmNoYXIgKgphYXJjaDY0X291dHB1 dF9zdmVfdmVjdG9yX2luY19kZWMgKGNvbnN0IGNoYXIgKm9wZXJhbmRzLCBydHggeCkKewogIGlu dCBmYWN0b3I7CiAgdW5zaWduZWQgaW50IG5lbHRzX3Blcl92cTsKICBpZiAoIWFhcmNoNjRfc3Zl X3ZlY3Rvcl9pbmNfZGVjX2ltbWVkaWF0ZV9wICh4LCAmZmFjdG9yLCAmbmVsdHNfcGVyX3ZxKSkK ICAgIGdjY191bnJlYWNoYWJsZSAoKTsKICBpZiAoZmFjdG9yIDwgMCkKICAgIHJldHVybiBhYXJj aDY0X291dHB1dF9zdmVfY250X2ltbWVkaWF0ZSAoImRlYyIsIG9wZXJhbmRzLCBBQVJDSDY0X1NW X0FMTCwKCQkJCQkgICAgIC1mYWN0b3IsIG5lbHRzX3Blcl92cSk7CiAgZWxzZQogICAgcmV0dXJu IGFhcmNoNjRfb3V0cHV0X3N2ZV9jbnRfaW1tZWRpYXRlICgiaW5jIiwgb3BlcmFuZHMsIEFBUkNI NjRfU1ZfQUxMLAoJCQkJCSAgICAgZmFjdG9yLCBuZWx0c19wZXJfdnEpOwp9CgovKiBNdWx0aXBs aWVycyBmb3IgcmVwZWF0aW5nIGJpdG1hc2tzIG9mIHdpZHRoIDMyLCAxNiwgOCwgNCwgYW5kIDIu ICAqLwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgYml0bWFza19pbW1fbXVs W10gPQogIHsKICAgIDB4MDAwMDAwMDEwMDAwMDAwMXVsbCwKICAgIDB4MDAwMTAwMDEwMDAxMDAw MXVsbCwKICAgIDB4MDEwMTAxMDEwMTAxMDEwMXVsbCwKICAgIDB4MTExMTExMTExMTExMTExMXVs bCwKICAgIDB4NTU1NTU1NTU1NTU1NTU1NXVsbCwKICB9OwoKCgovKiBSZXR1cm4gdHJ1ZSBpZiA2 NC1iaXQgVkFMIGlzIGEgdmFsaWQgYml0bWFzayBpbW1lZGlhdGUuICAqLwpzdGF0aWMgYm9vbAph YXJjaDY0X2JpdG1hc2tfaW1tICh1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHZhbCkKewogIHVuc2ln bmVkIEhPU1RfV0lERV9JTlQgdG1wLCBtYXNrLCBmaXJzdF9vbmUsIG5leHRfb25lOwogIGludCBi aXRzOwoKICAvKiBDaGVjayBmb3IgYSBzaW5nbGUgc2VxdWVuY2Ugb2Ygb25lIGJpdHMgYW5kIHJl dHVybiBxdWlja2x5IGlmIHNvLgogICAgIFRoZSBzcGVjaWFsIGNhc2VzIG9mIGFsbCBvbmVzIGFu ZCBhbGwgemVyb2VzIHJldHVybnMgZmFsc2UuICAqLwogIHRtcCA9IHZhbCArICh2YWwgJiAtdmFs KTsKCiAgaWYgKHRtcCA9PSAodG1wICYgLXRtcCkpCiAgICByZXR1cm4gKHZhbCArIDEpID4gMTsK CiAgLyogSW52ZXJ0IGlmIHRoZSBpbW1lZGlhdGUgZG9lc24ndCBzdGFydCB3aXRoIGEgemVybyBi aXQgLSB0aGlzIG1lYW5zIHdlCiAgICAgb25seSBuZWVkIHRvIHNlYXJjaCBmb3Igc2VxdWVuY2Vz IG9mIG9uZSBiaXRzLiAgKi8KICBpZiAodmFsICYgMSkKICAgIHZhbCA9IH52YWw7CgogIC8qIEZp bmQgdGhlIGZpcnN0IHNldCBiaXQgYW5kIHNldCB0bXAgdG8gdmFsIHdpdGggdGhlIGZpcnN0IHNl cXVlbmNlIG9mIG9uZQogICAgIGJpdHMgcmVtb3ZlZC4gIFJldHVybiBzdWNjZXNzIGlmIHRoZXJl IGlzIGEgc2luZ2xlIHNlcXVlbmNlIG9mIG9uZXMuICAqLwogIGZpcnN0X29uZSA9IHZhbCAmIC12 YWw7CiAgdG1wID0gdmFsICYgKHZhbCArIGZpcnN0X29uZSk7CgogIGlmICh0bXAgPT0gMCkKICAg IHJldHVybiB0cnVlOwoKICAvKiBGaW5kIHRoZSBuZXh0IHNldCBiaXQgYW5kIGNvbXB1dGUgdGhl IGRpZmZlcmVuY2UgaW4gYml0IHBvc2l0aW9uLiAgKi8KICBuZXh0X29uZSA9IHRtcCAmIC10bXA7 CiAgYml0cyA9IGNsel9od2kgKGZpcnN0X29uZSkgLSBjbHpfaHdpIChuZXh0X29uZSk7CiAgbWFz ayA9IHZhbCBeIHRtcDsKCiAgLyogQ2hlY2sgdGhlIGJpdCBwb3NpdGlvbiBkaWZmZXJlbmNlIGlz IGEgcG93ZXIgb2YgMiwgYW5kIHRoYXQgdGhlIGZpcnN0CiAgICAgc2VxdWVuY2Ugb2Ygb25lIGJp dHMgZml0cyB3aXRoaW4gJ2JpdHMnIGJpdHMuICAqLwogIGlmICgobWFzayA+PiBiaXRzKSAhPSAw IHx8IGJpdHMgIT0gKGJpdHMgJiAtYml0cykpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIENoZWNr IHRoZSBzZXF1ZW5jZSBvZiBvbmUgYml0cyBpcyByZXBlYXRlZCA2NC9iaXRzIHRpbWVzLiAgKi8K ICByZXR1cm4gdmFsID09IG1hc2sgKiBiaXRtYXNrX2ltbV9tdWxbX19idWlsdGluX2NseiAoYml0 cykgLSAyNl07Cn0KCgovKiBSZXR1cm4gdHJ1ZSBpZiBWQUwgaXMgYSB2YWxpZCBiaXRtYXNrIGlt bWVkaWF0ZSBmb3IgTU9ERS4gICovCmJvb2wKYWFyY2g2NF9iaXRtYXNrX2ltbSAodW5zaWduZWQg SE9TVF9XSURFX0lOVCB2YWwsIG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgaWYgKG1vZGUgPT0gRElt b2RlKQogICAgcmV0dXJuIGFhcmNoNjRfYml0bWFza19pbW0gKHZhbCk7CgogIGlmIChtb2RlID09 IFNJbW9kZSkKICAgIHJldHVybiBhYXJjaDY0X2JpdG1hc2tfaW1tICgodmFsICYgMHhmZmZmZmZm ZikgfCAodmFsIDw8IDMyKSk7CgogIC8qIFJlcGxpY2F0ZSBzbWFsbCBpbW1lZGlhdGVzIHRvIGZp dCA2NCBiaXRzLiAgKi8KICBpbnQgc2l6ZSA9IEdFVF9NT0RFX1VOSVRfUFJFQ0lTSU9OIChtb2Rl KTsKICB2YWwgJj0gKEhPU1RfV0lERV9JTlRfMVUgPDwgc2l6ZSkgLSAxOwogIHZhbCAqPSBiaXRt YXNrX2ltbV9tdWxbX19idWlsdGluX2NseiAoc2l6ZSkgLSAyNl07CgogIHJldHVybiBhYXJjaDY0 X2JpdG1hc2tfaW1tICh2YWwpOwp9CgoKLyogUmV0dXJuIHRydWUgaWYgdGhlIGltbWVkaWF0ZSBW QUwgY2FuIGJlIGEgYml0ZmllbGQgaW1tZWRpYXRlCiAgIGJ5IGNoYW5naW5nIHRoZSBnaXZlbiBN QVNLIGJpdHMgaW4gVkFMIHRvIHplcm9lcywgb25lcyBvciBiaXRzCiAgIGZyb20gdGhlIG90aGVy IGhhbGYgb2YgVkFMLiAgUmV0dXJuIHRoZSBuZXcgaW1tZWRpYXRlIGluIFZBTDIuICAqLwpzdGF0 aWMgaW5saW5lIGJvb2wKYWFyY2g2NF9jaGVja19iaXRtYXNrICh1bnNpZ25lZCBIT1NUX1dJREVf SU5UIHZhbCwKCQkgICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCAmdmFsMiwKCQkgICAgICAg dW5zaWduZWQgSE9TVF9XSURFX0lOVCBtYXNrKQp7CiAgdmFsMiA9IHZhbCAmIH5tYXNrOwogIGlm ICh2YWwyICE9IHZhbCAmJiBhYXJjaDY0X2JpdG1hc2tfaW1tICh2YWwyKSkKICAgIHJldHVybiB0 cnVlOwogIHZhbDIgPSB2YWwgfCBtYXNrOwogIGlmICh2YWwyICE9IHZhbCAmJiBhYXJjaDY0X2Jp dG1hc2tfaW1tICh2YWwyKSkKICAgIHJldHVybiB0cnVlOwogIHZhbCA9IHZhbCAmIH5tYXNrOwog IHZhbDIgPSB2YWwgfCAoKCh2YWwgPj4gMzIpIHwgKHZhbCA8PCAzMikpICYgbWFzayk7CiAgaWYg KHZhbDIgIT0gdmFsICYmIGFhcmNoNjRfYml0bWFza19pbW0gKHZhbDIpKQogICAgcmV0dXJuIHRy dWU7CiAgdmFsMiA9IHZhbCB8ICgoKHZhbCA+PiAxNikgfCAodmFsIDw8IDQ4KSkgJiBtYXNrKTsK ICBpZiAodmFsMiAhPSB2YWwgJiYgYWFyY2g2NF9iaXRtYXNrX2ltbSAodmFsMikpCiAgICByZXR1 cm4gdHJ1ZTsKICByZXR1cm4gZmFsc2U7Cn0KCgovKiBSZXR1cm4gdHJ1ZSBpZiBWQUwgaXMgYSB2 YWxpZCBNT1ZaIGltbWVkaWF0ZS4gICovCnN0YXRpYyBpbmxpbmUgYm9vbAphYXJjaDY0X2lzX21v dnogKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgdmFsKQp7CiAgcmV0dXJuICh2YWwgPj4gKGN0el9o d2kgKHZhbCkgJiA0OCkpIDwgNjU1MzY7Cn0KCgovKiBSZXR1cm4gdHJ1ZSBpZiBpbW1lZGlhdGUg VkFMIGNhbiBiZSBjcmVhdGVkIGJ5IGEgNjQtYml0IE1PVkkvTU9WTi9NT1ZaLiAgKi8KYm9vbAph YXJjaDY0X2lzX21vdl94bl9pbW0gKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgdmFsKQp7CiAgcmV0 dXJuIGFhcmNoNjRfaXNfbW92eiAodmFsKSB8fCBhYXJjaDY0X2lzX21vdnogKH52YWwpCiAgICB8 fCBhYXJjaDY0X2JpdG1hc2tfaW1tICh2YWwpOwp9CgoKLyogUmV0dXJuIHRydWUgaWYgVkFMIGlz IGFuIGltbWVkaWF0ZSB0aGF0IGNhbiBiZSBjcmVhdGVkIGJ5IGEgc2luZ2xlCiAgIE1PViBpbnN0 cnVjdGlvbi4gICovCmJvb2wKYWFyY2g2NF9tb3ZlX2ltbSAodW5zaWduZWQgSE9TVF9XSURFX0lO VCB2YWwsIG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgZ2NjX2Fzc2VydCAobW9kZSA9PSBTSW1vZGUg fHwgbW9kZSA9PSBESW1vZGUpOwoKICBpZiAodmFsIDwgNjU1MzYpCiAgICByZXR1cm4gdHJ1ZTsK CiAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBtYXNrID0KICAgICh2YWwgPj4gMzIpID09IDAgfHwg bW9kZSA9PSBTSW1vZGUgPyAweGZmZmZmZmZmIDogSE9TVF9XSURFX0lOVF9NMVU7CgogIGlmIChh YXJjaDY0X2lzX21vdnogKHZhbCAmIG1hc2spIHx8IGFhcmNoNjRfaXNfbW92eiAofnZhbCAmIG1h c2spKQogICAgcmV0dXJuIHRydWU7CgogIHZhbCA9ICh2YWwgJiBtYXNrKSB8ICgodmFsIDw8IDMy KSAmIH5tYXNrKTsKICByZXR1cm4gYWFyY2g2NF9iaXRtYXNrX2ltbSAodmFsKTsKfQoKCnN0YXRp YyBpbnQKYWFyY2g2NF9pbnRlcm5hbF9tb3ZfaW1tZWRpYXRlIChydHggZGVzdCwgcnR4IGltbSwg Ym9vbCBnZW5lcmF0ZSwKCQkJCW1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgaW50IGk7CiAgdW5zaWdu ZWQgSE9TVF9XSURFX0lOVCB2YWwsIHZhbDIsIG1hc2s7CiAgaW50IG9uZV9tYXRjaCwgemVyb19t YXRjaDsKICBpbnQgbnVtX2luc25zOwoKICBnY2NfYXNzZXJ0IChtb2RlID09IFNJbW9kZSB8fCBt b2RlID09IERJbW9kZSk7CgogIHZhbCA9IElOVFZBTCAoaW1tKTsKCiAgaWYgKGFhcmNoNjRfbW92 ZV9pbW0gKHZhbCwgbW9kZSkpCiAgICB7CiAgICAgIGlmIChnZW5lcmF0ZSkKCWVtaXRfaW5zbiAo Z2VuX3J0eF9TRVQgKGRlc3QsIGltbSkpOwogICAgICByZXR1cm4gMTsKICAgIH0KCiAgaWYgKCh2 YWwgPj4gMzIpID09IDAgfHwgbW9kZSA9PSBTSW1vZGUpCiAgICB7CiAgICAgIGlmIChnZW5lcmF0 ZSkKCXsKCSAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAoZGVzdCwgR0VOX0lOVCAodmFsICYgMHhm ZmZmKSkpOwoJICBpZiAobW9kZSA9PSBTSW1vZGUpCgkgICAgZW1pdF9pbnNuIChnZW5faW5zdl9p bW1zaSAoZGVzdCwgR0VOX0lOVCAoMTYpLAoJCQkJICAgICAgIEdFTl9JTlQgKCh2YWwgPj4gMTYp ICYgMHhmZmZmKSkpOwoJICBlbHNlCgkgICAgZW1pdF9pbnNuIChnZW5faW5zdl9pbW1kaSAoZGVz dCwgR0VOX0lOVCAoMTYpLAoJCQkJICAgICAgIEdFTl9JTlQgKCh2YWwgPj4gMTYpICYgMHhmZmZm KSkpOwoJfQogICAgICByZXR1cm4gMjsKICAgIH0KCiAgLyogUmVtYWluaW5nIGNhc2VzIGFyZSBh bGwgZm9yIERJbW9kZS4gICovCgogIG1hc2sgPSAweGZmZmY7CiAgemVyb19tYXRjaCA9ICgodmFs ICYgbWFzaykgPT0gMCkgKyAoKHZhbCAmIChtYXNrIDw8IDE2KSkgPT0gMCkgKwogICAgKCh2YWwg JiAobWFzayA8PCAzMikpID09IDApICsgKCh2YWwgJiAobWFzayA8PCA0OCkpID09IDApOwogIG9u ZV9tYXRjaCA9ICgofnZhbCAmIG1hc2spID09IDApICsgKCh+dmFsICYgKG1hc2sgPDwgMTYpKSA9 PSAwKSArCiAgICAoKH52YWwgJiAobWFzayA8PCAzMikpID09IDApICsgKCh+dmFsICYgKG1hc2sg PDwgNDgpKSA9PSAwKTsKCiAgLyogVHJ5IGEgYml0bWFzayBpbW1lZGlhdGUgYW5kIGEgbW92ayB0 byBnZW5lcmF0ZSB0aGUgaW1tZWRpYXRlCiAgICAgaW4gMiBpbnN0cnVjdGlvbnMuICAqLwoKICBp ZiAoemVyb19tYXRjaCA8IDIgJiYgb25lX21hdGNoIDwgMikKICAgIHsKICAgICAgZm9yIChpID0g MDsgaSA8IDY0OyBpICs9IDE2KQoJewoJICBpZiAoYWFyY2g2NF9jaGVja19iaXRtYXNrICh2YWws IHZhbDIsIG1hc2sgPDwgaSkpCgkgICAgYnJlYWs7CgoJICB2YWwyID0gdmFsICYgfihtYXNrIDw8 IGkpOwoJICBpZiAoKHZhbDIgPj4gMzIpID09IDAgJiYgYWFyY2g2NF9tb3ZlX2ltbSAodmFsMiwg REltb2RlKSkKCSAgICBicmVhazsKCX0KCiAgICAgIGlmIChpICE9IDY0KQoJewoJICBpZiAoZ2Vu ZXJhdGUpCgkgICAgewoJICAgICAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAoZGVzdCwgR0VOX0lO VCAodmFsMikpKTsKCSAgICAgIGVtaXRfaW5zbiAoZ2VuX2luc3ZfaW1tZGkgKGRlc3QsIEdFTl9J TlQgKGkpLAoJCQkJCSBHRU5fSU5UICgodmFsID4+IGkpICYgMHhmZmZmKSkpOwoJICAgIH0KCSAg cmV0dXJuIDI7Cgl9CiAgICB9CgogIC8qIFRyeSBhIGJpdG1hc2sgcGx1cyAyIG1vdmsgdG8gZ2Vu ZXJhdGUgdGhlIGltbWVkaWF0ZSBpbiAzIGluc3RydWN0aW9ucy4gICovCiAgaWYgKHplcm9fbWF0 Y2ggKyBvbmVfbWF0Y2ggPT0gMCkKICAgIHsKICAgICAgZm9yIChpID0gMDsgaSA8IDQ4OyBpICs9 IDE2KQoJZm9yIChpbnQgaiA9IGkgKyAxNjsgaiA8IDY0OyBqICs9IDE2KQoJICBpZiAoYWFyY2g2 NF9jaGVja19iaXRtYXNrICh2YWwsIHZhbDIsIChtYXNrIDw8IGkpIHwgKG1hc2sgPDwgaikpKQoJ ICAgIHsKCSAgICAgIGlmIChnZW5lcmF0ZSkKCQl7CgkJICBlbWl0X2luc24gKGdlbl9ydHhfU0VU IChkZXN0LCBHRU5fSU5UICh2YWwyKSkpOwoJCSAgZW1pdF9pbnNuIChnZW5faW5zdl9pbW1kaSAo ZGVzdCwgR0VOX0lOVCAoaSksCgkJCQkJICAgICBHRU5fSU5UICgodmFsID4+IGkpICYgMHhmZmZm KSkpOwoJCSAgZW1pdF9pbnNuIChnZW5faW5zdl9pbW1kaSAoZGVzdCwgR0VOX0lOVCAoaiksCgkJ CQkJICAgICAgIEdFTl9JTlQgKCh2YWwgPj4gaikgJiAweGZmZmYpKSk7CgkJfQoJICAgICAgcmV0 dXJuIDM7CgkgICAgfQogICAgfQoKICAvKiBHZW5lcmF0ZSAyLTQgaW5zdHJ1Y3Rpb25zLCBza2lw cGluZyAxNiBiaXRzIG9mIGFsbCB6ZXJvZXMgb3Igb25lcyB3aGljaAogICAgIGFyZSBlbWl0dGVk IGJ5IHRoZSBpbml0aWFsIG1vdi4gIElmIG9uZV9tYXRjaCA+IHplcm9fbWF0Y2gsIHNraXAgc2V0 IGJpdHMsCiAgICAgb3RoZXJ3aXNlIHNraXAgemVybyBiaXRzLiAgKi8KCiAgbnVtX2luc25zID0g MTsKICBtYXNrID0gMHhmZmZmOwogIHZhbDIgPSBvbmVfbWF0Y2ggPiB6ZXJvX21hdGNoID8gfnZh bCA6IHZhbDsKICBpID0gKHZhbDIgJiBtYXNrKSAhPSAwID8gMCA6ICh2YWwyICYgKG1hc2sgPDwg MTYpKSAhPSAwID8gMTYgOiAzMjsKCiAgaWYgKGdlbmVyYXRlKQogICAgZW1pdF9pbnNuIChnZW5f cnR4X1NFVCAoZGVzdCwgR0VOX0lOVCAob25lX21hdGNoID4gemVyb19tYXRjaAoJCQkJCSAgID8g KHZhbCB8IH4obWFzayA8PCBpKSkKCQkJCQkgICA6ICh2YWwgJiAobWFzayA8PCBpKSkpKSk7CiAg Zm9yIChpICs9IDE2OyBpIDwgNjQ7IGkgKz0gMTYpCiAgICB7CiAgICAgIGlmICgodmFsMiAmICht YXNrIDw8IGkpKSA9PSAwKQoJY29udGludWU7CiAgICAgIGlmIChnZW5lcmF0ZSkKCWVtaXRfaW5z biAoZ2VuX2luc3ZfaW1tZGkgKGRlc3QsIEdFTl9JTlQgKGkpLAoJCQkJICAgR0VOX0lOVCAoKHZh bCA+PiBpKSAmIDB4ZmZmZikpKTsKICAgICAgbnVtX2luc25zICsrOwogICAgfQoKICByZXR1cm4g bnVtX2luc25zOwp9CgovKiBSZXR1cm4gd2hldGhlciBpbW0gaXMgYSAxMjgtYml0IGltbWVkaWF0 ZSB3aGljaCBpcyBzaW1wbGUgZW5vdWdoIHRvCiAgIGV4cGFuZCBpbmxpbmUuICAqLwpib29sCmFh cmNoNjRfbW92MTI4X2ltbWVkaWF0ZSAocnR4IGltbSkKewogIGlmIChDT05TVF9JTlRfUCAoaW1t KSkKICAgIHJldHVybiB0cnVlOwoKICBnY2NfYXNzZXJ0IChDT05TVF9XSURFX0lOVF9OVU5JVFMg KGltbSkgPT0gMik7CgogIHJ0eCBsbyA9IEdFTl9JTlQgKENPTlNUX1dJREVfSU5UX0VMVCAoaW1t LCAwKSk7CiAgcnR4IGhpID0gR0VOX0lOVCAoQ09OU1RfV0lERV9JTlRfRUxUIChpbW0sIDEpKTsK CiAgcmV0dXJuIGFhcmNoNjRfaW50ZXJuYWxfbW92X2ltbWVkaWF0ZSAoTlVMTF9SVFgsIGxvLCBm YWxzZSwgREltb2RlKQoJICsgYWFyY2g2NF9pbnRlcm5hbF9tb3ZfaW1tZWRpYXRlIChOVUxMX1JU WCwgaGksIGZhbHNlLCBESW1vZGUpIDw9IDQ7Cn0KCgovKiBSZXR1cm4gdHJ1ZSBpZiB2YWwgY2Fu IGJlIGVuY29kZWQgYXMgYSAxMi1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdpdGgKICAgYSBsZWZ0 IHNoaWZ0IG9mIDAgb3IgMTIgYml0cy4gICovCmJvb2wKYWFyY2g2NF91aW1tMTJfc2hpZnQgKHVu c2lnbmVkIEhPU1RfV0lERV9JTlQgdmFsKQp7CiAgcmV0dXJuIHZhbCA8IDQwOTYgfHwgKHZhbCAm IDB4ZmZmMDAwKSA9PSB2YWw7Cn0KCi8qIFJldHVybnMgdGhlIG5lYXJlc3QgdmFsdWUgdG8gVkFM IHRoYXQgd2lsbCBmaXQgYXMgYSAxMi1iaXQgdW5zaWduZWQgaW1tZWRpYXRlCiAgIHRoYXQgY2Fu IGJlIGNyZWF0ZWQgd2l0aCBhIGxlZnQgc2hpZnQgb2YgMCBvciAxMi4gICovCnN0YXRpYyBIT1NU X1dJREVfSU5UCmFhcmNoNjRfY2xhbXBfdG9fdWltbTEyX3NoaWZ0ICh1bnNpZ25lZCBIT1NUX1dJ REVfSU5UIHZhbCkKewogIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgZml0cyBpbiAyNCBi aXRzLCBhcyB0aGF0IGlzIHRoZSBtYXhpbXVtIHdlIGNhbgogICAgIGhhbmRsZSBjb3JyZWN0bHku ICAqLwogIGdjY19hc3NlcnQgKHZhbCA8IDB4MTAwMDAwMCk7CgogIGlmICh2YWwgPCA0MDk2KQog ICAgcmV0dXJuIHZhbDsKCiAgcmV0dXJuIHZhbCAmIDB4ZmZmMDAwOwp9CgoKLyogVGVzdCB3aGV0 aGVyOgoKICAgICBYID0gKFggJiBBTkRfVkFMKSB8IElPUl9WQUw7CgogICBjYW4gYmUgaW1wbGVt ZW50ZWQgdXNpbmc6CgogICAgIE1PVksgWCwgIyhJT1JfVkFMID4+IHNoaWZ0KSwgTFNMICNzaGlm dAoKICAgUmV0dXJuIHRoZSBzaGlmdCBpZiBzbywgb3RoZXJ3aXNlIHJldHVybiAtMS4gICovCmlu dAphYXJjaDY0X21vdmtfc2hpZnQgKGNvbnN0IHdpZGVfaW50X3JlZiAmYW5kX3ZhbCwKCQkgICAg Y29uc3Qgd2lkZV9pbnRfcmVmICZpb3JfdmFsKQp7CiAgdW5zaWduZWQgaW50IHByZWNpc2lvbiA9 IGFuZF92YWwuZ2V0X3ByZWNpc2lvbiAoKTsKICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIG1hc2sg PSAweGZmZmY7CiAgZm9yICh1bnNpZ25lZCBpbnQgc2hpZnQgPSAwOyBzaGlmdCA8IHByZWNpc2lv bjsgc2hpZnQgKz0gMTYpCiAgICB7CiAgICAgIGlmIChhbmRfdmFsID09IH5tYXNrICYmIChpb3Jf dmFsICYgbWFzaykgPT0gaW9yX3ZhbCkKCXJldHVybiBzaGlmdDsKICAgICAgbWFzayA8PD0gMTY7 CiAgICB9CiAgcmV0dXJuIC0xOwp9CgovKiBDcmVhdGUgbWFzayBvZiBvbmVzLCBjb3ZlcmluZyB0 aGUgbG93ZXN0IHRvIGhpZ2hlc3QgYml0cyBzZXQgaW4gVkFMX0lOLgogICBBc3N1bWVkIHByZWNv bmRpdGlvbjogVkFMX0lOIElzIG5vdCB6ZXJvLiAgKi8KCnVuc2lnbmVkIEhPU1RfV0lERV9JTlQK YWFyY2g2NF9hbmRfc3BsaXRfaW1tMSAoSE9TVF9XSURFX0lOVCB2YWxfaW4pCnsKICBpbnQgbG93 ZXN0X2JpdF9zZXQgPSBjdHpfaHdpICh2YWxfaW4pOwogIGludCBoaWdoZXN0X2JpdF9zZXQgPSBm bG9vcl9sb2cyICh2YWxfaW4pOwogIGdjY19hc3NlcnQgKHZhbF9pbiAhPSAwKTsKCiAgcmV0dXJu ICgoSE9TVF9XSURFX0lOVF9VQyAoMikgPDwgaGlnaGVzdF9iaXRfc2V0KSAtCgkgIChIT1NUX1dJ REVfSU5UXzFVIDw8IGxvd2VzdF9iaXRfc2V0KSk7Cn0KCi8qIENyZWF0ZSBjb25zdGFudCB3aGVy ZSBiaXRzIG91dHNpZGUgb2YgbG93ZXN0IGJpdCBzZXQgdG8gaGlnaGVzdCBiaXQgc2V0CiAgIGFy ZSBzZXQgdG8gMS4gICovCgp1bnNpZ25lZCBIT1NUX1dJREVfSU5UCmFhcmNoNjRfYW5kX3NwbGl0 X2ltbTIgKEhPU1RfV0lERV9JTlQgdmFsX2luKQp7CiAgcmV0dXJuIHZhbF9pbiB8IH5hYXJjaDY0 X2FuZF9zcGxpdF9pbW0xICh2YWxfaW4pOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBWQUxfSU4gaXMg YSB2YWxpZCAnYW5kJyBiaXRtYXNrIGltbWVkaWF0ZS4gICovCgpib29sCmFhcmNoNjRfYW5kX2Jp dG1hc2tfaW1tICh1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHZhbF9pbiwgbWFjaGluZV9tb2RlIG1v ZGUpCnsKICBzY2FsYXJfaW50X21vZGUgaW50X21vZGU7CiAgaWYgKCFpc19hIDxzY2FsYXJfaW50 X21vZGU+IChtb2RlLCAmaW50X21vZGUpKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoYWFyY2g2 NF9iaXRtYXNrX2ltbSAodmFsX2luLCBpbnRfbW9kZSkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlm IChhYXJjaDY0X21vdmVfaW1tICh2YWxfaW4sIGludF9tb2RlKSkKICAgIHJldHVybiBmYWxzZTsK CiAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBpbW0yID0gYWFyY2g2NF9hbmRfc3BsaXRfaW1tMiAo dmFsX2luKTsKCiAgcmV0dXJuIGFhcmNoNjRfYml0bWFza19pbW0gKGltbTIsIGludF9tb2RlKTsK fQoKLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVtcG9yYXJ5IHJlZ2lzdGVycyB0aGF0IGFhcmNo NjRfYWRkX29mZnNldF8xCiAgIHdvdWxkIG5lZWQgdG8gYWRkIE9GRlNFVCB0byBhIHJlZ2lzdGVy LiAgKi8KCnN0YXRpYyB1bnNpZ25lZCBpbnQKYWFyY2g2NF9hZGRfb2Zmc2V0XzFfdGVtcG9yYXJp ZXMgKEhPU1RfV0lERV9JTlQgb2Zmc2V0KQp7CiAgcmV0dXJuIGFic3VfaHdpIChvZmZzZXQpIDwg MHgxMDAwMDAwID8gMCA6IDE7Cn0KCi8qIEEgc3Vicm91dGluZSBvZiBhYXJjaDY0X2FkZF9vZmZz ZXQuICBTZXQgREVTVCB0byBTUkMgKyBPRkZTRVQgZm9yCiAgIGEgbm9uLXBvbHlub21pYWwgT0ZG U0VULiAgTU9ERSBpcyB0aGUgbW9kZSBvZiB0aGUgYWRkaXRpb24uCiAgIEZSQU1FX1JFTEFURURf UCBpcyB0cnVlIGlmIHRoZSBSVFhfRlJBTUVfUkVMQVRFRCBmbGFnIHNob3VsZAogICBiZSBzZXQg YW5kIENGQSBhZGp1c3RtZW50cyBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIGluc3RydWN0aW9ucy4K CiAgIFRFTVAxLCBpZiBub25udWxsLCBpcyBhIHJlZ2lzdGVyIG9mIG1vZGUgTU9ERSB0aGF0IGNh biBiZSB1c2VkIGFzIGEKICAgdGVtcG9yYXJ5IGlmIHJlZ2lzdGVyIGFsbG9jYXRpb24gaXMgYWxy ZWFkeSBjb21wbGV0ZS4gIFRoaXMgdGVtcG9yYXJ5CiAgIHJlZ2lzdGVyIG1heSBvdmVybGFwIERF U1QgYnV0IG11c3Qgbm90IG92ZXJsYXAgU1JDLiAgSWYgVEVNUDEgaXMga25vd24KICAgdG8gaG9s ZCBhYnMgKE9GRlNFVCksIEVNSVRfTU9WRV9JTU0gY2FuIGJlIHNldCB0byBmYWxzZSB0byBhdm9p ZCBlbWl0dGluZwogICB0aGUgaW1tZWRpYXRlIGFnYWluLgoKICAgU2luY2UgdGhpcyBmdW5jdGlv biBtYXkgYmUgdXNlZCB0byBhZGp1c3QgdGhlIHN0YWNrIHBvaW50ZXIsIHdlIG11c3QKICAgZW5z dXJlIHRoYXQgaXQgY2Fubm90IGNhdXNlIHRyYW5zaWVudCBzdGFjayBkZWFsbG9jYXRpb24gKGZv ciBleGFtcGxlCiAgIGJ5IGZpcnN0IGluY3JlbWVudGluZyBTUCBhbmQgdGhlbiBkZWNyZW1lbnRp bmcgd2hlbiBhZGp1c3RpbmcgYnkgYQogICBsYXJnZSBpbW1lZGlhdGUpLiAgKi8KCnN0YXRpYyB2 b2lkCmFhcmNoNjRfYWRkX29mZnNldF8xIChzY2FsYXJfaW50X21vZGUgbW9kZSwgcnR4IGRlc3Qs CgkJICAgICAgcnR4IHNyYywgSE9TVF9XSURFX0lOVCBvZmZzZXQsIHJ0eCB0ZW1wMSwKCQkgICAg ICBib29sIGZyYW1lX3JlbGF0ZWRfcCwgYm9vbCBlbWl0X21vdmVfaW1tKQp7CiAgZ2NjX2Fzc2Vy dCAoZW1pdF9tb3ZlX2ltbSB8fCB0ZW1wMSAhPSBOVUxMX1JUWCk7CiAgZ2NjX2Fzc2VydCAodGVt cDEgPT0gTlVMTF9SVFggfHwgIXJlZ19vdmVybGFwX21lbnRpb25lZF9wICh0ZW1wMSwgc3JjKSk7 CgogIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbW9mZnNldCA9IGFic3VfaHdpIChvZmZzZXQpOwog IHJ0eF9pbnNuICppbnNuOwoKICBpZiAoIW1vZmZzZXQpCiAgICB7CiAgICAgIGlmICghcnR4X2Vx dWFsX3AgKGRlc3QsIHNyYykpCgl7CgkgIGluc24gPSBlbWl0X2luc24gKGdlbl9ydHhfU0VUIChk ZXN0LCBzcmMpKTsKCSAgUlRYX0ZSQU1FX1JFTEFURURfUCAoaW5zbikgPSBmcmFtZV9yZWxhdGVk X3A7Cgl9CiAgICAgIHJldHVybjsKICAgIH0KCiAgLyogU2luZ2xlIGluc3RydWN0aW9uIGFkanVz dG1lbnQuICAqLwogIGlmIChhYXJjaDY0X3VpbW0xMl9zaGlmdCAobW9mZnNldCkpCiAgICB7CiAg ICAgIGluc24gPSBlbWl0X2luc24gKGdlbl9hZGQzX2luc24gKGRlc3QsIHNyYywgR0VOX0lOVCAo b2Zmc2V0KSkpOwogICAgICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSA9IGZyYW1lX3JlbGF0 ZWRfcDsKICAgICAgcmV0dXJuOwogICAgfQoKICAvKiBFbWl0IDIgYWRkaXRpb25zL3N1YnRyYWN0 aW9ucyBpZiB0aGUgYWRqdXN0bWVudCBpcyBsZXNzIHRoYW4gMjQgYml0cwogICAgIGFuZCBlaXRo ZXI6CgogICAgIGEpIHRoZSBvZmZzZXQgY2Fubm90IGJlIGxvYWRlZCBieSBhIDE2LWJpdCBtb3Zl IG9yCiAgICAgYikgdGhlcmUgaXMgbm8gc3BhcmUgcmVnaXN0ZXIgaW50byB3aGljaCB3ZSBjYW4g bW92ZSBpdC4gICovCiAgaWYgKG1vZmZzZXQgPCAweDEwMDAwMDAKICAgICAgJiYgKCghdGVtcDEg JiYgIWNhbl9jcmVhdGVfcHNldWRvX3AgKCkpCgkgIHx8ICFhYXJjaDY0X21vdmVfaW1tIChtb2Zm c2V0LCBtb2RlKSkpCiAgICB7CiAgICAgIEhPU1RfV0lERV9JTlQgbG93X29mZiA9IG1vZmZzZXQg JiAweGZmZjsKCiAgICAgIGxvd19vZmYgPSBvZmZzZXQgPCAwID8gLWxvd19vZmYgOiBsb3dfb2Zm OwogICAgICBpbnNuID0gZW1pdF9pbnNuIChnZW5fYWRkM19pbnNuIChkZXN0LCBzcmMsIEdFTl9J TlQgKGxvd19vZmYpKSk7CiAgICAgIFJUWF9GUkFNRV9SRUxBVEVEX1AgKGluc24pID0gZnJhbWVf cmVsYXRlZF9wOwogICAgICBpbnNuID0gZW1pdF9pbnNuIChnZW5fYWRkMl9pbnNuIChkZXN0LCBH RU5fSU5UIChvZmZzZXQgLSBsb3dfb2ZmKSkpOwogICAgICBSVFhfRlJBTUVfUkVMQVRFRF9QIChp bnNuKSA9IGZyYW1lX3JlbGF0ZWRfcDsKICAgICAgcmV0dXJuOwogICAgfQoKICAvKiBFbWl0IGEg bW92ZSBpbW1lZGlhdGUgaWYgcmVxdWlyZWQgYW5kIGFuIGFkZGl0aW9uL3N1YnRyYWN0aW9uLiAg Ki8KICBpZiAoZW1pdF9tb3ZlX2ltbSkKICAgIHsKICAgICAgZ2NjX2Fzc2VydCAodGVtcDEgIT0g TlVMTF9SVFggfHwgY2FuX2NyZWF0ZV9wc2V1ZG9fcCAoKSk7CiAgICAgIHRlbXAxID0gYWFyY2g2 NF9mb3JjZV90ZW1wb3JhcnkgKG1vZGUsIHRlbXAxLAoJCQkJICAgICAgIGdlbl9pbnRfbW9kZSAo bW9mZnNldCwgbW9kZSkpOwogICAgfQogIGluc24gPSBlbWl0X2luc24gKG9mZnNldCA8IDAKCQkg ICAgPyBnZW5fc3ViM19pbnNuIChkZXN0LCBzcmMsIHRlbXAxKQoJCSAgICA6IGdlbl9hZGQzX2lu c24gKGRlc3QsIHNyYywgdGVtcDEpKTsKICBpZiAoZnJhbWVfcmVsYXRlZF9wKQogICAgewogICAg ICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSA9IGZyYW1lX3JlbGF0ZWRfcDsKICAgICAgcnR4 IGFkaiA9IHBsdXNfY29uc3RhbnQgKG1vZGUsIHNyYywgb2Zmc2V0KTsKICAgICAgYWRkX3JlZ19u b3RlIChpbnNuLCBSRUdfQ0ZBX0FESlVTVF9DRkEsIGdlbl9ydHhfU0VUIChkZXN0LCBhZGopKTsK ICAgIH0KfQoKLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVtcG9yYXJ5IHJlZ2lzdGVycyB0aGF0 IGFhcmNoNjRfYWRkX29mZnNldAogICB3b3VsZCBuZWVkIHRvIG1vdmUgT0ZGU0VUIGludG8gYSBy ZWdpc3RlciBvciBhZGQgT0ZGU0VUIHRvIGEgcmVnaXN0ZXI7CiAgIEFERF9QIGlzIHRydWUgaWYg d2Ugd2FudCB0aGUgbGF0dGVyIHJhdGhlciB0aGFuIHRoZSBmb3JtZXIuICAqLwoKc3RhdGljIHVu c2lnbmVkIGludAphYXJjaDY0X29mZnNldF90ZW1wb3JhcmllcyAoYm9vbCBhZGRfcCwgcG9seV9p bnQ2NCBvZmZzZXQpCnsKICAvKiBUaGlzIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGFh cmNoNjRfYWRkX29mZnNldC4gICovCiAgaWYgKGFkZF9wICYmIGFhcmNoNjRfc3ZlX2FkZHZsX2Fk ZHBsX2ltbWVkaWF0ZV9wIChvZmZzZXQpKQogICAgcmV0dXJuIDA7CgogIHVuc2lnbmVkIGludCBj b3VudCA9IDA7CiAgSE9TVF9XSURFX0lOVCBmYWN0b3IgPSBvZmZzZXQuY29lZmZzWzFdOwogIEhP U1RfV0lERV9JTlQgY29uc3RhbnQgPSBvZmZzZXQuY29lZmZzWzBdIC0gZmFjdG9yOwogIHBvbHlf aW50NjQgcG9seV9vZmZzZXQgKGZhY3RvciwgZmFjdG9yKTsKICBpZiAoYWRkX3AgJiYgYWFyY2g2 NF9zdmVfYWRkdmxfYWRkcGxfaW1tZWRpYXRlX3AgKHBvbHlfb2Zmc2V0KSkKICAgIC8qIE5lZWQg b25lIHJlZ2lzdGVyIGZvciB0aGUgQUREVkwvQUREUEwgcmVzdWx0LiAgKi8KICAgIGNvdW50ICs9 IDE7CiAgZWxzZSBpZiAoZmFjdG9yICE9IDApCiAgICB7CiAgICAgIGZhY3RvciA9IGFicyAoZmFj dG9yKTsKICAgICAgaWYgKGZhY3RvciA+IDE2ICogKGZhY3RvciAmIC1mYWN0b3IpKQoJLyogTmVl ZCBvbmUgcmVnaXN0ZXIgZm9yIHRoZSBDTlQgcmVzdWx0IGFuZCBvbmUgZm9yIHRoZSBtdWx0aXBs aWNhdGlvbgoJICAgZmFjdG9yLiAgSWYgbmVjZXNzYXJ5LCB0aGUgc2Vjb25kIHRlbXBvcmFyeSBj YW4gYmUgcmV1c2VkIGZvciB0aGUKCSAgIGNvbnN0YW50IHBhcnQgb2YgdGhlIG9mZnNldC4gICov CglyZXR1cm4gMjsKICAgICAgLyogTmVlZCBvbmUgcmVnaXN0ZXIgZm9yIHRoZSBDTlQgcmVzdWx0 ICh3aGljaCBtaWdodCB0aGVuCgkgYmUgc2hpZnRlZCkuICAqLwogICAgICBjb3VudCArPSAxOwog ICAgfQogIHJldHVybiBjb3VudCArIGFhcmNoNjRfYWRkX29mZnNldF8xX3RlbXBvcmFyaWVzIChj b25zdGFudCk7Cn0KCi8qIElmIFggY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgcG9seV9pbnQ2NCwg cmV0dXJuIHRoZSBudW1iZXIKICAgb2YgdGVtcG9yYXJpZXMgdGhhdCBhcmUgcmVxdWlyZWQgdG8g YWRkIGl0IHRvIGEgcmVnaXN0ZXIuCiAgIFJldHVybiAtMSBvdGhlcndpc2UuICAqLwoKaW50CmFh cmNoNjRfYWRkX29mZnNldF90ZW1wb3JhcmllcyAocnR4IHgpCnsKICBwb2x5X2ludDY0IG9mZnNl dDsKICBpZiAoIXBvbHlfaW50X3J0eF9wICh4LCAmb2Zmc2V0KSkKICAgIHJldHVybiAtMTsKICBy ZXR1cm4gYWFyY2g2NF9vZmZzZXRfdGVtcG9yYXJpZXMgKHRydWUsIG9mZnNldCk7Cn0KCi8qIFNl dCBERVNUIHRvIFNSQyArIE9GRlNFVC4gIE1PREUgaXMgdGhlIG1vZGUgb2YgdGhlIGFkZGl0aW9u LgogICBGUkFNRV9SRUxBVEVEX1AgaXMgdHJ1ZSBpZiB0aGUgUlRYX0ZSQU1FX1JFTEFURUQgZmxh ZyBzaG91bGQKICAgYmUgc2V0IGFuZCBDRkEgYWRqdXN0bWVudHMgYWRkZWQgdG8gdGhlIGdlbmVy YXRlZCBpbnN0cnVjdGlvbnMuCgogICBURU1QMSwgaWYgbm9ubnVsbCwgaXMgYSByZWdpc3RlciBv ZiBtb2RlIE1PREUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhCiAgIHRlbXBvcmFyeSBpZiByZWdpc3Rl ciBhbGxvY2F0aW9uIGlzIGFscmVhZHkgY29tcGxldGUuICBUaGlzIHRlbXBvcmFyeQogICByZWdp c3RlciBtYXkgb3ZlcmxhcCBERVNUIGlmICFGUkFNRV9SRUxBVEVEX1AgYnV0IG11c3Qgbm90IG92 ZXJsYXAgU1JDLgogICBJZiBURU1QMSBpcyBrbm93biB0byBob2xkIGFicyAoT0ZGU0VUKSwgRU1J VF9NT1ZFX0lNTSBjYW4gYmUgc2V0IHRvCiAgIGZhbHNlIHRvIGF2b2lkIGVtaXR0aW5nIHRoZSBp bW1lZGlhdGUgYWdhaW4uCgogICBURU1QMiwgaWYgbm9ubnVsbCwgaXMgYSBzZWNvbmQgdGVtcG9y YXJ5IHJlZ2lzdGVyIHRoYXQgZG9lc24ndAogICBvdmVybGFwIGVpdGhlciBERVNUIG9yIFJFRy4K CiAgIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gYWRqdXN0IHRoZSBzdGFjayBw b2ludGVyLCB3ZSBtdXN0CiAgIGVuc3VyZSB0aGF0IGl0IGNhbm5vdCBjYXVzZSB0cmFuc2llbnQg c3RhY2sgZGVhbGxvY2F0aW9uIChmb3IgZXhhbXBsZQogICBieSBmaXJzdCBpbmNyZW1lbnRpbmcg U1AgYW5kIHRoZW4gZGVjcmVtZW50aW5nIHdoZW4gYWRqdXN0aW5nIGJ5IGEKICAgbGFyZ2UgaW1t ZWRpYXRlKS4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X2FkZF9vZmZzZXQgKHNjYWxhcl9pbnRf bW9kZSBtb2RlLCBydHggZGVzdCwgcnR4IHNyYywKCQkgICAgcG9seV9pbnQ2NCBvZmZzZXQsIHJ0 eCB0ZW1wMSwgcnR4IHRlbXAyLAoJCSAgICBib29sIGZyYW1lX3JlbGF0ZWRfcCwgYm9vbCBlbWl0 X21vdmVfaW1tID0gdHJ1ZSkKewogIGdjY19hc3NlcnQgKGVtaXRfbW92ZV9pbW0gfHwgdGVtcDEg IT0gTlVMTF9SVFgpOwogIGdjY19hc3NlcnQgKHRlbXAxID09IE5VTExfUlRYIHx8ICFyZWdfb3Zl cmxhcF9tZW50aW9uZWRfcCAodGVtcDEsIHNyYykpOwogIGdjY19hc3NlcnQgKHRlbXAxID09IE5V TExfUlRYCgkgICAgICB8fCAhZnJhbWVfcmVsYXRlZF9wCgkgICAgICB8fCAhcmVnX292ZXJsYXBf bWVudGlvbmVkX3AgKHRlbXAxLCBkZXN0KSk7CiAgZ2NjX2Fzc2VydCAodGVtcDIgPT0gTlVMTF9S VFggfHwgIXJlZ19vdmVybGFwX21lbnRpb25lZF9wIChkZXN0LCB0ZW1wMikpOwoKICAvKiBUcnkg dXNpbmcgQUREVkwgb3IgQUREUEwgdG8gYWRkIHRoZSB3aG9sZSB2YWx1ZS4gICovCiAgaWYgKHNy YyAhPSBjb25zdDBfcnR4ICYmIGFhcmNoNjRfc3ZlX2FkZHZsX2FkZHBsX2ltbWVkaWF0ZV9wIChv ZmZzZXQpKQogICAgewogICAgICBydHggb2Zmc2V0X3J0eCA9IGdlbl9pbnRfbW9kZSAob2Zmc2V0 LCBtb2RlKTsKICAgICAgcnR4X2luc24gKmluc24gPSBlbWl0X2luc24gKGdlbl9hZGQzX2luc24g KGRlc3QsIHNyYywgb2Zmc2V0X3J0eCkpOwogICAgICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNu KSA9IGZyYW1lX3JlbGF0ZWRfcDsKICAgICAgcmV0dXJuOwogICAgfQoKICAvKiBDb2VmZmljaWVu dCAxIGlzIG11bHRpcGxpZWQgYnkgdGhlIG51bWJlciBvZiAxMjgtYml0IGJsb2NrcyBpbiBhbgog ICAgIFNWRSB2ZWN0b3IgcmVnaXN0ZXIsIG92ZXIgYW5kIGFib3ZlIHRoZSBtaW5pbXVtIHNpemUg b2YgMTI4IGJpdHMuCiAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGhhbGYgdGhlIHZhbHVlIHJl dHVybmVkIGJ5IENOVEQgd2l0aCBhCiAgICAgdmVjdG9yIHNoYXBlIG9mIEFMTC4gICovCiAgSE9T VF9XSURFX0lOVCBmYWN0b3IgPSBvZmZzZXQuY29lZmZzWzFdOwogIEhPU1RfV0lERV9JTlQgY29u c3RhbnQgPSBvZmZzZXQuY29lZmZzWzBdIC0gZmFjdG9yOwoKICAvKiBUcnkgdXNpbmcgQUREVkwg b3IgQUREUEwgdG8gYWRkIHRoZSBWRy1iYXNlZCBwYXJ0LiAgKi8KICBwb2x5X2ludDY0IHBvbHlf b2Zmc2V0IChmYWN0b3IsIGZhY3Rvcik7CiAgaWYgKHNyYyAhPSBjb25zdDBfcnR4CiAgICAgICYm IGFhcmNoNjRfc3ZlX2FkZHZsX2FkZHBsX2ltbWVkaWF0ZV9wIChwb2x5X29mZnNldCkpCiAgICB7 CiAgICAgIHJ0eCBvZmZzZXRfcnR4ID0gZ2VuX2ludF9tb2RlIChwb2x5X29mZnNldCwgbW9kZSk7 CiAgICAgIGlmIChmcmFtZV9yZWxhdGVkX3ApCgl7CgkgIHJ0eF9pbnNuICppbnNuID0gZW1pdF9p bnNuIChnZW5fYWRkM19pbnNuIChkZXN0LCBzcmMsIG9mZnNldF9ydHgpKTsKCSAgUlRYX0ZSQU1F X1JFTEFURURfUCAoaW5zbikgPSB0cnVlOwoJICBzcmMgPSBkZXN0OwoJfQogICAgICBlbHNlCgl7 CgkgIHJ0eCBhZGRyID0gZ2VuX3J0eF9QTFVTIChtb2RlLCBzcmMsIG9mZnNldF9ydHgpOwoJICBz cmMgPSBhYXJjaDY0X2ZvcmNlX3RlbXBvcmFyeSAobW9kZSwgdGVtcDEsIGFkZHIpOwoJICB0ZW1w MSA9IHRlbXAyOwoJICB0ZW1wMiA9IE5VTExfUlRYOwoJfQogICAgfQogIC8qIE90aGVyd2lzZSB1 c2UgYSBDTlQtYmFzZWQgc2VxdWVuY2UuICAqLwogIGVsc2UgaWYgKGZhY3RvciAhPSAwKQogICAg ewogICAgICAvKiBVc2UgYSBzdWJ0cmFjdGlvbiBpZiB3ZSBoYXZlIGEgbmVnYXRpdmUgZmFjdG9y LiAgKi8KICAgICAgcnR4X2NvZGUgY29kZSA9IFBMVVM7CiAgICAgIGlmIChmYWN0b3IgPCAwKQoJ ewoJICBmYWN0b3IgPSAtZmFjdG9yOwoJICBjb2RlID0gTUlOVVM7Cgl9CgogICAgICAvKiBDYWxj dWxhdGUgQ05URCAqIEZBQ1RPUiAvIDIuICBGaXJzdCB0cnkgdG8gZm9sZCB0aGUgZGl2aXNpb24K CSBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbi4gICovCiAgICAgIHJ0eCB2YWw7CiAgICAgIGludCBz aGlmdCA9IDA7CiAgICAgIGlmIChmYWN0b3IgJiAxKQoJLyogVXNlIGEgcmlnaHQgc2hpZnQgYnkg MS4gICovCglzaGlmdCA9IC0xOwogICAgICBlbHNlCglmYWN0b3IgLz0gMjsKICAgICAgSE9TVF9X SURFX0lOVCBsb3dfYml0ID0gZmFjdG9yICYgLWZhY3RvcjsKICAgICAgaWYgKGZhY3RvciA8PSAx NiAqIGxvd19iaXQpCgl7CgkgIGlmIChmYWN0b3IgPiAxNiAqIDgpCgkgICAgewoJICAgICAgLyog IkNOVEIgWG4sIEFMTCwgTVVMICNGQUNUT1IiIGlzIG91dCBvZiByYW5nZSwgc28gY2FsY3VsYXRl CgkJIHRoZSB2YWx1ZSB3aXRoIHRoZSBtaW5pbXVtIG11bHRpcGxpZXIgYW5kIHNoaWZ0IGl0IGlu dG8KCQkgcG9zaXRpb24uICAqLwoJICAgICAgaW50IGV4dHJhX3NoaWZ0ID0gZXhhY3RfbG9nMiAo bG93X2JpdCk7CgkgICAgICBzaGlmdCArPSBleHRyYV9zaGlmdDsKCSAgICAgIGZhY3RvciA+Pj0g ZXh0cmFfc2hpZnQ7CgkgICAgfQoJICB2YWwgPSBnZW5faW50X21vZGUgKHBvbHlfaW50NjQgKGZh Y3RvciAqIDIsIGZhY3RvciAqIDIpLCBtb2RlKTsKCX0KICAgICAgZWxzZQoJewoJICAvKiBCYXNl IHRoZSBmYWN0b3Igb24gTE9XX0JJVCBpZiB3ZSBjYW4gY2FsY3VsYXRlIExPV19CSVQKCSAgICAg ZGlyZWN0bHksIHNpbmNlIHRoYXQgc2hvdWxkIGluY3JlYXNlIHRoZSBjaGFuY2VzIG9mIGJlaW5n CgkgICAgIGFibGUgdG8gdXNlIGEgc2hpZnQgYW5kIGFkZCBzZXF1ZW5jZS4gIElmIExPV19CSVQg aXRzZWxmCgkgICAgIGlzIG91dCBvZiByYW5nZSwganVzdCB1c2UgQ05URC4gICovCgkgIGlmIChs b3dfYml0IDw9IDE2ICogOCkKCSAgICBmYWN0b3IgLz0gbG93X2JpdDsKCSAgZWxzZQoJICAgIGxv d19iaXQgPSAxOwoKCSAgdmFsID0gZ2VuX2ludF9tb2RlIChwb2x5X2ludDY0IChsb3dfYml0ICog MiwgbG93X2JpdCAqIDIpLCBtb2RlKTsKCSAgdmFsID0gYWFyY2g2NF9mb3JjZV90ZW1wb3Jhcnkg KG1vZGUsIHRlbXAxLCB2YWwpOwoKCSAgaWYgKGNhbl9jcmVhdGVfcHNldWRvX3AgKCkpCgkgICAg ewoJICAgICAgcnR4IGNvZWZmMSA9IGdlbl9pbnRfbW9kZSAoZmFjdG9yLCBtb2RlKTsKCSAgICAg IHZhbCA9IGV4cGFuZF9tdWx0IChtb2RlLCB2YWwsIGNvZWZmMSwgTlVMTF9SVFgsIHRydWUsIHRy dWUpOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIC8qIEdvIGJhY2sgdG8gdXNpbmcgYSBu ZWdhdGl2ZSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgaWYgd2UgaGF2ZQoJCSBubyByZWdpc3RlciBm cm9tIHdoaWNoIHRvIHN1YnRyYWN0LiAgKi8KCSAgICAgIGlmIChjb2RlID09IE1JTlVTICYmIHNy YyA9PSBjb25zdDBfcnR4KQoJCXsKCQkgIGZhY3RvciA9IC1mYWN0b3I7CgkJICBjb2RlID0gUExV UzsKCQl9CgkgICAgICBydHggY29lZmYxID0gZ2VuX2ludF9tb2RlIChmYWN0b3IsIG1vZGUpOwoJ ICAgICAgY29lZmYxID0gYWFyY2g2NF9mb3JjZV90ZW1wb3JhcnkgKG1vZGUsIHRlbXAyLCBjb2Vm ZjEpOwoJICAgICAgdmFsID0gZ2VuX3J0eF9NVUxUIChtb2RlLCB2YWwsIGNvZWZmMSk7CgkgICAg fQoJfQoKICAgICAgaWYgKHNoaWZ0ID4gMCkKCXsKCSAgLyogTXVsdGlwbHkgYnkgMSA8PCBTSElG VC4gICovCgkgIHZhbCA9IGFhcmNoNjRfZm9yY2VfdGVtcG9yYXJ5IChtb2RlLCB0ZW1wMSwgdmFs KTsKCSAgdmFsID0gZ2VuX3J0eF9BU0hJRlQgKG1vZGUsIHZhbCwgR0VOX0lOVCAoc2hpZnQpKTsK CX0KICAgICAgZWxzZSBpZiAoc2hpZnQgPT0gLTEpCgl7CgkgIC8qIERpdmlkZSBieSAyLiAgKi8K CSAgdmFsID0gYWFyY2g2NF9mb3JjZV90ZW1wb3JhcnkgKG1vZGUsIHRlbXAxLCB2YWwpOwoJICB2 YWwgPSBnZW5fcnR4X0FTSElGVFJUIChtb2RlLCB2YWwsIGNvbnN0MV9ydHgpOwoJfQoKICAgICAg LyogQ2FsY3VsYXRlIFNSQyArLy0gQ05URCAqIEZBQ1RPUiAvIDIuICAqLwogICAgICBpZiAoc3Jj ICE9IGNvbnN0MF9ydHgpCgl7CgkgIHZhbCA9IGFhcmNoNjRfZm9yY2VfdGVtcG9yYXJ5IChtb2Rl LCB0ZW1wMSwgdmFsKTsKCSAgdmFsID0gZ2VuX3J0eF9mbXRfZWUgKGNvZGUsIG1vZGUsIHNyYywg dmFsKTsKCX0KICAgICAgZWxzZSBpZiAoY29kZSA9PSBNSU5VUykKCXsKCSAgdmFsID0gYWFyY2g2 NF9mb3JjZV90ZW1wb3JhcnkgKG1vZGUsIHRlbXAxLCB2YWwpOwoJICB2YWwgPSBnZW5fcnR4X05F RyAobW9kZSwgdmFsKTsKCX0KCiAgICAgIGlmIChjb25zdGFudCA9PSAwIHx8IGZyYW1lX3JlbGF0 ZWRfcCkKCXsKCSAgcnR4X2luc24gKmluc24gPSBlbWl0X2luc24gKGdlbl9ydHhfU0VUIChkZXN0 LCB2YWwpKTsKCSAgaWYgKGZyYW1lX3JlbGF0ZWRfcCkKCSAgICB7CgkgICAgICBSVFhfRlJBTUVf UkVMQVRFRF9QIChpbnNuKSA9IHRydWU7CgkgICAgICBhZGRfcmVnX25vdGUgKGluc24sIFJFR19D RkFfQURKVVNUX0NGQSwKCQkJICAgIGdlbl9ydHhfU0VUIChkZXN0LCBwbHVzX2NvbnN0YW50IChQ bW9kZSwgc3JjLAoJCQkJCQkJICAgICAgcG9seV9vZmZzZXQpKSk7CgkgICAgfQoJICBzcmMgPSBk ZXN0OwoJICBpZiAoY29uc3RhbnQgPT0gMCkKCSAgICByZXR1cm47Cgl9CiAgICAgIGVsc2UKCXsK CSAgc3JjID0gYWFyY2g2NF9mb3JjZV90ZW1wb3JhcnkgKG1vZGUsIHRlbXAxLCB2YWwpOwoJICB0 ZW1wMSA9IHRlbXAyOwoJICB0ZW1wMiA9IE5VTExfUlRYOwoJfQoKICAgICAgZW1pdF9tb3ZlX2lt bSA9IHRydWU7CiAgICB9CgogIGFhcmNoNjRfYWRkX29mZnNldF8xIChtb2RlLCBkZXN0LCBzcmMs IGNvbnN0YW50LCB0ZW1wMSwKCQkJZnJhbWVfcmVsYXRlZF9wLCBlbWl0X21vdmVfaW1tKTsKfQoK LyogTGlrZSBhYXJjaDY0X2FkZF9vZmZzZXQsIGJ1dCB0aGUgb2Zmc2V0IGlzIGdpdmVuIGFzIGFu IHJ0eCByYXRoZXIKICAgdGhhbiBhIHBvbHlfaW50NjQuICAqLwoKdm9pZAphYXJjaDY0X3NwbGl0 X2FkZF9vZmZzZXQgKHNjYWxhcl9pbnRfbW9kZSBtb2RlLCBydHggZGVzdCwgcnR4IHNyYywKCQkJ ICBydHggb2Zmc2V0X3J0eCwgcnR4IHRlbXAxLCBydHggdGVtcDIpCnsKICBhYXJjaDY0X2FkZF9v ZmZzZXQgKG1vZGUsIGRlc3QsIHNyYywgcnR4X3RvX3BvbHlfaW50NjQgKG9mZnNldF9ydHgpLAoJ CSAgICAgIHRlbXAxLCB0ZW1wMiwgZmFsc2UpOwp9CgovKiBBZGQgREVMVEEgdG8gdGhlIHN0YWNr IHBvaW50ZXIsIG1hcmtpbmcgdGhlIGluc3RydWN0aW9ucyBmcmFtZS1yZWxhdGVkLgogICBURU1Q MSBpcyBhdmFpbGFibGUgYXMgYSB0ZW1wb3JhcnkgaWYgbm9ubnVsbC4gIEVNSVRfTU9WRV9JTU0g aXMgZmFsc2UKICAgaWYgVEVNUDEgYWxyZWFkeSBjb250YWlucyBhYnMgKERFTFRBKS4gICovCgpz dGF0aWMgaW5saW5lIHZvaWQKYWFyY2g2NF9hZGRfc3AgKHJ0eCB0ZW1wMSwgcnR4IHRlbXAyLCBw b2x5X2ludDY0IGRlbHRhLCBib29sIGVtaXRfbW92ZV9pbW0pCnsKICBhYXJjaDY0X2FkZF9vZmZz ZXQgKFBtb2RlLCBzdGFja19wb2ludGVyX3J0eCwgc3RhY2tfcG9pbnRlcl9ydHgsIGRlbHRhLAoJ CSAgICAgIHRlbXAxLCB0ZW1wMiwgdHJ1ZSwgZW1pdF9tb3ZlX2ltbSk7Cn0KCi8qIFN1YnRyYWN0 IERFTFRBIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIsIG1hcmtpbmcgdGhlIGluc3RydWN0aW9ucwog ICBmcmFtZS1yZWxhdGVkIGlmIEZSQU1FX1JFTEFURURfUC4gIFRFTVAxIGlzIGF2YWlsYWJsZSBh cyBhIHRlbXBvcmFyeQogICBpZiBub25udWxsLiAgKi8KCnN0YXRpYyBpbmxpbmUgdm9pZAphYXJj aDY0X3N1Yl9zcCAocnR4IHRlbXAxLCBydHggdGVtcDIsIHBvbHlfaW50NjQgZGVsdGEsIGJvb2wg ZnJhbWVfcmVsYXRlZF9wLAoJCWJvb2wgZW1pdF9tb3ZlX2ltbSA9IHRydWUpCnsKICBhYXJjaDY0 X2FkZF9vZmZzZXQgKFBtb2RlLCBzdGFja19wb2ludGVyX3J0eCwgc3RhY2tfcG9pbnRlcl9ydHgs IC1kZWx0YSwKCQkgICAgICB0ZW1wMSwgdGVtcDIsIGZyYW1lX3JlbGF0ZWRfcCwgZW1pdF9tb3Zl X2ltbSk7Cn0KCi8qIFNldCBERVNUIHRvICh2ZWNfc2VyaWVzIEJBU0UgU1RFUCkuICAqLwoKc3Rh dGljIHZvaWQKYWFyY2g2NF9leHBhbmRfdmVjX3NlcmllcyAocnR4IGRlc3QsIHJ0eCBiYXNlLCBy dHggc3RlcCkKewogIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKGRlc3QpOwogIHNjYWxh cl9tb2RlIGlubmVyID0gR0VUX01PREVfSU5ORVIgKG1vZGUpOwoKICAvKiBFYWNoIG9wZXJhbmQg Y2FuIGJlIGEgcmVnaXN0ZXIgb3IgYW4gaW1tZWRpYXRlIGluIHRoZSByYW5nZSBbLTE2LCAxNV0u ICAqLwogIGlmICghYWFyY2g2NF9zdmVfaW5kZXhfaW1tZWRpYXRlX3AgKGJhc2UpKQogICAgYmFz ZSA9IGZvcmNlX3JlZyAoaW5uZXIsIGJhc2UpOwogIGlmICghYWFyY2g2NF9zdmVfaW5kZXhfaW1t ZWRpYXRlX3AgKHN0ZXApKQogICAgc3RlcCA9IGZvcmNlX3JlZyAoaW5uZXIsIHN0ZXApOwoKICBl bWl0X3NldF9pbnNuIChkZXN0LCBnZW5fcnR4X1ZFQ19TRVJJRVMgKG1vZGUsIGJhc2UsIHN0ZXAp KTsKfQoKLyogRHVwbGljYXRlIDEyOC1iaXQgQWR2YW5jZWQgU0lNRCB2ZWN0b3IgU1JDIHNvIHRo YXQgaXQgZmlsbHMgYW4gU1ZFCiAgIHJlZ2lzdGVyIG9mIG1vZGUgTU9ERS4gIFVzZSBUQVJHRVQg Zm9yIHRoZSByZXN1bHQgaWYgaXQncyBub25udWxsCiAgIGFuZCBjb252ZW5pZW50LgoKICAgVGhl IHR3byB2ZWN0b3IgbW9kZXMgbXVzdCBoYXZlIHRoZSBzYW1lIGVsZW1lbnQgbW9kZS4gIFRoZSBi ZWhhdmlvcgogICBpcyB0byBkdXBsaWNhdGUgYXJjaGl0ZWN0dXJhbCBsYW5lIE4gb2YgU1JDIGlu dG8gYXJjaGl0ZWN0dXJhbCBsYW5lcwogICBOICsgSSAqIFNURVAgb2YgdGhlIHJlc3VsdC4gIE9u IGJpZy1lbmRpYW4gdGFyZ2V0cywgYXJjaGl0ZWN0dXJhbAogICBsYW5lIDAgb2YgYW4gQWR2YW5j ZWQgU0lNRCB2ZWN0b3IgaXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgdmVjdG9yCiAgIGluIG1l bW9yeSBsYXlvdXQsIHNvIGZvciBiaWctZW5kaWFuIHRhcmdldHMgdGhpcyBvcGVyYXRpb24gaGFz IHRoZQogICBlZmZlY3Qgb2YgcmV2ZXJzaW5nIFNSQyBiZWZvcmUgZHVwbGljYXRpbmcgaXQuICBD YWxsZXJzIG5lZWQgdG8KICAgYWNjb3VudCBmb3IgdGhpcy4gICovCgpydHgKYWFyY2g2NF9leHBh bmRfc3ZlX2R1cHEgKHJ0eCB0YXJnZXQsIG1hY2hpbmVfbW9kZSBtb2RlLCBydHggc3JjKQp7CiAg bWFjaGluZV9tb2RlIHNyY19tb2RlID0gR0VUX01PREUgKHNyYyk7CiAgZ2NjX2Fzc2VydCAoR0VU X01PREVfSU5ORVIgKG1vZGUpID09IEdFVF9NT0RFX0lOTkVSIChzcmNfbW9kZSkpOwogIGluc25f Y29kZSBpY29kZSA9IChCWVRFU19CSUdfRU5ESUFOCgkJICAgICA/IGNvZGVfZm9yX2FhcmNoNjRf dmVjX2R1cGxpY2F0ZV92cV9iZSAobW9kZSkKCQkgICAgIDogY29kZV9mb3JfYWFyY2g2NF92ZWNf ZHVwbGljYXRlX3ZxX2xlIChtb2RlKSk7CgogIHVuc2lnbmVkIGludCBpID0gMDsKICBleHBhbmRf b3BlcmFuZCBvcHNbM107CiAgY3JlYXRlX291dHB1dF9vcGVyYW5kICgmb3BzW2krK10sIHRhcmdl dCwgbW9kZSk7CiAgY3JlYXRlX291dHB1dF9vcGVyYW5kICgmb3BzW2krK10sIHNyYywgc3JjX21v ZGUpOwogIGlmIChCWVRFU19CSUdfRU5ESUFOKQogICAgewogICAgICAvKiBDcmVhdGUgYSBQQVJB TExFTCBkZXNjcmliaW5nIHRoZSByZXZlcnNhbCBvZiBTUkMuICAqLwogICAgICB1bnNpZ25lZCBp bnQgbmVsdHNfcGVyX3ZxID0gMTI4IC8gR0VUX01PREVfVU5JVF9CSVRTSVpFIChtb2RlKTsKICAg ICAgcnR4IHNlbCA9IGFhcmNoNjRfZ2VuX3N0ZXBwZWRfaW50X3BhcmFsbGVsIChuZWx0c19wZXJf dnEsCgkJCQkJCSAgbmVsdHNfcGVyX3ZxIC0gMSwgLTEpOwogICAgICBjcmVhdGVfZml4ZWRfb3Bl cmFuZCAoJm9wc1tpKytdLCBzZWwpOwogICAgfQogIGV4cGFuZF9pbnNuIChpY29kZSwgaSwgb3Bz KTsKICByZXR1cm4gb3BzWzBdLnZhbHVlOwp9CgovKiBUcnkgdG8gZm9yY2UgMTI4LWJpdCB2ZWN0 b3IgdmFsdWUgU1JDIGludG8gbWVtb3J5IGFuZCB1c2UgTEQxUlEgdG8gZmV0Y2gKICAgdGhlIG1l bW9yeSBpbWFnZSBpbnRvIERFU1QuICBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLiAgKi8KCnN0YXRp YyBib29sCmFhcmNoNjRfZXhwYW5kX3N2ZV9sZDFycSAocnR4IGRlc3QsIHJ0eCBzcmMpCnsKICBz cmMgPSBmb3JjZV9jb25zdF9tZW0gKEdFVF9NT0RFIChzcmMpLCBzcmMpOwogIGlmICghc3JjKQog ICAgcmV0dXJuIGZhbHNlOwoKICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgYWRkcmVzcyBpcyBsZWdp dGltYXRlLiAgKi8KICBpZiAoIWFhcmNoNjRfc3ZlX2xkMXJxX29wZXJhbmRfcCAoc3JjKSkKICAg IHsKICAgICAgcnR4IGFkZHIgPSBmb3JjZV9yZWcgKFBtb2RlLCBYRVhQIChzcmMsIDApKTsKICAg ICAgc3JjID0gcmVwbGFjZV9lcXVpdl9hZGRyZXNzIChzcmMsIGFkZHIpOwogICAgfQoKICBtYWNo aW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFIChkZXN0KTsKICBtYWNoaW5lX21vZGUgcHJlZF9tb2Rl ID0gYWFyY2g2NF9zdmVfcHJlZF9tb2RlIChtb2RlKTsKICBydHggcHRydWUgPSBhYXJjaDY0X3B0 cnVlX3JlZyAocHJlZF9tb2RlKTsKICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X3N2ZV9sZDFycSAo bW9kZSwgZGVzdCwgc3JjLCBwdHJ1ZSkpOwogIHJldHVybiB0cnVlOwp9CgovKiBTUkMgaXMgYW4g U1ZFIENPTlNUX1ZFQ1RPUiB0aGF0IGNvbnRhaW5zIE4gImZvcmVncm91bmQiIHZhbHVlcyBmb2xs b3dlZAogICBieSBOICJiYWNrZ3JvdW5kIiB2YWx1ZXMuICBUcnkgdG8gbW92ZSBpdCBpbnRvIFRB UkdFVCB1c2luZzoKCiAgICAgIFBUUlVFIFBSRUQuPFQ+LCBWTDxOPgogICAgICBNT1YgVFJVRS48 VD4sICM8Zm9yZWdyb3VuZD4KICAgICAgTU9WIEZBTFNFLjxUPiwgIzxiYWNrZ3JvdW5kPgogICAg ICBTRUwgVEFSR0VULjxUPiwgUFJFRC48VD4sIFRSVUUuPFQ+LCBGQUxTRS48VD4KCiAgIFRoZSBQ VFJVRSBpcyBhbHdheXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gYnV0IHRoZSBNT1ZzIG1pZ2h0IG5l ZWQgYQogICBsb25nZXIgc2VxdWVuY2UuICBJZiB0aGUgYmFja2dyb3VuZCB2YWx1ZSBpcyB6ZXJv IChhcyBpdCBvZnRlbiBpcyksCiAgIHRoZSBzZXF1ZW5jZSBjYW4gc29tZXRpbWVzIGNvbGxhcHNl IHRvIGEgUFRSVUUgZm9sbG93ZWQgYnkgYQogICB6ZXJvLXByZWRpY2F0ZWQgbW92ZS4KCiAgIFJl dHVybiB0aGUgdGFyZ2V0IG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSByZXR1cm4gbnVsbC4gICovCgpz dGF0aWMgcnR4CmFhcmNoNjRfZXhwYW5kX3N2ZV9jb25zdF92ZWN0b3Jfc2VsIChydHggdGFyZ2V0 LCBydHggc3JjKQp7CiAgZ2NjX2Fzc2VydCAoQ09OU1RfVkVDVE9SX05FTFRTX1BFUl9QQVRURVJO IChzcmMpID09IDIpOwoKICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgUFRSVUUgaXMgdmFsaWQuICAq LwogIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKHNyYyk7CiAgbWFjaGluZV9tb2RlIHBy ZWRfbW9kZSA9IGFhcmNoNjRfc3ZlX3ByZWRfbW9kZSAobW9kZSk7CiAgdW5zaWduZWQgaW50IG5w YXR0ZXJucyA9IENPTlNUX1ZFQ1RPUl9OUEFUVEVSTlMgKHNyYyk7CiAgaWYgKGFhcmNoNjRfc3Zw YXR0ZXJuX2Zvcl92bCAocHJlZF9tb2RlLCBucGF0dGVybnMpCiAgICAgID09IEFBUkNINjRfTlVN X1NWUEFUVEVSTlMpCiAgICByZXR1cm4gTlVMTF9SVFg7CgogIHJ0eF92ZWN0b3JfYnVpbGRlciBw cmVkX2J1aWxkZXIgKHByZWRfbW9kZSwgbnBhdHRlcm5zLCAyKTsKICBydHhfdmVjdG9yX2J1aWxk ZXIgdHJ1ZV9idWlsZGVyIChtb2RlLCBucGF0dGVybnMsIDEpOwogIHJ0eF92ZWN0b3JfYnVpbGRl ciBmYWxzZV9idWlsZGVyIChtb2RlLCBucGF0dGVybnMsIDEpOwogIGZvciAodW5zaWduZWQgaW50 IGkgPSAwOyBpIDwgbnBhdHRlcm5zOyArK2kpCiAgICB7CiAgICAgIHRydWVfYnVpbGRlci5xdWlj a19wdXNoIChDT05TVF9WRUNUT1JfRU5DT0RFRF9FTFQgKHNyYywgaSkpOwogICAgICBwcmVkX2J1 aWxkZXIucXVpY2tfcHVzaCAoQ09OU1QxX1JUWCAoQkltb2RlKSk7CiAgICB9CiAgZm9yICh1bnNp Z25lZCBpbnQgaSA9IDA7IGkgPCBucGF0dGVybnM7ICsraSkKICAgIHsKICAgICAgZmFsc2VfYnVp bGRlci5xdWlja19wdXNoIChDT05TVF9WRUNUT1JfRU5DT0RFRF9FTFQgKHNyYywgaSArIG5wYXR0 ZXJucykpOwogICAgICBwcmVkX2J1aWxkZXIucXVpY2tfcHVzaCAoQ09OU1QwX1JUWCAoQkltb2Rl KSk7CiAgICB9CiAgZXhwYW5kX29wZXJhbmQgb3BzWzRdOwogIGNyZWF0ZV9vdXRwdXRfb3BlcmFu ZCAoJm9wc1swXSwgdGFyZ2V0LCBtb2RlKTsKICBjcmVhdGVfaW5wdXRfb3BlcmFuZCAoJm9wc1sx XSwgdHJ1ZV9idWlsZGVyLmJ1aWxkICgpLCBtb2RlKTsKICBjcmVhdGVfaW5wdXRfb3BlcmFuZCAo Jm9wc1syXSwgZmFsc2VfYnVpbGRlci5idWlsZCAoKSwgbW9kZSk7CiAgY3JlYXRlX2lucHV0X29w ZXJhbmQgKCZvcHNbM10sIHByZWRfYnVpbGRlci5idWlsZCAoKSwgcHJlZF9tb2RlKTsKICBleHBh bmRfaW5zbiAoY29kZV9mb3JfdmNvbmRfbWFzayAobW9kZSwgbW9kZSksIDQsIG9wcyk7CiAgcmV0 dXJuIHRhcmdldDsKfQoKLyogUmV0dXJuIGEgcmVnaXN0ZXIgY29udGFpbmluZyBDT05TVF9WRUNU T1IgU1JDLCBnaXZlbiB0aGF0IFNSQyBoYXMgYW4KICAgU1ZFIGRhdGEgbW9kZSBhbmQgaXNuJ3Qg YSBsZWdpdGltYXRlIGNvbnN0YW50LiAgVXNlIFRBUkdFVCBmb3IgdGhlCiAgIHJlc3VsdCBpZiBj b252ZW5pZW50LgoKICAgVGhlIHJldHVybmVkIHJlZ2lzdGVyIGNhbiBoYXZlIHdoYXRldmVyIG1v ZGUgc2VlbXMgbW9zdCBuYXR1cmFsCiAgIGdpdmVuIHRoZSBjb250ZW50cyBvZiBTUkMuICAqLwoK c3RhdGljIHJ0eAphYXJjaDY0X2V4cGFuZF9zdmVfY29uc3RfdmVjdG9yIChydHggdGFyZ2V0LCBy dHggc3JjKQp7CiAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRfTU9ERSAoc3JjKTsKICB1bnNpZ25l ZCBpbnQgbnBhdHRlcm5zID0gQ09OU1RfVkVDVE9SX05QQVRURVJOUyAoc3JjKTsKICB1bnNpZ25l ZCBpbnQgbmVsdHNfcGVyX3BhdHRlcm4gPSBDT05TVF9WRUNUT1JfTkVMVFNfUEVSX1BBVFRFUk4g KHNyYyk7CiAgc2NhbGFyX21vZGUgZWx0X21vZGUgPSBHRVRfTU9ERV9JTk5FUiAobW9kZSk7CiAg dW5zaWduZWQgaW50IGVsdF9iaXRzID0gR0VUX01PREVfQklUU0laRSAoZWx0X21vZGUpOwogIHVu c2lnbmVkIGludCBjb250YWluZXJfYml0cyA9IGFhcmNoNjRfc3ZlX2NvbnRhaW5lcl9iaXRzICht b2RlKTsKICB1bnNpZ25lZCBpbnQgZW5jb2RlZF9iaXRzID0gbnBhdHRlcm5zICogbmVsdHNfcGVy X3BhdHRlcm4gKiBjb250YWluZXJfYml0czsKCiAgaWYgKG5lbHRzX3Blcl9wYXR0ZXJuID09IDEK ICAgICAgJiYgZW5jb2RlZF9iaXRzIDw9IDEyOAogICAgICAmJiBjb250YWluZXJfYml0cyAhPSBl bHRfYml0cykKICAgIHsKICAgICAgLyogV2UgaGF2ZSBhIHBhcnRpYWwgdmVjdG9yIG1vZGUgYW5k IGEgY29uc3RhbnQgd2hvc2UgZnVsbC12ZWN0b3IKCSBlcXVpdmFsZW50IHdvdWxkIG9jY3VweSBh IHJlcGVhdGluZyAxMjgtYml0IHNlcXVlbmNlLiAgQnVpbGQgdGhhdAoJIGZ1bGwtdmVjdG9yIGVx dWl2YWxlbnQgaW5zdGVhZCwgc28gdGhhdCB3ZSBoYXZlIHRoZSBvcHRpb24gb2YKCSB1c2luZyBM RDFSUSBhbmQgQWR2YW5jZWQgU0lNRCBvcGVyYXRpb25zLiAgKi8KICAgICAgdW5zaWduZWQgaW50 IHJlcGVhdCA9IGNvbnRhaW5lcl9iaXRzIC8gZWx0X2JpdHM7CiAgICAgIG1hY2hpbmVfbW9kZSBm dWxsX21vZGUgPSBhYXJjaDY0X2Z1bGxfc3ZlX21vZGUgKGVsdF9tb2RlKS5yZXF1aXJlICgpOwog ICAgICBydHhfdmVjdG9yX2J1aWxkZXIgYnVpbGRlciAoZnVsbF9tb2RlLCBucGF0dGVybnMgKiBy ZXBlYXQsIDEpOwogICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5wYXR0ZXJuczsg KytpKQoJZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCByZXBlYXQ7ICsraikKCSAgYnVpbGRl ci5xdWlja19wdXNoIChDT05TVF9WRUNUT1JfRU5DT0RFRF9FTFQgKHNyYywgaSkpOwogICAgICB0 YXJnZXQgPSBhYXJjaDY0X3RhcmdldF9yZWcgKHRhcmdldCwgZnVsbF9tb2RlKTsKICAgICAgcmV0 dXJuIGFhcmNoNjRfZXhwYW5kX3N2ZV9jb25zdF92ZWN0b3IgKHRhcmdldCwgYnVpbGRlci5idWls ZCAoKSk7CiAgICB9CgogIGlmIChuZWx0c19wZXJfcGF0dGVybiA9PSAxICYmIGVuY29kZWRfYml0 cyA9PSAxMjgpCiAgICB7CiAgICAgIC8qIFRoZSBjb25zdGFudCBpcyBhIGR1cGxpY2F0ZWQgcXVh ZHdvcmQgYnV0IGNhbid0IGJlIG5hcnJvd2VkCgkgYmV5b25kIGEgcXVhZHdvcmQuICBHZXQgdGhl IG1lbW9yeSBpbWFnZSBvZiB0aGUgZmlyc3QgcXVhZHdvcmQKCSBhcyBhIDEyOC1iaXQgdmVjdG9y IGFuZCB0cnkgdXNpbmcgTEQxUlEgdG8gbG9hZCBpdCBmcm9tIG1lbW9yeS4KCgkgVGhlIGVmZmVj dCBmb3IgYm90aCBlbmRpYW5uZXNzZXMgaXMgdG8gbG9hZCBtZW1vcnkgbGFuZSBOIGludG8KCSBh cmNoaXRlY3R1cmFsIGxhbmVzIE4gKyBJICogU1RFUCBvZiB0aGUgcmVzdWx0LiAgT24gYmlnLWVu ZGlhbgoJIHRhcmdldHMsIHRoZSBsYXlvdXQgb2YgdGhlIDEyOC1iaXQgdmVjdG9yIGluIGFuIEFk dmFuY2VkIFNJTUQKCSByZWdpc3RlciB3b3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBpdHMgbGF5b3V0 IGluIGFuIFNWRSByZWdpc3RlciwKCSBidXQgdGhpcyAxMjgtYml0IHZlY3RvciBpcyBhIG1lbW9y eSB2YWx1ZSBvbmx5LiAgKi8KICAgICAgbWFjaGluZV9tb2RlIHZxX21vZGUgPSBhYXJjaDY0X3Zx X21vZGUgKGVsdF9tb2RlKS5yZXF1aXJlICgpOwogICAgICBydHggdnFfdmFsdWUgPSBzaW1wbGlm eV9nZW5fc3VicmVnICh2cV9tb2RlLCBzcmMsIG1vZGUsIDApOwogICAgICBpZiAodnFfdmFsdWUg JiYgYWFyY2g2NF9leHBhbmRfc3ZlX2xkMXJxICh0YXJnZXQsIHZxX3ZhbHVlKSkKCXJldHVybiB0 YXJnZXQ7CiAgICB9CgogIGlmIChuZWx0c19wZXJfcGF0dGVybiA9PSAxICYmIGVuY29kZWRfYml0 cyA8IDEyOCkKICAgIHsKICAgICAgLyogVGhlIHZlY3RvciBpcyBhIHJlcGVhdGluZyBzZXF1ZW5j ZSBvZiA2NCBiaXRzIG9yIGZld2VyLgoJIFNlZSBpZiB3ZSBjYW4gbG9hZCB0aGVtIHVzaW5nIGFu IEFkdmFuY2VkIFNJTUQgbW92ZSBhbmQgdGhlbgoJIGR1cGxpY2F0ZSBpdCB0byBmaWxsIGEgdmVj dG9yLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiB1c2luZyBhIEdQUgoJIG1vdmUgYmVjYXVzZSBpdCBr ZWVwcyBldmVyeXRoaW5nIGluIHRoZSBzYW1lIHJlZ2lzdGVyIGZpbGUuICAqLwogICAgICBtYWNo aW5lX21vZGUgdnFfbW9kZSA9IGFhcmNoNjRfdnFfbW9kZSAoZWx0X21vZGUpLnJlcXVpcmUgKCk7 CiAgICAgIHJ0eF92ZWN0b3JfYnVpbGRlciBidWlsZGVyICh2cV9tb2RlLCBucGF0dGVybnMsIDEp OwogICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5wYXR0ZXJuczsgKytpKQoJewoJ ICAvKiBXZSB3YW50IG1lbW9yeSBsYW5lIE4gdG8gZ28gaW50byBhcmNoaXRlY3R1cmFsIGxhbmUg TiwKCSAgICAgc28gcmV2ZXJzZSBmb3IgYmlnLWVuZGlhbiB0YXJnZXRzLiAgVGhlIERVUCAuUSBw YXR0ZXJuCgkgICAgIGhhcyBhIGNvbXBlbnNhdGluZyByZXZlcnNlIGJ1aWx0LWluLiAgKi8KCSAg dW5zaWduZWQgaW50IHNyY2kgPSBCWVRFU19CSUdfRU5ESUFOID8gbnBhdHRlcm5zIC0gaSAtIDEg OiBpOwoJICBidWlsZGVyLnF1aWNrX3B1c2ggKENPTlNUX1ZFQ1RPUl9FTkNPREVEX0VMVCAoc3Jj LCBzcmNpKSk7Cgl9CiAgICAgIHJ0eCB2cV9zcmMgPSBidWlsZGVyLmJ1aWxkICgpOwogICAgICBp ZiAoYWFyY2g2NF9zaW1kX3ZhbGlkX2ltbWVkaWF0ZSAodnFfc3JjLCBOVUxMKSkKCXsKCSAgdnFf c3JjID0gZm9yY2VfcmVnICh2cV9tb2RlLCB2cV9zcmMpOwoJICByZXR1cm4gYWFyY2g2NF9leHBh bmRfc3ZlX2R1cHEgKHRhcmdldCwgbW9kZSwgdnFfc3JjKTsKCX0KCiAgICAgIC8qIEdldCBhbiBp bnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXBlYXRpbmcgcGFydCBvZiBBZHZhbmNlZAoJ IFNJTUQgdmVjdG9yIFZRX1NSQy4gIFRoaXMgcHJlc2VydmVzIHRoZSBlbmRpYW5uZXNzIG9mIFZR X1NSQywKCSB3aGljaCBmb3IgYmlnLWVuZGlhbiB0YXJnZXRzIGlzIGxhbmUtc3dhcHBlZCB3cnQg YSBub3JtYWwKCSBBZHZhbmNlZCBTSU1EIHZlY3Rvci4gIFRoaXMgbWVhbnMgdGhhdCBmb3IgYm90 aCBlbmRpYW5uZXNzZXMsCgkgbWVtb3J5IGxhbmUgTiBvZiBTVkUgdmVjdG9yIFNSQyBjb3JyZXNw b25kcyB0byBhcmNoaXRlY3R1cmFsCgkgbGFuZSBOIG9mIGEgcmVnaXN0ZXIgaG9sZGluZyBWUV9T UkMuICBUaGlzIGluIHR1cm4gbWVhbnMgdGhhdAoJIG1lbW9yeSBsYW5lIDAgb2YgU1ZFIHZlY3Rv ciBTUkMgaXMgaW4gdGhlIGxzYiBvZiBWUV9TUkMgKHZpZXdlZAoJIGFzIGEgc2luZ2xlIDEyOC1i aXQgdmFsdWUpIGFuZCB0aHVzIHRoYXQgbWVtb3J5IGxhbmUgMCBvZiBTUkMgaXMKCSBpbiB0aGUg bHNiIG9mIHRoZSBpbnRlZ2VyLiAgRHVwbGljYXRpbmcgdGhlIGludGVnZXIgdGhlcmVmb3JlCgkg ZW5zdXJlcyB0aGF0IG1lbW9yeSBsYW5lIE4gb2YgU1JDIGdvZXMgaW50byBhcmNoaXRlY3R1cmFs IGxhbmUKCSBOICsgSSAqIElOREVYIG9mIHRoZSBTVkUgcmVnaXN0ZXIuICAqLwogICAgICBzY2Fs YXJfbW9kZSBpbnRfbW9kZSA9IGludF9tb2RlX2Zvcl9zaXplIChlbmNvZGVkX2JpdHMsIDApLnJl cXVpcmUgKCk7CiAgICAgIHJ0eCBlbHRfdmFsdWUgPSBzaW1wbGlmeV9nZW5fc3VicmVnIChpbnRf bW9kZSwgdnFfc3JjLCB2cV9tb2RlLCAwKTsKICAgICAgaWYgKGVsdF92YWx1ZSkKCXsKCSAgLyog UHJldGVuZCB0aGF0IHdlIGhhZCBhIHZlY3RvciBvZiBJTlRfTU9ERSB0byBzdGFydCB3aXRoLiAg Ki8KCSAgZWx0X21vZGUgPSBpbnRfbW9kZTsKCSAgbW9kZSA9IGFhcmNoNjRfZnVsbF9zdmVfbW9k ZSAoaW50X21vZGUpLnJlcXVpcmUgKCk7CgoJICAvKiBJZiB0aGUgaW50ZWdlciBjYW4gYmUgbW92 ZWQgaW50byBhIGdlbmVyYWwgcmVnaXN0ZXIgYnkgYQoJICAgICBzaW5nbGUgaW5zdHJ1Y3Rpb24s IGRvIHRoYXQgYW5kIGR1cGxpY2F0ZSB0aGUgcmVzdWx0LiAgKi8KCSAgaWYgKENPTlNUX0lOVF9Q IChlbHRfdmFsdWUpCgkgICAgICAmJiBhYXJjaDY0X21vdmVfaW1tIChJTlRWQUwgKGVsdF92YWx1 ZSksCgkJCQkgICBlbmNvZGVkX2JpdHMgPD0gMzIgPyBTSW1vZGUgOiBESW1vZGUpKQoJICAgIHsK CSAgICAgIGVsdF92YWx1ZSA9IGZvcmNlX3JlZyAoZWx0X21vZGUsIGVsdF92YWx1ZSk7CgkgICAg ICByZXR1cm4gZXhwYW5kX3ZlY3Rvcl9icm9hZGNhc3QgKG1vZGUsIGVsdF92YWx1ZSk7CgkgICAg fQoJfQogICAgICBlbHNlIGlmIChucGF0dGVybnMgPT0gMSkKCS8qIFdlJ3JlIGR1cGxpY2F0aW5n IGEgc2luZ2xlIHZhbHVlLCBidXQgY2FuJ3QgZG8gYmV0dGVyIHRoYW4KCSAgIGZvcmNlIGl0IHRv IG1lbW9yeSBhbmQgbG9hZCBmcm9tIHRoZXJlLiAgVGhpcyBoYW5kbGVzIHRoaW5ncwoJICAgbGlr ZSBzeW1ib2xpYyBjb25zdGFudHMuICAqLwoJZWx0X3ZhbHVlID0gQ09OU1RfVkVDVE9SX0VOQ09E RURfRUxUIChzcmMsIDApOwoKICAgICAgaWYgKGVsdF92YWx1ZSkKCXsKCSAgLyogTG9hZCB0aGUg ZWxlbWVudCBmcm9tIG1lbW9yeSBpZiB3ZSBjYW4sIG90aGVyd2lzZSBtb3ZlIGl0IGludG8KCSAg ICAgYSByZWdpc3RlciBhbmQgdXNlIGEgRFVQLiAgKi8KCSAgcnR4IG9wID0gZm9yY2VfY29uc3Rf bWVtIChlbHRfbW9kZSwgZWx0X3ZhbHVlKTsKCSAgaWYgKCFvcCkKCSAgICBvcCA9IGZvcmNlX3Jl ZyAoZWx0X21vZGUsIGVsdF92YWx1ZSk7CgkgIHJldHVybiBleHBhbmRfdmVjdG9yX2Jyb2FkY2Fz dCAobW9kZSwgb3ApOwoJfQogICAgfQoKICAvKiBUcnkgdXNpbmcgSU5ERVguICAqLwogIHJ0eCBi YXNlLCBzdGVwOwogIGlmIChjb25zdF92ZWNfc2VyaWVzX3AgKHNyYywgJmJhc2UsICZzdGVwKSkK ICAgIHsKICAgICAgYWFyY2g2NF9leHBhbmRfdmVjX3NlcmllcyAodGFyZ2V0LCBiYXNlLCBzdGVw KTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgLyogRnJvbSBoZXJlIG9uLCBpdCdzIGJl dHRlciB0byBmb3JjZSB0aGUgd2hvbGUgY29uc3RhbnQgdG8gbWVtb3J5CiAgICAgaWYgd2UgY2Fu LiAgKi8KICBpZiAoR0VUX01PREVfTlVOSVRTIChtb2RlKS5pc19jb25zdGFudCAoKSkKICAgIHJl dHVybiBOVUxMX1JUWDsKCiAgaWYgKG5lbHRzX3Blcl9wYXR0ZXJuID09IDIpCiAgICBpZiAocnR4 IHJlcyA9IGFhcmNoNjRfZXhwYW5kX3N2ZV9jb25zdF92ZWN0b3Jfc2VsICh0YXJnZXQsIHNyYykp CiAgICAgIHJldHVybiByZXM7CgogIC8qIEV4cGFuZCBlYWNoIHBhdHRlcm4gaW5kaXZpZHVhbGx5 LiAgKi8KICBnY2NfYXNzZXJ0IChucGF0dGVybnMgPiAxKTsKICBydHhfdmVjdG9yX2J1aWxkZXIg YnVpbGRlcjsKICBhdXRvX3ZlYzxydHgsIDE2PiB2ZWN0b3JzIChucGF0dGVybnMpOwogIGZvciAo dW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnBhdHRlcm5zOyArK2kpCiAgICB7CiAgICAgIGJ1aWxk ZXIubmV3X3ZlY3RvciAobW9kZSwgMSwgbmVsdHNfcGVyX3BhdHRlcm4pOwogICAgICBmb3IgKHVu c2lnbmVkIGludCBqID0gMDsgaiA8IG5lbHRzX3Blcl9wYXR0ZXJuOyArK2opCglidWlsZGVyLnF1 aWNrX3B1c2ggKENPTlNUX1ZFQ1RPUl9FTFQgKHNyYywgaSArIGogKiBucGF0dGVybnMpKTsKICAg ICAgdmVjdG9ycy5xdWlja19wdXNoIChmb3JjZV9yZWcgKG1vZGUsIGJ1aWxkZXIuYnVpbGQgKCkp KTsKICAgIH0KCiAgLyogVXNlIHBlcm11dGVzIHRvIGludGVybGVhdmUgdGhlIHNlcGFyYXRlIHZl Y3RvcnMuICAqLwogIHdoaWxlIChucGF0dGVybnMgPiAxKQogICAgewogICAgICBucGF0dGVybnMg Lz0gMjsKICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBucGF0dGVybnM7ICsraSkK CXsKCSAgcnR4IHRtcCA9IChucGF0dGVybnMgPT0gMSA/IHRhcmdldCA6IGdlbl9yZWdfcnR4ICht b2RlKSk7CgkgIHJ0dmVjIHYgPSBnZW5fcnR2ZWMgKDIsIHZlY3RvcnNbaV0sIHZlY3RvcnNbaSAr IG5wYXR0ZXJuc10pOwoJICBlbWl0X3NldF9pbnNuICh0bXAsIGdlbl9ydHhfVU5TUEVDIChtb2Rl LCB2LCBVTlNQRUNfWklQMSkpOwoJICB2ZWN0b3JzW2ldID0gdG1wOwoJfQogICAgfQogIGdjY19h c3NlcnQgKHZlY3RvcnNbMF0gPT0gdGFyZ2V0KTsKICByZXR1cm4gdGFyZ2V0Owp9CgovKiBVc2Ug V0hJTEUgdG8gc2V0IGEgcHJlZGljYXRlIHJlZ2lzdGVyIG9mIG1vZGUgTU9ERSBpbiB3aGljaCB0 aGUgZmlyc3QKICAgVkwgYml0cyBhcmUgc2V0IGFuZCB0aGUgcmVzdCBhcmUgY2xlYXIuICBVc2Ug VEFSR0VUIGZvciB0aGUgcmVnaXN0ZXIKICAgaWYgaXQncyBub25udWxsIGFuZCBjb252ZW5pZW50 LiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF9zdmVfbW92ZV9wcmVkX3ZpYV93aGlsZSAocnR4IHRh cmdldCwgbWFjaGluZV9tb2RlIG1vZGUsCgkJCQkgdW5zaWduZWQgaW50IHZsKQp7CiAgcnR4IGxp bWl0ID0gZm9yY2VfcmVnIChESW1vZGUsIGdlbl9pbnRfbW9kZSAodmwsIERJbW9kZSkpOwogIHRh cmdldCA9IGFhcmNoNjRfdGFyZ2V0X3JlZyAodGFyZ2V0LCBtb2RlKTsKICBlbWl0X2luc24gKGdl bl93aGlsZSAoVU5TUEVDX1dISUxFTE8sIERJbW9kZSwgbW9kZSwKCQkJdGFyZ2V0LCBjb25zdDBf cnR4LCBsaW1pdCkpOwogIHJldHVybiB0YXJnZXQ7Cn0KCnN0YXRpYyBydHgKYWFyY2g2NF9leHBh bmRfc3ZlX2NvbnN0X3ByZWRfMSAocnR4LCBydHhfdmVjdG9yX2J1aWxkZXIgJiwgYm9vbCk7Cgov KiBCVUlMREVSIGlzIGEgY29uc3RhbnQgcHJlZGljYXRlIGluIHdoaWNoIHRoZSBpbmRleCBvZiBl dmVyeSBzZXQgYml0CiAgIGlzIGEgbXVsdGlwbGUgb2YgRUxUX1NJWkUgKHdoaWNoIGlzIDw9IDgp LiAgVHJ5IHRvIGxvYWQgdGhlIGNvbnN0YW50CiAgIGJ5IGludmVydGluZyBldmVyeSBlbGVtZW50 IGF0IGEgbXVsdGlwbGUgb2YgRUxUX1NJWkUgYW5kIEVPUmluZyB0aGUKICAgcmVzdWx0IHdpdGgg YW4gRUxUX1NJWkUgUFRSVUUuCgogICBSZXR1cm4gYSByZWdpc3RlciB0aGF0IGNvbnRhaW5zIHRo ZSBjb25zdGFudCBvbiBzdWNjZXNzLCBvdGhlcndpc2UKICAgcmV0dXJuIG51bGwuICBVc2UgVEFS R0VUIGFzIHRoZSByZWdpc3RlciBpZiBpdCBpcyBub25udWxsIGFuZAogICBjb252ZW5pZW50LiAg Ki8KCnN0YXRpYyBydHgKYWFyY2g2NF9leHBhbmRfc3ZlX2NvbnN0X3ByZWRfZW9yIChydHggdGFy Z2V0LCBydHhfdmVjdG9yX2J1aWxkZXIgJmJ1aWxkZXIsCgkJCQkgICB1bnNpZ25lZCBpbnQgZWx0 X3NpemUpCnsKICAvKiBJbnZlcnQgZXZlcnkgZWxlbWVudCBhdCBhIG11bHRpcGxlIG9mIEVMVF9T SVpFLCBrZWVwaW5nIHRoZQogICAgIG90aGVyIGJpdHMgemVyby4gICovCiAgcnR4X3ZlY3Rvcl9i dWlsZGVyIGludl9idWlsZGVyIChWTngxNkJJbW9kZSwgYnVpbGRlci5ucGF0dGVybnMgKCksCgkJ CQkgIGJ1aWxkZXIubmVsdHNfcGVyX3BhdHRlcm4gKCkpOwogIGZvciAodW5zaWduZWQgaW50IGkg PSAwOyBpIDwgYnVpbGRlci5lbmNvZGVkX25lbHRzICgpOyArK2kpCiAgICBpZiAoKGkgJiAoZWx0 X3NpemUgLSAxKSkgPT0gMCAmJiBJTlRWQUwgKGJ1aWxkZXIuZWx0IChpKSkgPT0gMCkKICAgICAg aW52X2J1aWxkZXIucXVpY2tfcHVzaCAoY29uc3QxX3J0eCk7CiAgICBlbHNlCiAgICAgIGludl9i dWlsZGVyLnF1aWNrX3B1c2ggKGNvbnN0MF9ydHgpOwogIGludl9idWlsZGVyLmZpbmFsaXplICgp OwoKICAvKiBTZWUgaWYgd2UgY2FuIGxvYWQgdGhlIGNvbnN0YW50IGNoZWFwbHkuICAqLwogIHJ0 eCBpbnYgPSBhYXJjaDY0X2V4cGFuZF9zdmVfY29uc3RfcHJlZF8xIChOVUxMX1JUWCwgaW52X2J1 aWxkZXIsIGZhbHNlKTsKICBpZiAoIWludikKICAgIHJldHVybiBOVUxMX1JUWDsKCiAgLyogRU9S IHRoZSByZXN1bHQgd2l0aCBhbiBFTFRfU0laRSBQVFJVRS4gICovCiAgcnR4IG1hc2sgPSBhYXJj aDY0X3B0cnVlX2FsbCAoZWx0X3NpemUpOwogIG1hc2sgPSBmb3JjZV9yZWcgKFZOeDE2Qkltb2Rl LCBtYXNrKTsKICBpbnYgPSBnZW5fbG93cGFydCAoVk54MTZCSW1vZGUsIGludik7CiAgdGFyZ2V0 ID0gYWFyY2g2NF90YXJnZXRfcmVnICh0YXJnZXQsIFZOeDE2Qkltb2RlKTsKICBlbWl0X2luc24g KGdlbl9hYXJjaDY0X3ByZWRfeiAoWE9SLCBWTngxNkJJbW9kZSwgdGFyZ2V0LCBtYXNrLCBpbnYs IG1hc2spKTsKICByZXR1cm4gdGFyZ2V0Owp9CgovKiBCVUlMREVSIGlzIGEgY29uc3RhbnQgcHJl ZGljYXRlIGluIHdoaWNoIHRoZSBpbmRleCBvZiBldmVyeSBzZXQgYml0CiAgIGlzIGEgbXVsdGlw bGUgb2YgRUxUX1NJWkUgKHdoaWNoIGlzIDw9IDgpLiAgVHJ5IHRvIGxvYWQgdGhlIGNvbnN0YW50 CiAgIHVzaW5nIGEgVFJOMSBvZiBzaXplIFBFUk1VVEVfU0laRSwgd2hpY2ggaXMgPj0gRUxUX1NJ WkUuICBSZXR1cm4gdGhlCiAgIHJlZ2lzdGVyIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSByZXR1cm4g bnVsbC4gIFVzZSBUQVJHRVQgYXMgdGhlIHJlZ2lzdGVyCiAgIGlmIG5vbm51bGwgYW5kIGNvbnZl bmllbnQuICAqLwoKc3RhdGljIHJ0eAphYXJjaDY0X2V4cGFuZF9zdmVfY29uc3RfcHJlZF90cm4g KHJ0eCB0YXJnZXQsIHJ0eF92ZWN0b3JfYnVpbGRlciAmYnVpbGRlciwKCQkJCSAgIHVuc2lnbmVk IGludCBlbHRfc2l6ZSwKCQkJCSAgIHVuc2lnbmVkIGludCBwZXJtdXRlX3NpemUpCnsKICAvKiBX ZSdyZSBnb2luZyB0byBzcGxpdCB0aGUgY29uc3RhbnQgaW50byB0d28gbmV3IGNvbnN0YW50cyBB IGFuZCBCLAogICAgIHdpdGggZWxlbWVudCBJIG9mIEJVSUxERVIgZ29pbmcgaW50byBBIGlmIChJ ICYgUEVSTVVURV9TSVpFKSA9PSAwCiAgICAgYW5kIGludG8gQiBvdGhlcndpc2UuICBFLmcuIGZv ciBQRVJNVVRFX1NJWkUgPT0gNCAmJiBFTFRfU0laRSA9PSAxOgoKICAgICBBOiB7IDAsIDEsIDIs IDMsIF8sIF8sIF8sIF8sIDgsIDksIDEwLCAxMSwgXywgXywgXywgXyB9CiAgICAgQjogeyA0LCA1 LCA2LCA3LCBfLCBfLCBfLCBfLCAxMiwgMTMsIDE0LCAxNSwgXywgXywgXywgXyB9CgogICAgIHdo ZXJlIF8gaW5kaWNhdGVzIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHBl cm11dGUuCgogICAgIEZpcnN0IGNhbGN1bGF0ZSB0aGUgRUxUX1NJWkVzIGZvciBBIGFuZCBCLiAg Ki8KICB1bnNpZ25lZCBpbnQgYV9lbHRfc2l6ZSA9IEdFVF9NT0RFX1NJWkUgKERJbW9kZSk7CiAg dW5zaWduZWQgaW50IGJfZWx0X3NpemUgPSBHRVRfTU9ERV9TSVpFIChESW1vZGUpOwogIGZvciAo dW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYnVpbGRlci5lbmNvZGVkX25lbHRzICgpOyBpICs9IGVs dF9zaXplKQogICAgaWYgKElOVFZBTCAoYnVpbGRlci5lbHQgKGkpKSAhPSAwKQogICAgICB7Cglp ZiAoaSAmIHBlcm11dGVfc2l6ZSkKCSAgYl9lbHRfc2l6ZSB8PSBpIC0gcGVybXV0ZV9zaXplOwoJ ZWxzZQoJICBhX2VsdF9zaXplIHw9IGk7CiAgICAgIH0KICBhX2VsdF9zaXplICY9IC1hX2VsdF9z aXplOwogIGJfZWx0X3NpemUgJj0gLWJfZWx0X3NpemU7CgogIC8qIE5vdyBjb25zdHJ1Y3QgdGhl IHZlY3RvcnMgdGhlbXNlbHZlcy4gICovCiAgcnR4X3ZlY3Rvcl9idWlsZGVyIGFfYnVpbGRlciAo Vk54MTZCSW1vZGUsIGJ1aWxkZXIubnBhdHRlcm5zICgpLAoJCQkJYnVpbGRlci5uZWx0c19wZXJf cGF0dGVybiAoKSk7CiAgcnR4X3ZlY3Rvcl9idWlsZGVyIGJfYnVpbGRlciAoVk54MTZCSW1vZGUs IGJ1aWxkZXIubnBhdHRlcm5zICgpLAoJCQkJYnVpbGRlci5uZWx0c19wZXJfcGF0dGVybiAoKSk7 CiAgdW5zaWduZWQgaW50IG5lbHRzID0gYnVpbGRlci5lbmNvZGVkX25lbHRzICgpOwogIGZvciAo dW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbmVsdHM7ICsraSkKICAgIGlmIChpICYgKGVsdF9zaXpl IC0gMSkpCiAgICAgIHsKCWFfYnVpbGRlci5xdWlja19wdXNoIChjb25zdDBfcnR4KTsKCWJfYnVp bGRlci5xdWlja19wdXNoIChjb25zdDBfcnR4KTsKICAgICAgfQogICAgZWxzZSBpZiAoKGkgJiBw ZXJtdXRlX3NpemUpID09IDApCiAgICAgIHsKCS8qIFRoZSBBIGFuZCBCIGVsZW1lbnRzIGFyZSBz aWduaWZpY2FudC4gICovCglhX2J1aWxkZXIucXVpY2tfcHVzaCAoYnVpbGRlci5lbHQgKGkpKTsK CWJfYnVpbGRlci5xdWlja19wdXNoIChidWlsZGVyLmVsdCAoaSArIHBlcm11dGVfc2l6ZSkpOwog ICAgICB9CiAgICBlbHNlCiAgICAgIHsKCS8qIFRoZSBBIGFuZCBCIGVsZW1lbnRzIGFyZSBnb2lu ZyB0byBiZSBkaXNjYXJkZWQsIHNvIHBpY2sgd2hhdGV2ZXIKCSAgIGlzIGxpa2VseSB0byBnaXZl IGEgbmljZSBjb25zdGFudC4gIFdlIGFyZSB0YXJnZXRpbmcgZWxlbWVudAoJICAgc2l6ZXMgQV9F TFRfU0laRSBhbmQgQl9FTFRfU0laRSBmb3IgQSBhbmQgQiByZXNwZWN0aXZlbHksCgkgICB3aXRo IHRoZSBhaW0gb2YgZWFjaCBiZWluZyBhIHNlcXVlbmNlIG9mIG9uZXMgZm9sbG93ZWQgYnkKCSAg IGEgc2VxdWVuY2Ugb2YgemVyb3MuICBTbzoKCgkgICAqIGlmIFhfRUxUX1NJWkUgPD0gUEVSTVVU RV9TSVpFLCB0aGUgYmVzdCBhcHByb2FjaCBpcyB0bwoJICAgICBkdXBsaWNhdGUgdGhlIGxhc3Qg WF9FTFRfU0laRSBlbGVtZW50LCB0byBleHRlbmQgdGhlCgkgICAgIGN1cnJlbnQgc2VxdWVuY2Ug b2Ygb25lcyBvciB6ZXJvcy4KCgkgICAqIGlmIFhfRUxUX1NJWkUgPiBQRVJNVVRFX1NJWkUsIHRo ZSBiZXN0IGFwcHJvYWNoIGlzIHRvIGFkZCBhCgkgICAgIHplcm8sIHNvIHRoYXQgdGhlIGNvbnN0 YW50IHJlYWxseSBkb2VzIGhhdmUgWF9FTFRfU0laRSBhbmQKCSAgICAgbm90IGEgc21hbGxlciBz aXplLiAgKi8KCWlmIChhX2VsdF9zaXplID4gcGVybXV0ZV9zaXplKQoJICBhX2J1aWxkZXIucXVp Y2tfcHVzaCAoY29uc3QwX3J0eCk7CgllbHNlCgkgIGFfYnVpbGRlci5xdWlja19wdXNoIChhX2J1 aWxkZXIuZWx0IChpIC0gYV9lbHRfc2l6ZSkpOwoJaWYgKGJfZWx0X3NpemUgPiBwZXJtdXRlX3Np emUpCgkgIGJfYnVpbGRlci5xdWlja19wdXNoIChjb25zdDBfcnR4KTsKCWVsc2UKCSAgYl9idWls ZGVyLnF1aWNrX3B1c2ggKGJfYnVpbGRlci5lbHQgKGkgLSBiX2VsdF9zaXplKSk7CiAgICAgIH0K ICBhX2J1aWxkZXIuZmluYWxpemUgKCk7CiAgYl9idWlsZGVyLmZpbmFsaXplICgpOwoKICAvKiBU cnkgbG9hZGluZyBBIGludG8gYSByZWdpc3Rlci4gICovCiAgcnR4X2luc24gKmxhc3QgPSBnZXRf bGFzdF9pbnNuICgpOwogIHJ0eCBhID0gYWFyY2g2NF9leHBhbmRfc3ZlX2NvbnN0X3ByZWRfMSAo TlVMTF9SVFgsIGFfYnVpbGRlciwgZmFsc2UpOwogIGlmICghYSkKICAgIHJldHVybiBOVUxMX1JU WDsKCiAgLyogVHJ5IGxvYWRpbmcgQiBpbnRvIGEgcmVnaXN0ZXIuICAqLwogIHJ0eCBiID0gYTsK ICBpZiAoYV9idWlsZGVyICE9IGJfYnVpbGRlcikKICAgIHsKICAgICAgYiA9IGFhcmNoNjRfZXhw YW5kX3N2ZV9jb25zdF9wcmVkXzEgKE5VTExfUlRYLCBiX2J1aWxkZXIsIGZhbHNlKTsKICAgICAg aWYgKCFiKQoJewoJICBkZWxldGVfaW5zbnNfc2luY2UgKGxhc3QpOwoJICByZXR1cm4gTlVMTF9S VFg7Cgl9CiAgICB9CgogIC8qIEVtaXQgdGhlIFRSTjEgaXRzZWxmLiAgV2UgZW1pdCBhIFRSTiB0 aGF0IG9wZXJhdGVzIG9uIFZOeDE2QkkKICAgICBvcGVyYW5kcyBidXQgcGVybXV0ZXMgdGhlbSBh cyB0aG91Z2ggdGhleSBoYWQgbW9kZSBNT0RFLiAgKi8KICBtYWNoaW5lX21vZGUgbW9kZSA9IGFh cmNoNjRfc3ZlX3ByZWRfbW9kZSAocGVybXV0ZV9zaXplKS5yZXF1aXJlICgpOwogIHRhcmdldCA9 IGFhcmNoNjRfdGFyZ2V0X3JlZyAodGFyZ2V0LCBHRVRfTU9ERSAoYSkpOwogIHJ0eCB0eXBlX3Jl ZyA9IENPTlNUMF9SVFggKG1vZGUpOwogIGVtaXRfaW5zbiAoZ2VuX2FhcmNoNjRfc3ZlX3RybjFf Y29udiAobW9kZSwgdGFyZ2V0LCBhLCBiLCB0eXBlX3JlZykpOwogIHJldHVybiB0YXJnZXQ7Cn0K Ci8qIFN1YnJvdXRpbmUgb2YgYWFyY2g2NF9leHBhbmRfc3ZlX2NvbnN0X3ByZWQuICBUcnkgdG8g bG9hZCB0aGUgVk54MTZCSQogICBjb25zdGFudCBpbiBCVUlMREVSIGludG8gYW4gU1ZFIHByZWRp Y2F0ZSByZWdpc3Rlci4gIFJldHVybiB0aGUgcmVnaXN0ZXIKICAgb24gc3VjY2Vzcywgb3RoZXJ3 aXNlIHJldHVybiBudWxsLiAgVXNlIFRBUkdFVCBmb3IgdGhlIHJlZ2lzdGVyIGlmCiAgIG5vbm51 bGwgYW5kIGNvbnZlbmllbnQuCgogICBBTExPV19SRUNVUlNFX1AgaXMgdHJ1ZSBpZiB3ZSBjYW4g dXNlIG1ldGhvZHMgdGhhdCB3b3VsZCBjYWxsIHRoaXMKICAgZnVuY3Rpb24gcmVjdXJzaXZlbHku ICAqLwoKc3RhdGljIHJ0eAphYXJjaDY0X2V4cGFuZF9zdmVfY29uc3RfcHJlZF8xIChydHggdGFy Z2V0LCBydHhfdmVjdG9yX2J1aWxkZXIgJmJ1aWxkZXIsCgkJCQkgYm9vbCBhbGxvd19yZWN1cnNl X3ApCnsKICBpZiAoYnVpbGRlci5lbmNvZGVkX25lbHRzICgpID09IDEpCiAgICAvKiBBIFBGQUxT RSBvciBhIFBUUlVFIC5CIEFMTC4gICovCiAgICByZXR1cm4gYWFyY2g2NF9lbWl0X3NldF9pbW1l ZGlhdGUgKHRhcmdldCwgYnVpbGRlcik7CgogIHVuc2lnbmVkIGludCBlbHRfc2l6ZSA9IGFhcmNo NjRfd2lkZXN0X3N2ZV9wcmVkX2VsdF9zaXplIChidWlsZGVyKTsKICBpZiAoaW50IHZsID0gYWFy Y2g2NF9wYXJ0aWFsX3B0cnVlX2xlbmd0aCAoYnVpbGRlciwgZWx0X3NpemUpKQogICAgewogICAg ICAvKiBJZiB3ZSBjYW4gbG9hZCB0aGUgY29uc3RhbnQgdXNpbmcgUFRSVUUsIHVzZSBpdCBhcy1p cy4gICovCiAgICAgIG1hY2hpbmVfbW9kZSBtb2RlID0gYWFyY2g2NF9zdmVfcHJlZF9tb2RlIChl bHRfc2l6ZSkucmVxdWlyZSAoKTsKICAgICAgaWYgKGFhcmNoNjRfc3ZwYXR0ZXJuX2Zvcl92bCAo bW9kZSwgdmwpICE9IEFBUkNINjRfTlVNX1NWUEFUVEVSTlMpCglyZXR1cm4gYWFyY2g2NF9lbWl0 X3NldF9pbW1lZGlhdGUgKHRhcmdldCwgYnVpbGRlcik7CgogICAgICAvKiBPdGhlcndpc2UgdXNl IFdISUxFIHRvIHNldCB0aGUgZmlyc3QgVkwgYml0cy4gICovCiAgICAgIHJldHVybiBhYXJjaDY0 X3N2ZV9tb3ZlX3ByZWRfdmlhX3doaWxlICh0YXJnZXQsIG1vZGUsIHZsKTsKICAgIH0KCiAgaWYg KCFhbGxvd19yZWN1cnNlX3ApCiAgICByZXR1cm4gTlVMTF9SVFg7CgogIC8qIFRyeSBpbnZlcnRp bmcgdGhlIHZlY3RvciBpbiBlbGVtZW50IHNpemUgRUxUX1NJWkUgYW5kIHRoZW4gRU9SaW5nCiAg ICAgdGhlIHJlc3VsdCB3aXRoIGFuIEVMVF9TSVpFIFBUUlVFLiAgKi8KICBpZiAoSU5UVkFMIChi dWlsZGVyLmVsdCAoMCkpID09IDApCiAgICBpZiAocnR4IHJlcyA9IGFhcmNoNjRfZXhwYW5kX3N2 ZV9jb25zdF9wcmVkX2VvciAodGFyZ2V0LCBidWlsZGVyLAoJCQkJCQkgICAgIGVsdF9zaXplKSkK ICAgICAgcmV0dXJuIHJlczsKCiAgLyogVHJ5IHVzaW5nIFRSTjEgdG8gcGVybXV0ZSB0d28gc2lt cGxlciBjb25zdGFudHMuICAqLwogIGZvciAodW5zaWduZWQgaW50IGkgPSBlbHRfc2l6ZTsgaSA8 PSA4OyBpICo9IDIpCiAgICBpZiAocnR4IHJlcyA9IGFhcmNoNjRfZXhwYW5kX3N2ZV9jb25zdF9w cmVkX3RybiAodGFyZ2V0LCBidWlsZGVyLAoJCQkJCQkgICAgIGVsdF9zaXplLCBpKSkKICAgICAg cmV0dXJuIHJlczsKCiAgcmV0dXJuIE5VTExfUlRYOwp9CgovKiBSZXR1cm4gYW4gU1ZFIHByZWRp Y2F0ZSByZWdpc3RlciB0aGF0IGNvbnRhaW5zIHRoZSBWTngxNkJJbW9kZQogICBjb25zdGFudCBp biBCVUlMREVSLCB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIG1vdmUgZXhwYW5kZXJzLgoKICAg VGhlIHJldHVybmVkIHJlZ2lzdGVyIGNhbiBoYXZlIHdoYXRldmVyIG1vZGUgc2VlbXMgbW9zdCBu YXR1cmFsCiAgIGdpdmVuIHRoZSBjb250ZW50cyBvZiBCVUlMREVSLiAgVXNlIFRBUkdFVCBmb3Ig dGhlIHJlc3VsdCBpZgogICBjb252ZW5pZW50LiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF9leHBh bmRfc3ZlX2NvbnN0X3ByZWQgKHJ0eCB0YXJnZXQsIHJ0eF92ZWN0b3JfYnVpbGRlciAmYnVpbGRl cikKewogIC8qIFRyeSBsb2FkaW5nIHRoZSBjb25zdGFudCB1c2luZyBwdXJlIHByZWRpY2F0ZSBv cGVyYXRpb25zLiAgKi8KICBpZiAocnR4IHJlcyA9IGFhcmNoNjRfZXhwYW5kX3N2ZV9jb25zdF9w cmVkXzEgKHRhcmdldCwgYnVpbGRlciwgdHJ1ZSkpCiAgICByZXR1cm4gcmVzOwoKICAvKiBUcnkg Zm9yY2luZyB0aGUgY29uc3RhbnQgdG8gbWVtb3J5LiAgKi8KICBpZiAoYnVpbGRlci5mdWxsX25l bHRzICgpLmlzX2NvbnN0YW50ICgpKQogICAgaWYgKHJ0eCBtZW0gPSBmb3JjZV9jb25zdF9tZW0g KFZOeDE2Qkltb2RlLCBidWlsZGVyLmJ1aWxkICgpKSkKICAgICAgewoJdGFyZ2V0ID0gYWFyY2g2 NF90YXJnZXRfcmVnICh0YXJnZXQsIFZOeDE2Qkltb2RlKTsKCWVtaXRfbW92ZV9pbnNuICh0YXJn ZXQsIG1lbSk7CglyZXR1cm4gdGFyZ2V0OwogICAgICB9CgogIC8qIFRoZSBsYXN0IHJlc29ydCBp cyB0byBsb2FkIHRoZSBjb25zdGFudCBhcyBhbiBpbnRlZ2VyIGFuZCB0aGVuCiAgICAgY29tcGFy ZSBpdCBhZ2FpbnN0IHplcm8uICBVc2UgLTEgZm9yIHNldCBiaXRzIGluIG9yZGVyIHRvIGluY3Jl YXNlCiAgICAgdGhlIGNoYW5nZXMgb2YgdXNpbmcgU1ZFIERVUE0gb3IgYW4gQWR2YW5jZWQgU0lN RCBieXRlIG1hc2suICAqLwogIHJ0eF92ZWN0b3JfYnVpbGRlciBpbnRfYnVpbGRlciAoVk54MTZR SW1vZGUsIGJ1aWxkZXIubnBhdHRlcm5zICgpLAoJCQkJICBidWlsZGVyLm5lbHRzX3Blcl9wYXR0 ZXJuICgpKTsKICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGJ1aWxkZXIuZW5jb2RlZF9u ZWx0cyAoKTsgKytpKQogICAgaW50X2J1aWxkZXIucXVpY2tfcHVzaCAoSU5UVkFMIChidWlsZGVy LmVsdCAoaSkpCgkJCSAgICA/IGNvbnN0bTFfcnR4IDogY29uc3QwX3J0eCk7CiAgcmV0dXJuIGFh cmNoNjRfY29udmVydF9zdmVfZGF0YV90b19wcmVkICh0YXJnZXQsIFZOeDE2Qkltb2RlLAoJCQkJ CSAgIGludF9idWlsZGVyLmJ1aWxkICgpKTsKfQoKLyogU2V0IERFU1QgdG8gaW1tZWRpYXRlIElN TS4gICovCgp2b2lkCmFhcmNoNjRfZXhwYW5kX21vdl9pbW1lZGlhdGUgKHJ0eCBkZXN0LCBydHgg aW1tKQp7CiAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRfTU9ERSAoZGVzdCk7CgogIC8qIENoZWNr IG9uIHdoYXQgdHlwZSBvZiBzeW1ib2wgaXQgaXMuICAqLwogIHNjYWxhcl9pbnRfbW9kZSBpbnRf bW9kZTsKICBpZiAoKFNZTUJPTF9SRUZfUCAoaW1tKQogICAgICAgfHwgTEFCRUxfUkVGX1AgKGlt bSkKICAgICAgIHx8IEdFVF9DT0RFIChpbW0pID09IENPTlNUCiAgICAgICB8fCBHRVRfQ09ERSAo aW1tKSA9PSBDT05TVF9QT0xZX0lOVCkKICAgICAgJiYgaXNfYSA8c2NhbGFyX2ludF9tb2RlPiAo bW9kZSwgJmludF9tb2RlKSkKICAgIHsKICAgICAgcnR4IG1lbTsKICAgICAgcG9seV9pbnQ2NCBv ZmZzZXQ7CiAgICAgIEhPU1RfV0lERV9JTlQgY29uc3Rfb2Zmc2V0OwogICAgICBlbnVtIGFhcmNo NjRfc3ltYm9sX3R5cGUgc3R5OwoKICAgICAgLyogSWYgd2UgaGF2ZSAoY29uc3QgKHBsdXMgc3lt Ym9sIG9mZnNldCkpLCBzZXBhcmF0ZSBvdXQgdGhlIG9mZnNldAoJIGJlZm9yZSB3ZSBzdGFydCBj bGFzc2lmeWluZyB0aGUgc3ltYm9sLiAgKi8KICAgICAgcnR4IGJhc2UgPSBzdHJpcF9vZmZzZXQg KGltbSwgJm9mZnNldCk7CgogICAgICAvKiBXZSBtdXN0IGFsd2F5cyBhZGQgYW4gb2Zmc2V0IGlu dm9sdmluZyBWTCBzZXBhcmF0ZWx5LCByYXRoZXIgdGhhbgoJIGZvbGRpbmcgaXQgaW50byB0aGUg cmVsb2NhdGlvbi4gICovCiAgICAgIGlmICghb2Zmc2V0LmlzX2NvbnN0YW50ICgmY29uc3Rfb2Zm c2V0KSkKCXsKCSAgaWYgKCFUQVJHRVRfU1ZFKQoJICAgIHsKCSAgICAgIGFhcmNoNjRfcmVwb3J0 X3N2ZV9yZXF1aXJlZCAoKTsKCSAgICAgIHJldHVybjsKCSAgICB9CgkgIGlmIChiYXNlID09IGNv bnN0MF9ydHggJiYgYWFyY2g2NF9zdmVfY250X2ltbWVkaWF0ZV9wIChvZmZzZXQpKQoJICAgIGVt aXRfaW5zbiAoZ2VuX3J0eF9TRVQgKGRlc3QsIGltbSkpOwoJICBlbHNlCgkgICAgewoJICAgICAg LyogRG8gYXJpdGhtZXRpYyBvbiAzMi1iaXQgdmFsdWVzIGlmIHRoZSByZXN1bHQgaXMgc21hbGxl cgoJCSB0aGFuIHRoYXQuICAqLwoJICAgICAgaWYgKHBhcnRpYWxfc3VicmVnX3AgKGludF9tb2Rl LCBTSW1vZGUpKQoJCXsKCQkgIC8qIEl0IGlzIGludmFsaWQgdG8gZG8gc3ltYm9sIGNhbGN1bGF0 aW9ucyBpbiBtb2RlcwoJCSAgICAgbmFycm93ZXIgdGhhbiBTSW1vZGUuICAqLwoJCSAgZ2NjX2Fz c2VydCAoYmFzZSA9PSBjb25zdDBfcnR4KTsKCQkgIGRlc3QgPSBnZW5fbG93cGFydCAoU0ltb2Rl LCBkZXN0KTsKCQkgIGludF9tb2RlID0gU0ltb2RlOwoJCX0KCSAgICAgIGlmIChiYXNlICE9IGNv bnN0MF9ydHgpCgkJewoJCSAgYmFzZSA9IGFhcmNoNjRfZm9yY2VfdGVtcG9yYXJ5IChpbnRfbW9k ZSwgZGVzdCwgYmFzZSk7CgkJICBhYXJjaDY0X2FkZF9vZmZzZXQgKGludF9tb2RlLCBkZXN0LCBi YXNlLCBvZmZzZXQsCgkJCQkgICAgICBOVUxMX1JUWCwgTlVMTF9SVFgsIGZhbHNlKTsKCQl9Cgkg ICAgICBlbHNlCgkJYWFyY2g2NF9hZGRfb2Zmc2V0IChpbnRfbW9kZSwgZGVzdCwgYmFzZSwgb2Zm c2V0LAoJCQkJICAgIGRlc3QsIE5VTExfUlRYLCBmYWxzZSk7CgkgICAgfQoJICByZXR1cm47Cgl9 CgogICAgICBzdHkgPSBhYXJjaDY0X2NsYXNzaWZ5X3N5bWJvbCAoYmFzZSwgY29uc3Rfb2Zmc2V0 KTsKICAgICAgc3dpdGNoIChzdHkpCgl7CgljYXNlIFNZTUJPTF9GT1JDRV9UT19NRU06CgkgIGlm IChpbnRfbW9kZSAhPSBwdHJfbW9kZSkKCSAgICBpbW0gPSBjb252ZXJ0X21lbW9yeV9hZGRyZXNz IChwdHJfbW9kZSwgaW1tKTsKCgkgIGlmIChjb25zdF9vZmZzZXQgIT0gMAoJICAgICAgJiYgdGFy Z2V0bS5jYW5ub3RfZm9yY2VfY29uc3RfbWVtIChwdHJfbW9kZSwgaW1tKSkKCSAgICB7CgkgICAg ICBnY2NfYXNzZXJ0IChjYW5fY3JlYXRlX3BzZXVkb19wICgpKTsKCSAgICAgIGJhc2UgPSBhYXJj aDY0X2ZvcmNlX3RlbXBvcmFyeSAoaW50X21vZGUsIGRlc3QsIGJhc2UpOwoJICAgICAgYWFyY2g2 NF9hZGRfb2Zmc2V0IChpbnRfbW9kZSwgZGVzdCwgYmFzZSwgY29uc3Rfb2Zmc2V0LAoJCQkJICBO VUxMX1JUWCwgTlVMTF9SVFgsIGZhbHNlKTsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICBtZW0g PSBmb3JjZV9jb25zdF9tZW0gKHB0cl9tb2RlLCBpbW0pOwoJICBnY2NfYXNzZXJ0IChtZW0pOwoK CSAgLyogSWYgd2UgYXJlbid0IGdlbmVyYXRpbmcgUEMgcmVsYXRpdmUgbGl0ZXJhbHMsIHRoZW4K CSAgICAgd2UgbmVlZCB0byBleHBhbmQgdGhlIGxpdGVyYWwgcG9vbCBhY2Nlc3MgY2FyZWZ1bGx5 LgoJICAgICBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaW4gYSBudW1i ZXIKCSAgICAgb2YgcGxhY2VzLCBzbyBjb3VsZCB3ZWxsIGxpdmUgYXMgYSBzZXBhcmF0ZSBmdW5j dGlvbi4gICovCgkgIGlmICghYWFyY2g2NF9wY3JlbGF0aXZlX2xpdGVyYWxfbG9hZHMpCgkgICAg ewoJICAgICAgZ2NjX2Fzc2VydCAoY2FuX2NyZWF0ZV9wc2V1ZG9fcCAoKSk7CgkgICAgICBiYXNl ID0gZ2VuX3JlZ19ydHggKHB0cl9tb2RlKTsKCSAgICAgIGFhcmNoNjRfZXhwYW5kX21vdl9pbW1l ZGlhdGUgKGJhc2UsIFhFWFAgKG1lbSwgMCkpOwoJICAgICAgaWYgKHB0cl9tb2RlICE9IFBtb2Rl KQoJCWJhc2UgPSBjb252ZXJ0X21lbW9yeV9hZGRyZXNzIChQbW9kZSwgYmFzZSk7CgkgICAgICBt ZW0gPSBnZW5fcnR4X01FTSAocHRyX21vZGUsIGJhc2UpOwoJICAgIH0KCgkgIGlmIChpbnRfbW9k ZSAhPSBwdHJfbW9kZSkKCSAgICBtZW0gPSBnZW5fcnR4X1pFUk9fRVhURU5EIChpbnRfbW9kZSwg bWVtKTsKCgkgIGVtaXRfaW5zbiAoZ2VuX3J0eF9TRVQgKGRlc3QsIG1lbSkpOwoKCSAgcmV0dXJu OwoKICAgICAgICBjYXNlIFNZTUJPTF9TTUFMTF9UTFNHRDoKICAgICAgICBjYXNlIFNZTUJPTF9T TUFMTF9UTFNERVNDOgoJY2FzZSBTWU1CT0xfU01BTExfVExTSUU6CgljYXNlIFNZTUJPTF9TTUFM TF9HT1RfMjhLOgoJY2FzZSBTWU1CT0xfU01BTExfR09UXzRHOgoJY2FzZSBTWU1CT0xfVElOWV9H T1Q6CgljYXNlIFNZTUJPTF9USU5ZX1RMU0lFOgoJICBpZiAoY29uc3Rfb2Zmc2V0ICE9IDApCgkg ICAgewoJICAgICAgZ2NjX2Fzc2VydChjYW5fY3JlYXRlX3BzZXVkb19wICgpKTsKCSAgICAgIGJh c2UgPSBhYXJjaDY0X2ZvcmNlX3RlbXBvcmFyeSAoaW50X21vZGUsIGRlc3QsIGJhc2UpOwoJICAg ICAgYWFyY2g2NF9hZGRfb2Zmc2V0IChpbnRfbW9kZSwgZGVzdCwgYmFzZSwgY29uc3Rfb2Zmc2V0 LAoJCQkJICBOVUxMX1JUWCwgTlVMTF9SVFgsIGZhbHNlKTsKCSAgICAgIHJldHVybjsKCSAgICB9 CgkgIC8qIEZBTExUSFJVICovCgoJY2FzZSBTWU1CT0xfU01BTExfQUJTT0xVVEU6CgljYXNlIFNZ TUJPTF9USU5ZX0FCU09MVVRFOgoJY2FzZSBTWU1CT0xfVExTTEUxMjoKCWNhc2UgU1lNQk9MX1RM U0xFMjQ6CgljYXNlIFNZTUJPTF9UTFNMRTMyOgoJY2FzZSBTWU1CT0xfVExTTEU0ODoKCSAgYWFy Y2g2NF9sb2FkX3N5bXJlZl9hcHByb3ByaWF0ZWx5IChkZXN0LCBpbW0sIHN0eSk7CgkgIHJldHVy bjsKCglkZWZhdWx0OgoJICBnY2NfdW5yZWFjaGFibGUgKCk7Cgl9CiAgICB9CgogIGlmICghQ09O U1RfSU5UX1AgKGltbSkpCiAgICB7CiAgICAgIGlmIChHRVRfTU9ERV9DTEFTUyAobW9kZSkgPT0g TU9ERV9WRUNUT1JfQk9PTCkKCXsKCSAgLyogT25seSB0aGUgbG93IGJpdCBvZiBlYWNoIC5ILCAu UyBhbmQgLkQgZWxlbWVudCBpcyBkZWZpbmVkLAoJICAgICBzbyB3ZSBjYW4gc2V0IHRoZSB1cHBl ciBiaXRzIHRvIHdoYXRldmVyIHdlIGxpa2UuICBJZiB0aGUKCSAgICAgcHJlZGljYXRlIGlzIGFs bC10cnVlIGluIE1PREUsIHByZWZlciB0byBzZXQgYWxsIHRoZSB1bmRlZmluZWQKCSAgICAgYml0 cyBhcyB3ZWxsLCBzbyB0aGF0IHdlIGNhbiBzaGFyZSBhIHNpbmdsZSAuQiBwcmVkaWNhdGUgZm9y CgkgICAgIGFsbCBtb2Rlcy4gICovCgkgIGlmIChpbW0gPT0gQ09OU1RNMV9SVFggKG1vZGUpKQoJ ICAgIGltbSA9IENPTlNUTTFfUlRYIChWTngxNkJJbW9kZSk7CgoJICAvKiBBbGwgbWV0aG9kcyBm b3IgY29uc3RydWN0aW5nIHByZWRpY2F0ZSBtb2RlcyB3aWRlciB0aGFuIFZOeDE2QkkKCSAgICAg d2lsbCBzZXQgdGhlIHVwcGVyIGJpdHMgb2YgZWFjaCBlbGVtZW50IHRvIHplcm8uICBFeHBvc2Ug dGhpcwoJICAgICBieSBtb3Zpbmcgc3VjaCBjb25zdGFudHMgYXMgYSBWTngxNkJJLCBzbyB0aGF0 IGFsbCBiaXRzIGFyZQoJICAgICBzaWduaWZpY2FudCBhbmQgc28gdGhhdCBjb25zdGFudHMgZm9y IGRpZmZlcmVudCBtb2RlcyBjYW4gYmUKCSAgICAgc2hhcmVkLiAgVGhlIHdpZGVyIGNvbnN0YW50 IHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlIGFzIGEKCSAgICAgUkVHX0VRVUFMIG5vdGUuICAqLwoJ ICBydHhfdmVjdG9yX2J1aWxkZXIgYnVpbGRlcjsKCSAgaWYgKGFhcmNoNjRfZ2V0X3N2ZV9wcmVk X2JpdHMgKGJ1aWxkZXIsIGltbSkpCgkgICAgewoJICAgICAgcnR4IHJlcyA9IGFhcmNoNjRfZXhw YW5kX3N2ZV9jb25zdF9wcmVkIChkZXN0LCBidWlsZGVyKTsKCSAgICAgIGlmIChkZXN0ICE9IHJl cykKCQllbWl0X21vdmVfaW5zbiAoZGVzdCwgZ2VuX2xvd3BhcnQgKG1vZGUsIHJlcykpOwoJICAg ICAgcmV0dXJuOwoJICAgIH0KCX0KCiAgICAgIGlmIChHRVRfQ09ERSAoaW1tKSA9PSBISUdICgkg IHx8IGFhcmNoNjRfc2ltZF92YWxpZF9pbW1lZGlhdGUgKGltbSwgTlVMTCkpCgl7CgkgIGVtaXRf aW5zbiAoZ2VuX3J0eF9TRVQgKGRlc3QsIGltbSkpOwoJICByZXR1cm47Cgl9CgogICAgICBpZiAo Q09OU1RfVkVDVE9SX1AgKGltbSkgJiYgYWFyY2g2NF9zdmVfZGF0YV9tb2RlX3AgKG1vZGUpKQoJ aWYgKHJ0eCByZXMgPSBhYXJjaDY0X2V4cGFuZF9zdmVfY29uc3RfdmVjdG9yIChkZXN0LCBpbW0p KQoJICB7CgkgICAgaWYgKGRlc3QgIT0gcmVzKQoJICAgICAgZW1pdF9pbnNuIChnZW5fYWFyY2g2 NF9zdmVfcmVpbnRlcnByZXQgKG1vZGUsIGRlc3QsIHJlcykpOwoJICAgIHJldHVybjsKCSAgfQoK ICAgICAgcnR4IG1lbSA9IGZvcmNlX2NvbnN0X21lbSAobW9kZSwgaW1tKTsKICAgICAgZ2NjX2Fz c2VydCAobWVtKTsKICAgICAgZW1pdF9tb3ZlX2luc24gKGRlc3QsIG1lbSk7CiAgICAgIHJldHVy bjsKICAgIH0KCiAgYWFyY2g2NF9pbnRlcm5hbF9tb3ZfaW1tZWRpYXRlIChkZXN0LCBpbW0sIHRy dWUsIG1vZGUpOwp9CgovKiBSZXR1cm4gdGhlIE1FTSBydHggdGhhdCBwcm92aWRlcyB0aGUgY2Fu YXJ5IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQKICAgZm9yIHN0YWNrLXNtYXNoaW5nIHByb3Rl Y3Rpb24uICBNT0RFIGlzIHRoZSBtb2RlIG9mIHRoZSBtZW1vcnkuCiAgIEZvciBTU1BfR0xPQkFM LCBERUNMX1JUTCBpcyB0aGUgTUVNIHJ0eCBmb3IgdGhlIGNhbmFyeSB2YXJpYWJsZQogICAoX19z dGFja19jaGtfZ3VhcmQpLCBvdGhlcndpc2UgaXQgaGFzIG5vIHVzZWZ1bCB2YWx1ZS4gIFNBTFRf VFlQRQogICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FsbGVyIGlzIHBlcmZvcm1pbmcgYSBTRVQg b3IgYSBURVNUIG9wZXJhdGlvbi4gICovCgpydHgKYWFyY2g2NF9zdGFja19wcm90ZWN0X2NhbmFy eV9tZW0gKG1hY2hpbmVfbW9kZSBtb2RlLCBydHggZGVjbF9ydGwsCgkJCQkgIGFhcmNoNjRfc2Fs dF90eXBlIHNhbHRfdHlwZSkKewogIHJ0eCBhZGRyOwogIGlmIChhYXJjaDY0X3N0YWNrX3Byb3Rl Y3Rvcl9ndWFyZCA9PSBTU1BfR0xPQkFMKQogICAgewogICAgICBnY2NfYXNzZXJ0IChNRU1fUCAo ZGVjbF9ydGwpKTsKICAgICAgYWRkciA9IFhFWFAgKGRlY2xfcnRsLCAwKTsKICAgICAgcG9seV9p bnQ2NCBvZmZzZXQ7CiAgICAgIHJ0eCBiYXNlID0gc3RyaXBfb2Zmc2V0X2FuZF9zYWx0IChhZGRy LCAmb2Zmc2V0KTsKICAgICAgaWYgKCFTWU1CT0xfUkVGX1AgKGJhc2UpKQoJcmV0dXJuIGRlY2xf cnRsOwoKICAgICAgcnR2ZWMgdiA9IGdlbl9ydHZlYyAoMiwgYmFzZSwgR0VOX0lOVCAoc2FsdF90 eXBlKSk7CiAgICAgIGFkZHIgPSBnZW5fcnR4X1VOU1BFQyAoUG1vZGUsIHYsIFVOU1BFQ19TQUxU X0FERFIpOwogICAgICBhZGRyID0gZ2VuX3J0eF9DT05TVCAoUG1vZGUsIGFkZHIpOwogICAgICBh ZGRyID0gcGx1c19jb25zdGFudCAoUG1vZGUsIGFkZHIsIG9mZnNldCk7CiAgICB9CiAgZWxzZQog ICAgewogICAgICAvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3MgZnJvbSB0aGUgc3lzdGVtIHJlZ2lz dGVyLiAgKi8KICAgICAgcnR4IHNhbHQgPSBHRU5fSU5UIChzYWx0X3R5cGUpOwogICAgICBhZGRy ID0gZ2VuX3JlZ19ydHggKG1vZGUpOwogICAgICBpZiAobW9kZSA9PSBESW1vZGUpCgllbWl0X2lu c24gKGdlbl9yZWdfc3RhY2tfcHJvdGVjdF9hZGRyZXNzX2RpIChhZGRyLCBzYWx0KSk7CiAgICAg IGVsc2UKCXsKCSAgZW1pdF9pbnNuIChnZW5fcmVnX3N0YWNrX3Byb3RlY3RfYWRkcmVzc19zaSAo YWRkciwgc2FsdCkpOwoJICBhZGRyID0gY29udmVydF9tZW1vcnlfYWRkcmVzcyAoUG1vZGUsIGFk ZHIpOwoJfQogICAgICBhZGRyID0gcGx1c19jb25zdGFudCAoUG1vZGUsIGFkZHIsIGFhcmNoNjRf c3RhY2tfcHJvdGVjdG9yX2d1YXJkX29mZnNldCk7CiAgICB9CiAgcmV0dXJuIGdlbl9ydHhfTUVN IChtb2RlLCBmb3JjZV9yZWcgKFBtb2RlLCBhZGRyKSk7Cn0KCi8qIEVtaXQgYW4gU1ZFIHByZWRp Y2F0ZWQgbW92ZSBmcm9tIFNSQyB0byBERVNULiAgUFJFRCBpcyBhIHByZWRpY2F0ZQogICB0aGF0 IGlzIGtub3duIHRvIGNvbnRhaW4gUFRSVUUuICAqLwoKdm9pZAphYXJjaDY0X2VtaXRfc3ZlX3By ZWRfbW92ZSAocnR4IGRlc3QsIHJ0eCBwcmVkLCBydHggc3JjKQp7CiAgZXhwYW5kX29wZXJhbmQg b3BzWzNdOwogIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKGRlc3QpOwogIGNyZWF0ZV9v dXRwdXRfb3BlcmFuZCAoJm9wc1swXSwgZGVzdCwgbW9kZSk7CiAgY3JlYXRlX2lucHV0X29wZXJh bmQgKCZvcHNbMV0sIHByZWQsIEdFVF9NT0RFKHByZWQpKTsKICBjcmVhdGVfaW5wdXRfb3BlcmFu ZCAoJm9wc1syXSwgc3JjLCBtb2RlKTsKICB0ZW1wb3Jhcnlfdm9sYXRpbGVfb2sgdiAodHJ1ZSk7 CiAgZXhwYW5kX2luc24gKGNvZGVfZm9yX2FhcmNoNjRfcHJlZF9tb3YgKG1vZGUpLCAzLCBvcHMp Owp9CgovKiBFeHBhbmQgYSBwcmUtUkEgU1ZFIGRhdGEgbW92ZSBmcm9tIFNSQyB0byBERVNUIGlu IHdoaWNoIGF0IGxlYXN0IG9uZQogICBvcGVyYW5kIGlzIGluIG1lbW9yeS4gIEluIHRoaXMgY2Fz ZSB3ZSBuZWVkIHRvIHVzZSB0aGUgcHJlZGljYXRlZCBMRDEKICAgYW5kIFNUMSBpbnN0ZWFkIG9m IExEUiBhbmQgU1RSLCBib3RoIGZvciBjb3JyZWN0bmVzcyBvbiBiaWctZW5kaWFuCiAgIHRhcmdl dHMgYW5kIGJlY2F1c2UgTEQxIGFuZCBTVDEgc3VwcG9ydCBhIHdpZGVyIHJhbmdlIG9mIGFkZHJl c3NpbmcgbW9kZXMuCiAgIFBSRURfTU9ERSBpcyB0aGUgbW9kZSBvZiB0aGUgcHJlZGljYXRlLgoK ICAgU2VlIHRoZSBjb21tZW50IGF0IHRoZSBoZWFkIG9mIGFhcmNoNjQtc3ZlLm1kIGZvciBkZXRh aWxzIGFib3V0IHRoZQogICBiaWctZW5kaWFuIGhhbmRsaW5nLiAgKi8KCnZvaWQKYWFyY2g2NF9l eHBhbmRfc3ZlX21lbV9tb3ZlIChydHggZGVzdCwgcnR4IHNyYywgbWFjaGluZV9tb2RlIHByZWRf bW9kZSkKewogIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKGRlc3QpOwogIHJ0eCBwdHJ1 ZSA9IGFhcmNoNjRfcHRydWVfcmVnIChwcmVkX21vZGUpOwogIGlmICghcmVnaXN0ZXJfb3BlcmFu ZCAoc3JjLCBtb2RlKQogICAgICAmJiAhcmVnaXN0ZXJfb3BlcmFuZCAoZGVzdCwgbW9kZSkpCiAg ICB7CiAgICAgIHJ0eCB0bXAgPSBnZW5fcmVnX3J0eCAobW9kZSk7CiAgICAgIGlmIChNRU1fUCAo c3JjKSkKCWFhcmNoNjRfZW1pdF9zdmVfcHJlZF9tb3ZlICh0bXAsIHB0cnVlLCBzcmMpOwogICAg ICBlbHNlCgllbWl0X21vdmVfaW5zbiAodG1wLCBzcmMpOwogICAgICBzcmMgPSB0bXA7CiAgICB9 CiAgYWFyY2g2NF9lbWl0X3N2ZV9wcmVkX21vdmUgKGRlc3QsIHB0cnVlLCBzcmMpOwp9CgovKiBD YWxsZWQgb25seSBvbiBiaWctZW5kaWFuIHRhcmdldHMuICBTZWUgd2hldGhlciBhbiBTVkUgdmVj dG9yIG1vdmUKICAgZnJvbSBTUkMgdG8gREVTVCBpcyBlZmZlY3RpdmVseSBhIFJFVltCSFddIGlu c3RydWN0aW9uLCBiZWNhdXNlIGF0CiAgIGxlYXN0IG9uZSBvcGVyYW5kIGlzIGEgc3VicmVnIG9m IGFuIFNWRSB2ZWN0b3IgdGhhdCBoYXMgd2lkZXIgb3IKICAgbmFycm93ZXIgZWxlbWVudHMuICBS ZXR1cm4gdHJ1ZSBhbmQgZW1pdCB0aGUgaW5zdHJ1Y3Rpb24gaWYgc28uCgogICBGb3IgZXhhbXBs ZToKCiAgICAgKHNldCAocmVnOlZOeDhISSBSMSkgKHN1YnJlZzpWTng4SEkgKHJlZzpWTngxNlFJ IFIyKSAwKSkKCiAgIHJlcHJlc2VudHMgYSBWSUVXX0NPTlZFUlQgYmV0d2VlbiB0aGUgZm9sbG93 aW5nIHZlY3RvcnMsIHZpZXdlZAogICBpbiBtZW1vcnkgb3JkZXI6CgogICAgIFIyOiB7IFswXS5o aWdoLCBbMF0ubG93LCAgWzFdLmhpZ2gsIFsxXS5sb3csIC4uLiB9CiAgICAgUjE6IHsgWzBdLCAg ICAgIFsxXSwgICAgICBbMl0sICAgICAgWzNdLCAgICAgLi4uIH0KCiAgIFRoZSBoaWdoIHBhcnQg b2YgbGFuZSBYIGluIFIyIHNob3VsZCB0aGVyZWZvcmUgY29ycmVzcG9uZCB0byBsYW5lIFgqMgog ICBvZiBSMSwgYnV0IHRoZSByZWdpc3RlciByZXByZXNlbnRhdGlvbnMgYXJlOgoKICAgICAgICAg bXNiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc2IKICAgICBSMjogLi4u Li4uIFsxXS5oaWdoICBbMV0ubG93ICAgWzBdLmhpZ2ggIFswXS5sb3cKICAgICBSMTogLi4uLi4u IFszXSAgICAgICBbMl0gICAgICAgWzFdICAgICAgIFswXQoKICAgd2hlcmUgdGhlIGxvdyBwYXJ0 IG9mIGxhbmUgWCBpbiBSMiBjb3JyZXNwb25kcyB0byBsYW5lIFgqMiBpbiBSMS4KICAgV2UgdGhl cmVmb3JlIG5lZWQgYSByZXZlcnNlIG9wZXJhdGlvbiB0byBzd2FwIHRoZSBoaWdoIGFuZCBsb3cg dmFsdWVzCiAgIGFyb3VuZC4KCiAgIFRoaXMgaXMgcHVyZWx5IGFuIG9wdGltaXphdGlvbi4gIFdp dGhvdXQgaXQgd2Ugd291bGQgc3BpbGwgdGhlCiAgIHN1YnJlZyBvcGVyYW5kIHRvIHRoZSBzdGFj ayBpbiBvbmUgbW9kZSBhbmQgcmVsb2FkIGl0IGluIHRoZQogICBvdGhlciBtb2RlLCB3aGljaCBo YXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBSRVYuICAqLwoKYm9vbAphYXJjaDY0X21heWJlX2V4 cGFuZF9zdmVfc3VicmVnX21vdmUgKHJ0eCBkZXN0LCBydHggc3JjKQp7CiAgZ2NjX2Fzc2VydCAo QllURVNfQklHX0VORElBTik7CgogIC8qIERvIG5vdCB0cnkgdG8gb3B0aW1pemUgc3VicmVncyB0 aGF0IExSQSBoYXMgY3JlYXRlZCBmb3IgbWF0Y2hlZAogICAgIHJlbG9hZHMuICBUaGVzZSBzdWJy ZWdzIG9ubHkgZXhpc3QgYXMgYSB0ZW1wb3JhcnkgbWVhc3VyZSB0byBtYWtlCiAgICAgdGhlIFJU TCB3ZWxsLWZvcm1lZCwgYnV0IHRoZXkgYXJlIGV4ZW1wdCBmcm9tIHRoZSB1c3VhbAogICAgIFRB UkdFVF9DQU5fQ0hBTkdFX01PREVfQ0xBU1MgcnVsZXMuCgogICAgIEZvciBleGFtcGxlLCBpZiB3 ZSBoYXZlOgoKICAgICAgIChzZXQgKHJlZzpWTng4SEkgUjEpIChmb286Vk54OEhJIChyZWc6Vk54 NFNJIFIyKSkpCgogICAgIGFuZCB0aGUgY29uc3RyYWludHMgcmVxdWlyZSBSMSBhbmQgUjIgdG8g YmUgaW4gdGhlIHNhbWUgcmVnaXN0ZXIsCiAgICAgTFJBIG1heSBuZWVkIHRvIGNyZWF0ZSBSVEwg c3VjaCBhczoKCiAgICAgICAoc2V0IChzdWJyZWc6Vk54NFNJIChyZWc6Vk54OEhJIFRNUCkgMCkg KHJlZzpWTng0U0kgUjIpKQogICAgICAgKHNldCAocmVnOlZOeDhISSBUTVApIChmb286Vk54OEhJ IChzdWJyZWc6Vk54NFNJIChyZWc6Vk54OEhJIFRNUCkgMCkpKQogICAgICAgKHNldCAocmVnOlZO eDhISSBSMSkgKHJlZzpWTng4SEkgVE1QKSkKCiAgICAgd2hpY2ggZm9yY2VzIGJvdGggdGhlIGlu cHV0IGFuZCBvdXRwdXQgb2YgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uCiAgICAgdG8gdXNlIHRo ZSBzYW1lIGhhcmQgcmVnaXN0ZXIuICBCdXQgZm9yIHRoaXMgdG8gd29yaywgdGhlIG5vcm1hbAog ICAgIHJ1bGVzIGhhdmUgdG8gYmUgc3VwcHJlc3NlZCBvbiB0aGUgc3VicmVnIGlucHV0LCBvdGhl cndpc2UgTFJBCiAgICAgd291bGQgbmVlZCB0byByZWxvYWQgdGhhdCBpbnB1dCB0b28sIG1lYW5p bmcgdGhhdCB0aGUgcHJvY2VzcwogICAgIHdvdWxkIG5ldmVyIHRlcm1pbmF0ZS4gIFRvIGNvbXBl bnNhdGUgZm9yIHRoaXMsIHRoZSBub3JtYWwgcnVsZXMKICAgICBhcmUgYWxzbyBzdXBwcmVzc2Vk IGZvciB0aGUgc3VicmVnIG91dHB1dCBvZiB0aGUgZmlyc3QgbW92ZS4KICAgICBJZ25vcmluZyB0 aGUgc3BlY2lhbCBjYXNlIGFuZCBoYW5kbGluZyB0aGUgZmlyc3QgbW92ZSBub3JtYWxseQogICAg IHdvdWxkIHRoZXJlZm9yZSBnZW5lcmF0ZSB3cm9uZyBjb2RlOiB3ZSB3b3VsZCByZXZlcnNlIHRo ZSBlbGVtZW50cwogICAgIGZvciB0aGUgZmlyc3Qgc3VicmVnIGJ1dCBub3QgcmV2ZXJzZSB0aGVt IGJhY2sgZm9yIHRoZSBzZWNvbmQgc3VicmVnLiAgKi8KICBpZiAoU1VCUkVHX1AgKGRlc3QpICYm ICFMUkFfU1VCUkVHX1AgKGRlc3QpKQogICAgZGVzdCA9IFNVQlJFR19SRUcgKGRlc3QpOwogIGlm IChTVUJSRUdfUCAoc3JjKSAmJiAhTFJBX1NVQlJFR19QIChzcmMpKQogICAgc3JjID0gU1VCUkVH X1JFRyAoc3JjKTsKCiAgLyogVGhlIG9wdGltaXphdGlvbiBoYW5kbGVzIHR3byBzaW5nbGUgU1ZF IFJFR3Mgd2l0aCBkaWZmZXJlbnQgZWxlbWVudAogICAgIHNpemVzLiAgKi8KICBpZiAoIVJFR19Q IChkZXN0KQogICAgICB8fCAhUkVHX1AgKHNyYykKICAgICAgfHwgYWFyY2g2NF9jbGFzc2lmeV92 ZWN0b3JfbW9kZSAoR0VUX01PREUgKGRlc3QpKSAhPSBWRUNfU1ZFX0RBVEEKICAgICAgfHwgYWFy Y2g2NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAoR0VUX01PREUgKHNyYykpICE9IFZFQ19TVkVfREFU QQogICAgICB8fCAoR0VUX01PREVfVU5JVF9TSVpFIChHRVRfTU9ERSAoZGVzdCkpCgkgID09IEdF VF9NT0RFX1VOSVRfU0laRSAoR0VUX01PREUgKHNyYykpKSkKICAgIHJldHVybiBmYWxzZTsKCiAg LyogR2VuZXJhdGUgKmFhcmNoNjRfc3ZlX21vdjxtb2RlPl9zdWJyZWdfYmUuICAqLwogIHJ0eCBw dHJ1ZSA9IGFhcmNoNjRfcHRydWVfcmVnIChWTngxNkJJbW9kZSk7CiAgcnR4IHVuc3BlYyA9IGdl bl9ydHhfVU5TUEVDIChHRVRfTU9ERSAoZGVzdCksIGdlbl9ydHZlYyAoMiwgcHRydWUsIHNyYyks CgkJCSAgICAgICBVTlNQRUNfUkVWX1NVQlJFRyk7CiAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAo ZGVzdCwgdW5zcGVjKSk7CiAgcmV0dXJuIHRydWU7Cn0KCi8qIFJldHVybiBhIGNvcHkgb2YgWCB3 aXRoIG1vZGUgTU9ERSwgd2l0aG91dCBjaGFuZ2luZyBpdHMgb3RoZXIKICAgYXR0cmlidXRlcy4g IFVubGlrZSBnZW5fbG93cGFydCwgdGhpcyBkb2Vzbid0IGNhcmUgd2hldGhlciB0aGUKICAgbW9k ZSBjaGFuZ2UgaXMgdmFsaWQuICAqLwoKcnR4CmFhcmNoNjRfcmVwbGFjZV9yZWdfbW9kZSAocnR4 IHgsIG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgaWYgKEdFVF9NT0RFICh4KSA9PSBtb2RlKQogICAg cmV0dXJuIHg7CgogIHggPSBzaGFsbG93X2NvcHlfcnR4ICh4KTsKICBzZXRfbW9kZV9hbmRfcmVn bm8gKHgsIG1vZGUsIFJFR05PICh4KSk7CiAgcmV0dXJuIHg7Cn0KCi8qIFJldHVybiB0aGUgU1ZF IFJFVltCSFddIHVuc3BlYyBmb3IgcmV2ZXJzaW5nIHF1YW50aXRlcyBvZiBtb2RlIE1PREUKICAg c3RvcmVkIGluIHdpZGVyIGludGVnZXIgY29udGFpbmVycy4gICovCgpzdGF0aWMgdW5zaWduZWQg aW50CmFhcmNoNjRfc3ZlX3Jldl91bnNwZWMgKG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgc3dpdGNo IChHRVRfTU9ERV9VTklUX1NJWkUgKG1vZGUpKQogICAgewogICAgY2FzZSAxOiByZXR1cm4gVU5T UEVDX1JFVkI7CiAgICBjYXNlIDI6IHJldHVybiBVTlNQRUNfUkVWSDsKICAgIGNhc2UgNDogcmV0 dXJuIFVOU1BFQ19SRVZXOwogICAgfQogIGdjY191bnJlYWNoYWJsZSAoKTsKfQoKLyogU3BsaXQg YSAqYWFyY2g2NF9zdmVfbW92PG1vZGU+X3N1YnJlZ19iZSBwYXR0ZXJuIHdpdGggdGhlIGdpdmVu CiAgIG9wZXJhbmRzLiAgKi8KCnZvaWQKYWFyY2g2NF9zcGxpdF9zdmVfc3VicmVnX21vdmUgKHJ0 eCBkZXN0LCBydHggcHRydWUsIHJ0eCBzcmMpCnsKICAvKiBEZWNpZGUgd2hpY2ggUkVWIG9wZXJh dGlvbiB3ZSBuZWVkLiAgVGhlIG1vZGUgd2l0aCB3aWRlciBlbGVtZW50cwogICAgIGRldGVybWlu ZXMgdGhlIG1vZGUgb2YgdGhlIG9wZXJhbmRzIGFuZCB0aGUgbW9kZSB3aXRoIHRoZSBuYXJyb3dl cgogICAgIGVsZW1lbnRzIGRldGVybWluZXMgdGhlIHJldmVyc2Ugd2lkdGguICAqLwogIG1hY2hp bmVfbW9kZSBtb2RlX3dpdGhfd2lkZXJfZWx0cyA9IGFhcmNoNjRfc3ZlX2ludF9tb2RlIChHRVRf TU9ERSAoZGVzdCkpOwogIG1hY2hpbmVfbW9kZSBtb2RlX3dpdGhfbmFycm93ZXJfZWx0cyA9IGFh cmNoNjRfc3ZlX2ludF9tb2RlIChHRVRfTU9ERSAoc3JjKSk7CiAgaWYgKEdFVF9NT0RFX1VOSVRf U0laRSAobW9kZV93aXRoX3dpZGVyX2VsdHMpCiAgICAgIDwgR0VUX01PREVfVU5JVF9TSVpFICht b2RlX3dpdGhfbmFycm93ZXJfZWx0cykpCiAgICBzdGQ6OnN3YXAgKG1vZGVfd2l0aF93aWRlcl9l bHRzLCBtb2RlX3dpdGhfbmFycm93ZXJfZWx0cyk7CgogIHVuc2lnbmVkIGludCB1bnNwZWMgPSBh YXJjaDY0X3N2ZV9yZXZfdW5zcGVjIChtb2RlX3dpdGhfbmFycm93ZXJfZWx0cyk7CiAgbWFjaGlu ZV9tb2RlIHByZWRfbW9kZSA9IGFhcmNoNjRfc3ZlX3ByZWRfbW9kZSAobW9kZV93aXRoX3dpZGVy X2VsdHMpOwoKICAvKiBHZXQgdGhlIG9wZXJhbmRzIGluIHRoZSBhcHByb3ByaWF0ZSBtb2RlcyBh bmQgZW1pdCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwogIHB0cnVlID0gZ2VuX2xvd3BhcnQgKHByZWRf bW9kZSwgcHRydWUpOwogIGRlc3QgPSBhYXJjaDY0X3JlcGxhY2VfcmVnX21vZGUgKGRlc3QsIG1v ZGVfd2l0aF93aWRlcl9lbHRzKTsKICBzcmMgPSBhYXJjaDY0X3JlcGxhY2VfcmVnX21vZGUgKHNy YywgbW9kZV93aXRoX3dpZGVyX2VsdHMpOwogIGVtaXRfaW5zbiAoZ2VuX2FhcmNoNjRfcHJlZCAo dW5zcGVjLCBtb2RlX3dpdGhfd2lkZXJfZWx0cywKCQkJICAgICAgIGRlc3QsIHB0cnVlLCBzcmMp KTsKfQoKc3RhdGljIGJvb2wKYWFyY2g2NF9mdW5jdGlvbl9va19mb3Jfc2liY2FsbCAodHJlZSwg dHJlZSBleHApCnsKICBpZiAoY3J0bC0+YWJpLT5pZCAoKSAhPSBleHByX2NhbGxlZV9hYmkgKGV4 cCkuaWQgKCkpCiAgICByZXR1cm4gZmFsc2U7CgogIHJldHVybiB0cnVlOwp9CgovKiBTdWJyb3V0 aW5lIG9mIGFhcmNoNjRfcGFzc19ieV9yZWZlcmVuY2UgZm9yIGFyZ3VtZW50cyB0aGF0IGFyZSBu b3QKICAgcGFzc2VkIGluIFNWRSByZWdpc3RlcnMuICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF9w YXNzX2J5X3JlZmVyZW5jZV8xIChDVU1VTEFUSVZFX0FSR1MgKnBjdW0sCgkJCSAgICAgY29uc3Qg ZnVuY3Rpb25fYXJnX2luZm8gJmFyZykKewogIEhPU1RfV0lERV9JTlQgc2l6ZTsKICBtYWNoaW5l X21vZGUgZHVtbXltb2RlOwogIGludCBucmVnczsKCiAgLyogR0VUX01PREVfU0laRSAoQkxLbW9k ZSkgaXMgdXNlbGVzcyBzaW5jZSBpdCBpcyAwLiAgKi8KICBpZiAoYXJnLm1vZGUgPT0gQkxLbW9k ZSAmJiBhcmcudHlwZSkKICAgIHNpemUgPSBpbnRfc2l6ZV9pbl9ieXRlcyAoYXJnLnR5cGUpOwog IGVsc2UKICAgIC8qIE5vIGZyb250ZW5kcyBjYW4gY3JlYXRlIHR5cGVzIHdpdGggdmFyaWFibGUt c2l6ZWQgbW9kZXMsIHNvIHdlCiAgICAgICBzaG91bGRuJ3QgYmUgYXNrZWQgdG8gcGFzcyBvciBy ZXR1cm4gdGhlbS4gICovCiAgICBzaXplID0gR0VUX01PREVfU0laRSAoYXJnLm1vZGUpLnRvX2Nv bnN0YW50ICgpOwoKICAvKiBBZ2dyZWdhdGVzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlIGJhc2Vk IG9uIHRoZWlyIHNpemUuICAqLwogIGlmIChhcmcuYWdncmVnYXRlX3R5cGVfcCAoKSkKICAgIHNp emUgPSBpbnRfc2l6ZV9pbl9ieXRlcyAoYXJnLnR5cGUpOwoKICAvKiBWYXJpYWJsZSBzaXplZCBh cmd1bWVudHMgYXJlIGFsd2F5cyByZXR1cm5lZCBieSByZWZlcmVuY2UuICAqLwogIGlmIChzaXpl IDwgMCkKICAgIHJldHVybiB0cnVlOwoKICAvKiBDYW4gdGhpcyBiZSBhIGNhbmRpZGF0ZSB0byBi ZSBwYXNzZWQgaW4gZnAvc2ltZCByZWdpc3RlcihzKT8gICovCiAgaWYgKGFhcmNoNjRfdmZwX2lz X2NhbGxfb3JfcmV0dXJuX2NhbmRpZGF0ZSAoYXJnLm1vZGUsIGFyZy50eXBlLAoJCQkJCSAgICAg ICAmZHVtbXltb2RlLCAmbnJlZ3MsIE5VTEwsCgkJCQkJICAgICAgICFwY3VtIHx8IHBjdW0tPnNp bGVudF9wKSkKICAgIHJldHVybiBmYWxzZTsKCiAgLyogQXJndW1lbnRzIHdoaWNoIGFyZSB2YXJp YWJsZSBzaXplZCBvciBsYXJnZXIgdGhhbiAyIHJlZ2lzdGVycyBhcmUKICAgICBwYXNzZWQgYnkg cmVmZXJlbmNlIHVubGVzcyB0aGV5IGFyZSBhIGhvbW9nZW5vdXMgZmxvYXRpbmcgcG9pbnQKICAg ICBhZ2dyZWdhdGUuICAqLwogIHJldHVybiBzaXplID4gMiAqIFVOSVRTX1BFUl9XT1JEOwp9Cgov KiBJbXBsZW1lbnQgVEFSR0VUX1BBU1NfQllfUkVGRVJFTkNFLiAgKi8KCnN0YXRpYyBib29sCmFh cmNoNjRfcGFzc19ieV9yZWZlcmVuY2UgKGN1bXVsYXRpdmVfYXJnc190IHBjdW1fdiwKCQkJICAg Y29uc3QgZnVuY3Rpb25fYXJnX2luZm8gJmFyZykKewogIENVTVVMQVRJVkVfQVJHUyAqcGN1bSA9 IGdldF9jdW11bGF0aXZlX2FyZ3MgKHBjdW1fdik7CgogIGlmICghYXJnLnR5cGUpCiAgICByZXR1 cm4gYWFyY2g2NF9wYXNzX2J5X3JlZmVyZW5jZV8xIChwY3VtLCBhcmcpOwoKICBwdXJlX3NjYWxh YmxlX3R5cGVfaW5mbyBwc3RfaW5mbzsKICBzd2l0Y2ggKHBzdF9pbmZvLmFuYWx5emUgKGFyZy50 eXBlKSkKICAgIHsKICAgIGNhc2UgcHVyZV9zY2FsYWJsZV90eXBlX2luZm86OklTX1BTVDoKICAg ICAgaWYgKHBjdW0gJiYgIXBjdW0tPnNpbGVudF9wICYmICFUQVJHRVRfU1ZFKQoJLyogV2UgY2Fu J3QgZ3JhY2VmdWxseSByZWNvdmVyIGF0IHRoaXMgcG9pbnQsIHNvIG1ha2UgdGhpcyBhCgkgICBm YXRhbCBlcnJvci4gICovCglmYXRhbF9lcnJvciAoaW5wdXRfbG9jYXRpb24sICJhcmd1bWVudHMg b2YgdHlwZSAlcVQgcmVxdWlyZSIKCQkgICAgICIgdGhlIFNWRSBJU0EgZXh0ZW5zaW9uIiwgYXJn LnR5cGUpOwoKICAgICAgLyogVmFyaWFkaWMgU1ZFIHR5cGVzIGFyZSBwYXNzZWQgYnkgcmVmZXJl bmNlLiAgTm9ybWFsIG5vbi12YXJpYWRpYwoJIGFyZ3VtZW50cyBhcmUgdG9vIGlmIHdlJ3ZlIHJ1 biBvdXQgb2YgcmVnaXN0ZXJzLiAgKi8KICAgICAgcmV0dXJuICghYXJnLm5hbWVkCgkgICAgICB8 fCBwY3VtLT5hYXBjc19udnJuICsgcHN0X2luZm8ubnVtX3pyICgpID4gTlVNX0ZQX0FSR19SRUdT CgkgICAgICB8fCBwY3VtLT5hYXBjc19ucHJuICsgcHN0X2luZm8ubnVtX3ByICgpID4gTlVNX1BS X0FSR19SRUdTKTsKCiAgICBjYXNlIHB1cmVfc2NhbGFibGVfdHlwZV9pbmZvOjpET0VTTlRfTUFU VEVSOgogICAgICBnY2NfYXNzZXJ0IChhYXJjaDY0X3Bhc3NfYnlfcmVmZXJlbmNlXzEgKHBjdW0s IGFyZykpOwogICAgICByZXR1cm4gdHJ1ZTsKCiAgICBjYXNlIHB1cmVfc2NhbGFibGVfdHlwZV9p bmZvOjpOT19BQklfSURFTlRJVFk6CiAgICBjYXNlIHB1cmVfc2NhbGFibGVfdHlwZV9pbmZvOjpJ U05UX1BTVDoKICAgICAgcmV0dXJuIGFhcmNoNjRfcGFzc19ieV9yZWZlcmVuY2VfMSAocGN1bSwg YXJnKTsKICAgIH0KICBnY2NfdW5yZWFjaGFibGUgKCk7Cn0KCi8qIFJldHVybiBUUlVFIGlmIFZB TFRZUEUgaXMgcGFkZGVkIHRvIGl0cyBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAgKi8Kc3RhdGlj IGJvb2wKYWFyY2g2NF9yZXR1cm5faW5fbXNiIChjb25zdF90cmVlIHZhbHR5cGUpCnsKICBtYWNo aW5lX21vZGUgZHVtbXlfbW9kZTsKICBpbnQgZHVtbXlfaW50OwoKICAvKiBOZXZlciBoYXBwZW5z IGluIGxpdHRsZS1lbmRpYW4gbW9kZS4gICovCiAgaWYgKCFCWVRFU19CSUdfRU5ESUFOKQogICAg cmV0dXJuIGZhbHNlOwoKICAvKiBPbmx5IGNvbXBvc2l0ZSB0eXBlcyBzbWFsbGVyIHRoYW4gb3Ig ZXF1YWwgdG8gMTYgYnl0ZXMgY2FuCiAgICAgYmUgcG90ZW50aWFsbHkgcmV0dXJuZWQgaW4gcmVn aXN0ZXJzLiAgKi8KICBpZiAoIWFhcmNoNjRfY29tcG9zaXRlX3R5cGVfcCAodmFsdHlwZSwgVFlQ RV9NT0RFICh2YWx0eXBlKSkKICAgICAgfHwgaW50X3NpemVfaW5fYnl0ZXMgKHZhbHR5cGUpIDw9 IDAKICAgICAgfHwgaW50X3NpemVfaW5fYnl0ZXMgKHZhbHR5cGUpID4gMTYpCiAgICByZXR1cm4g ZmFsc2U7CgogIC8qIEJ1dCBub3QgYSBjb21wb3NpdGUgdGhhdCBpcyBhbiBIRkEgKEhvbW9nZW5l b3VzIEZsb2F0aW5nLXBvaW50IEFnZ3JlZ2F0ZSkKICAgICBvciBhbiBIVkEgKEhvbW9nZW5lb3Vz IFNob3J0LVZlY3RvciBBZ2dyZWdhdGUpOyBzdWNoIGEgc3BlY2lhbCBjb21wb3NpdGUKICAgICBp cyBhbHdheXMgcGFzc2VkL3JldHVybmVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9m IGZwL3NpbWQKICAgICByZWdpc3RlcihzKS4gICovCiAgaWYgKGFhcmNoNjRfdmZwX2lzX2NhbGxf b3JfcmV0dXJuX2NhbmRpZGF0ZSAoVFlQRV9NT0RFICh2YWx0eXBlKSwgdmFsdHlwZSwKCQkJCQkg ICAgICAgJmR1bW15X21vZGUsICZkdW1teV9pbnQsIE5VTEwsCgkJCQkJICAgICAgIGZhbHNlKSkK ICAgIHJldHVybiBmYWxzZTsKCiAgLyogTGlrZXdpc2UgcHVyZSBzY2FsYWJsZSB0eXBlcyBmb3Ig U1ZFIHZlY3RvciBhbmQgcHJlZGljYXRlIHJlZ2lzdGVycy4gICovCiAgcHVyZV9zY2FsYWJsZV90 eXBlX2luZm8gcHN0X2luZm87CiAgaWYgKHBzdF9pbmZvLmFuYWx5emVfcmVnaXN0ZXJzICh2YWx0 eXBlKSkKICAgIHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIHRydWU7Cn0KCi8qIEltcGxlbWVudCBU QVJHRVRfRlVOQ1RJT05fVkFMVUUuCiAgIERlZmluZSBob3cgdG8gZmluZCB0aGUgdmFsdWUgcmV0 dXJuZWQgYnkgYSBmdW5jdGlvbi4gICovCgpzdGF0aWMgcnR4CmFhcmNoNjRfZnVuY3Rpb25fdmFs dWUgKGNvbnN0X3RyZWUgdHlwZSwgY29uc3RfdHJlZSBmdW5jLAoJCQlib29sIG91dGdvaW5nIEFU VFJJQlVURV9VTlVTRUQpCnsKICBtYWNoaW5lX21vZGUgbW9kZTsKICBpbnQgdW5zaWduZWRwOwoK ICBtb2RlID0gVFlQRV9NT0RFICh0eXBlKTsKICBpZiAoSU5URUdSQUxfVFlQRV9QICh0eXBlKSkK ICAgIG1vZGUgPSBwcm9tb3RlX2Z1bmN0aW9uX21vZGUgKHR5cGUsIG1vZGUsICZ1bnNpZ25lZHAs IGZ1bmMsIDEpOwoKICBwdXJlX3NjYWxhYmxlX3R5cGVfaW5mbyBwc3RfaW5mbzsKICBpZiAodHlw ZSAmJiBwc3RfaW5mby5hbmFseXplX3JlZ2lzdGVycyAodHlwZSkpCiAgICByZXR1cm4gcHN0X2lu Zm8uZ2V0X3J0eCAobW9kZSwgVjBfUkVHTlVNLCBQMF9SRUdOVU0pOwoKICAvKiBHZW5lcmljIHZl Y3RvcnMgdGhhdCBtYXAgdG8gZnVsbCBTVkUgbW9kZXMgd2l0aCAtbXN2ZS12ZWN0b3ItYml0cz1O CiAgICAgYXJlIHJldHVybmVkIGluIG1lbW9yeSwgbm90IGJ5IHZhbHVlLiAgKi8KICB1bnNpZ25l ZCBpbnQgdmVjX2ZsYWdzID0gYWFyY2g2NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAobW9kZSk7CiAg Ym9vbCBzdmVfcCA9ICh2ZWNfZmxhZ3MgJiBWRUNfQU5ZX1NWRSk7CgogIGlmIChhYXJjaDY0X3Jl dHVybl9pbl9tc2IgKHR5cGUpKQogICAgewogICAgICBIT1NUX1dJREVfSU5UIHNpemUgPSBpbnRf c2l6ZV9pbl9ieXRlcyAodHlwZSk7CgogICAgICBpZiAoc2l6ZSAlIFVOSVRTX1BFUl9XT1JEICE9 IDApCgl7CgkgIHNpemUgKz0gVU5JVFNfUEVSX1dPUkQgLSBzaXplICUgVU5JVFNfUEVSX1dPUkQ7 CgkgIG1vZGUgPSBpbnRfbW9kZV9mb3Jfc2l6ZSAoc2l6ZSAqIEJJVFNfUEVSX1VOSVQsIDApLnJl cXVpcmUgKCk7Cgl9CiAgICB9CgogIGludCBjb3VudDsKICBtYWNoaW5lX21vZGUgYWdfbW9kZTsK ICBpZiAoYWFyY2g2NF92ZnBfaXNfY2FsbF9vcl9yZXR1cm5fY2FuZGlkYXRlIChtb2RlLCB0eXBl LCAmYWdfbW9kZSwgJmNvdW50LAoJCQkJCSAgICAgICBOVUxMLCBmYWxzZSkpCiAgICB7CiAgICAg IGdjY19hc3NlcnQgKCFzdmVfcCk7CiAgICAgIGlmICghYWFyY2g2NF9jb21wb3NpdGVfdHlwZV9w ICh0eXBlLCBtb2RlKSkKCXsKCSAgZ2NjX2Fzc2VydCAoY291bnQgPT0gMSAmJiBtb2RlID09IGFn X21vZGUpOwoJICByZXR1cm4gZ2VuX3J0eF9SRUcgKG1vZGUsIFYwX1JFR05VTSk7Cgl9CiAgICAg IGVsc2UgaWYgKGFhcmNoNjRfYWR2c2ltZF9mdWxsX3N0cnVjdF9tb2RlX3AgKG1vZGUpCgkgICAg ICAgJiYga25vd25fZXEgKEdFVF9NT0RFX1NJWkUgKGFnX21vZGUpLCAxNikpCglyZXR1cm4gZ2Vu X3J0eF9SRUcgKG1vZGUsIFYwX1JFR05VTSk7CiAgICAgIGVsc2UgaWYgKGFhcmNoNjRfYWR2c2lt ZF9wYXJ0aWFsX3N0cnVjdF9tb2RlX3AgKG1vZGUpCgkgICAgICAgJiYga25vd25fZXEgKEdFVF9N T0RFX1NJWkUgKGFnX21vZGUpLCA4KSkKCXJldHVybiBnZW5fcnR4X1JFRyAobW9kZSwgVjBfUkVH TlVNKTsKICAgICAgZWxzZQoJewoJICBpbnQgaTsKCSAgcnR4IHBhcjsKCgkgIHBhciA9IGdlbl9y dHhfUEFSQUxMRUwgKG1vZGUsIHJ0dmVjX2FsbG9jIChjb3VudCkpOwoJICBmb3IgKGkgPSAwOyBp IDwgY291bnQ7IGkrKykKCSAgICB7CgkgICAgICBydHggdG1wID0gZ2VuX3J0eF9SRUcgKGFnX21v ZGUsIFYwX1JFR05VTSArIGkpOwoJICAgICAgcnR4IG9mZnNldCA9IGdlbl9pbnRfbW9kZSAoaSAq IEdFVF9NT0RFX1NJWkUgKGFnX21vZGUpLCBQbW9kZSk7CgkgICAgICB0bXAgPSBnZW5fcnR4X0VY UFJfTElTVCAoVk9JRG1vZGUsIHRtcCwgb2Zmc2V0KTsKCSAgICAgIFhWRUNFWFAgKHBhciwgMCwg aSkgPSB0bXA7CgkgICAgfQoJICByZXR1cm4gcGFyOwoJfQogICAgfQogIGVsc2UKICAgIHsKICAg ICAgaWYgKHN2ZV9wKQoJewoJICAvKiBWZWN0b3IgdHlwZXMgY2FuIGFjcXVpcmUgYSBwYXJ0aWFs IFNWRSBtb2RlIHVzaW5nIHRoaW5ncyBsaWtlCgkgICAgIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9z aXplKE4pKSksIGFuZCB0aGlzIGlzIHBvdGVudGlhbGx5IHVzZWZ1bC4KCSAgICAgSG93ZXZlciwg dGhlIGNob2ljZSBvZiBtb2RlIGRvZXNuJ3QgYWZmZWN0IHRoZSB0eXBlJ3MgQUJJCgkgICAgIGlk ZW50aXR5LCBzbyB3ZSBzaG91bGQgdHJlYXQgdGhlIHR5cGVzIGFzIHRob3VnaCB0aGV5IGhhZAoJ ICAgICB0aGUgYXNzb2NpYXRlZCBpbnRlZ2VyIG1vZGUsIGp1c3QgbGlrZSB0aGV5IGRpZCBiZWZv cmUgU1ZFCgkgICAgIHdhcyBpbnRyb2R1Y2VkLgoKCSAgICAgV2Uga25vdyB0aGF0IHRoZSB2ZWN0 b3IgbXVzdCBiZSAxMjggYml0cyBvciBzbWFsbGVyLAoJICAgICBvdGhlcndpc2Ugd2UnZCBoYXZl IHJldHVybmVkIGl0IGluIG1lbW9yeSBpbnN0ZWFkLiAgKi8KCSAgZ2NjX2Fzc2VydCAodHlwZQoJ CSAgICAgICYmIChhYXJjaDY0X3NvbWVfdmFsdWVzX2luY2x1ZGVfcHN0X29iamVjdHNfcCAodHlw ZSkKCQkJICB8fCAodmVjX2ZsYWdzICYgVkVDX1BBUlRJQUwpKSk7CgoJICBzY2FsYXJfaW50X21v ZGUgaW50X21vZGUgPSBpbnRfbW9kZV9mb3JfbW9kZSAobW9kZSkucmVxdWlyZSAoKTsKCSAgcnR4 IHJlZyA9IGdlbl9ydHhfUkVHIChpbnRfbW9kZSwgUjBfUkVHTlVNKTsKCSAgcnR4IHBhaXIgPSBn ZW5fcnR4X0VYUFJfTElTVCAoVk9JRG1vZGUsIHJlZywgY29uc3QwX3J0eCk7CgkgIHJldHVybiBn ZW5fcnR4X1BBUkFMTEVMIChtb2RlLCBnZW5fcnR2ZWMgKDEsIHBhaXIpKTsKCX0KICAgICAgcmV0 dXJuIGdlbl9ydHhfUkVHIChtb2RlLCBSMF9SRUdOVU0pOwogICAgfQp9CgovKiBJbXBsZW1lbnRz IFRBUkdFVF9GVU5DVElPTl9WQUxVRV9SRUdOT19QLgogICBSZXR1cm4gdHJ1ZSBpZiBSRUdOTyBp cyB0aGUgbnVtYmVyIG9mIGEgaGFyZCByZWdpc3RlciBpbiB3aGljaCB0aGUgdmFsdWVzCiAgIG9m IGNhbGxlZCBmdW5jdGlvbiBtYXkgY29tZSBiYWNrLiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRf ZnVuY3Rpb25fdmFsdWVfcmVnbm9fcCAoY29uc3QgdW5zaWduZWQgaW50IHJlZ25vKQp7CiAgLyog TWF4aW11bSBvZiAxNiBieXRlcyBjYW4gYmUgcmV0dXJuZWQgaW4gdGhlIGdlbmVyYWwgcmVnaXN0 ZXJzLiAgRXhhbXBsZXMKICAgICBvZiAxNi1ieXRlIHJldHVybiB2YWx1ZXMgYXJlOiAxMjgtYml0 IGludGVnZXJzIGFuZCAxNi1ieXRlIHNtYWxsCiAgICAgc3RydWN0dXJlcyAoZXhjbHVkaW5nIGhv bW9nZW5lb3VzIGZsb2F0aW5nLXBvaW50IGFnZ3JlZ2F0ZXMpLiAgKi8KICBpZiAocmVnbm8gPT0g UjBfUkVHTlVNIHx8IHJlZ25vID09IFIxX1JFR05VTSkKICAgIHJldHVybiB0cnVlOwoKICAvKiBV cCB0byBmb3VyIGZwL3NpbWQgcmVnaXN0ZXJzIGNhbiByZXR1cm4gYSBmdW5jdGlvbiB2YWx1ZSwg ZS5nLiBhCiAgICAgaG9tb2dlbmVvdXMgZmxvYXRpbmctcG9pbnQgYWdncmVnYXRlIGhhdmluZyBm b3VyIG1lbWJlcnMuICAqLwogIGlmIChyZWdubyA+PSBWMF9SRUdOVU0gJiYgcmVnbm8gPCBWMF9S RUdOVU0gKyBIQV9NQVhfTlVNX0ZMRFMpCiAgICByZXR1cm4gVEFSR0VUX0ZMT0FUOwoKICBpZiAo cmVnbm8gPj0gUDBfUkVHTlVNICYmIHJlZ25vIDwgUDBfUkVHTlVNICsgSEFfTUFYX05VTV9GTERT KQogICAgcmV0dXJuIFRBUkdFVF9TVkU7CgogIHJldHVybiBmYWxzZTsKfQoKLyogU3Vicm91dGlu ZSBmb3IgYWFyY2g2NF9yZXR1cm5faW5fbWVtb3J5IGZvciB0eXBlcyB0aGF0IGFyZSBub3QgcmV0 dXJuZWQKICAgaW4gU1ZFIHJlZ2lzdGVycy4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3JldHVy bl9pbl9tZW1vcnlfMSAoY29uc3RfdHJlZSB0eXBlKQp7CiAgSE9TVF9XSURFX0lOVCBzaXplOwog IG1hY2hpbmVfbW9kZSBhZ19tb2RlOwogIGludCBjb3VudDsKCiAgaWYgKCFBR0dSRUdBVEVfVFlQ RV9QICh0eXBlKQogICAgICAmJiBUUkVFX0NPREUgKHR5cGUpICE9IENPTVBMRVhfVFlQRQogICAg ICAmJiBUUkVFX0NPREUgKHR5cGUpICE9IFZFQ1RPUl9UWVBFKQogICAgLyogU2ltcGxlIHNjYWxh ciB0eXBlcyBhbHdheXMgcmV0dXJuZWQgaW4gcmVnaXN0ZXJzLiAgKi8KICAgIHJldHVybiBmYWxz ZTsKCiAgaWYgKGFhcmNoNjRfdmZwX2lzX2NhbGxfb3JfcmV0dXJuX2NhbmRpZGF0ZSAoVFlQRV9N T0RFICh0eXBlKSwgdHlwZSwKCQkJCQkgICAgICAgJmFnX21vZGUsICZjb3VudCwgTlVMTCwgZmFs c2UpKQogICAgcmV0dXJuIGZhbHNlOwoKICAvKiBUeXBlcyBsYXJnZXIgdGhhbiAyIHJlZ2lzdGVy cyByZXR1cm5lZCBpbiBtZW1vcnkuICAqLwogIHNpemUgPSBpbnRfc2l6ZV9pbl9ieXRlcyAodHlw ZSk7CiAgcmV0dXJuIChzaXplIDwgMCB8fCBzaXplID4gMiAqIFVOSVRTX1BFUl9XT1JEKTsKfQoK LyogSW1wbGVtZW50IFRBUkdFVF9SRVRVUk5fSU5fTUVNT1JZLgoKICAgSWYgdGhlIHR5cGUgVCBv ZiB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gaXMgc3VjaCB0aGF0CiAgICAgdm9pZCBmdW5jIChU IGFyZykKICAgd291bGQgcmVxdWlyZSB0aGF0IGFyZyBiZSBwYXNzZWQgYXMgYSB2YWx1ZSBpbiBh IHJlZ2lzdGVyIChvciBzZXQgb2YKICAgcmVnaXN0ZXJzKSBhY2NvcmRpbmcgdG8gdGhlIHBhcmFt ZXRlciBwYXNzaW5nIHJ1bGVzLCB0aGVuIHRoZSByZXN1bHQKICAgaXMgcmV0dXJuZWQgaW4gdGhl IHNhbWUgcmVnaXN0ZXJzIGFzIHdvdWxkIGJlIHVzZWQgZm9yIHN1Y2ggYW4KICAgYXJndW1lbnQu ICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF9yZXR1cm5faW5fbWVtb3J5IChjb25zdF90cmVlIHR5 cGUsIGNvbnN0X3RyZWUgZm5kZWNsIEFUVFJJQlVURV9VTlVTRUQpCnsKICBwdXJlX3NjYWxhYmxl X3R5cGVfaW5mbyBwc3RfaW5mbzsKICBzd2l0Y2ggKHBzdF9pbmZvLmFuYWx5emUgKHR5cGUpKQog ICAgewogICAgY2FzZSBwdXJlX3NjYWxhYmxlX3R5cGVfaW5mbzo6SVNfUFNUOgogICAgICByZXR1 cm4gKHBzdF9pbmZvLm51bV96ciAoKSA+IE5VTV9GUF9BUkdfUkVHUwoJICAgICAgfHwgcHN0X2lu Zm8ubnVtX3ByICgpID4gTlVNX1BSX0FSR19SRUdTKTsKCiAgICBjYXNlIHB1cmVfc2NhbGFibGVf dHlwZV9pbmZvOjpET0VTTlRfTUFUVEVSOgogICAgICBnY2NfYXNzZXJ0IChhYXJjaDY0X3JldHVy bl9pbl9tZW1vcnlfMSAodHlwZSkpOwogICAgICByZXR1cm4gdHJ1ZTsKCiAgICBjYXNlIHB1cmVf c2NhbGFibGVfdHlwZV9pbmZvOjpOT19BQklfSURFTlRJVFk6CiAgICBjYXNlIHB1cmVfc2NhbGFi bGVfdHlwZV9pbmZvOjpJU05UX1BTVDoKICAgICAgcmV0dXJuIGFhcmNoNjRfcmV0dXJuX2luX21l bW9yeV8xICh0eXBlKTsKICAgIH0KICBnY2NfdW5yZWFjaGFibGUgKCk7Cn0KCnN0YXRpYyBib29s CmFhcmNoNjRfdmZwX2lzX2NhbGxfY2FuZGlkYXRlIChjdW11bGF0aXZlX2FyZ3NfdCBwY3VtX3Ys IG1hY2hpbmVfbW9kZSBtb2RlLAoJCQkgICAgICAgY29uc3RfdHJlZSB0eXBlLCBpbnQgKm5yZWdz KQp7CiAgQ1VNVUxBVElWRV9BUkdTICpwY3VtID0gZ2V0X2N1bXVsYXRpdmVfYXJncyAocGN1bV92 KTsKICByZXR1cm4gYWFyY2g2NF92ZnBfaXNfY2FsbF9vcl9yZXR1cm5fY2FuZGlkYXRlIChtb2Rl LCB0eXBlLAoJCQkJCQkgICZwY3VtLT5hYXBjc192ZnBfcm1vZGUsCgkJCQkJCSAgbnJlZ3MsIE5V TEwsIHBjdW0tPnNpbGVudF9wKTsKfQoKLyogR2l2ZW4gTU9ERSBhbmQgVFlQRSBvZiBhIGZ1bmN0 aW9uIGFyZ3VtZW50LCByZXR1cm4gdGhlIGFsaWdubWVudCBpbgogICBiaXRzLiAgVGhlIGlkZWEg aXMgdG8gc3VwcHJlc3MgYW55IHN0cm9uZ2VyIGFsaWdubWVudCByZXF1ZXN0ZWQgYnkKICAgdGhl IHVzZXIgYW5kIG9wdCBmb3IgdGhlIG5hdHVyYWwgYWxpZ25tZW50IChzcGVjaWZpZWQgaW4gQUFQ Q1M2NCBcUwogICA0LjEpLiAgQUJJX0JSRUFLX0dDQ185IGlzIHNldCB0byB0aGUgb2xkIGFsaWdu bWVudCBpZiB0aGUgYWxpZ25tZW50CiAgIHdhcyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIGluIHZl cnNpb25zIG9mIEdDQyBwcmlvciB0byBHQ0MgOS4KICAgQUJJX0JSRUFLX0dDQ18xMyBpcyBzZXQg dG8gdGhlIG9sZCBhbGlnbm1lbnQgaWYgaXQgd2FzIGluY29ycmVjdGx5CiAgIGNhbGN1bGF0ZWQg aW4gdmVyc2lvbnMgYmV0d2VlbiBHQ0MgOSBhbmQgR0NDIDEzLiAgSWYgdGhlIGFsaWdubWVudAog ICBtaWdodCBoYXZlIGNoYW5nZWQgYmV0d2VlbiBHQ0MgMTMgYW5kIEdDQyAxNCwgQUJJX0JSRUFL X0dDQ18xNAogICBpcyB0aGUgb2xkIEdDQyAxMyBhbGlnbm1lbnQsIG90aGVyd2lzZSBpdCBpcyB6 ZXJvLgoKICAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgbG9jYWwgdXNlIG9ubHkuICAq LwoKc3RhdGljIHVuc2lnbmVkIGludAphYXJjaDY0X2Z1bmN0aW9uX2FyZ19hbGlnbm1lbnQgKG1h Y2hpbmVfbW9kZSBtb2RlLCBjb25zdF90cmVlIHR5cGUsCgkJCQl1bnNpZ25lZCBpbnQgKmFiaV9i cmVha19nY2NfOSwKCQkJCXVuc2lnbmVkIGludCAqYWJpX2JyZWFrX2djY18xMywKCQkJCXVuc2ln bmVkIGludCAqYWJpX2JyZWFrX2djY18xNCkKewogICphYmlfYnJlYWtfZ2NjXzkgPSAwOwogICph YmlfYnJlYWtfZ2NjXzEzID0gMDsKICAqYWJpX2JyZWFrX2djY18xNCA9IDA7CiAgaWYgKCF0eXBl KQogICAgcmV0dXJuIEdFVF9NT0RFX0FMSUdOTUVOVCAobW9kZSk7CgogIGlmIChpbnRlZ2VyX3pl cm9wIChUWVBFX1NJWkUgKHR5cGUpKSkKICAgIHJldHVybiAwOwoKICBnY2NfYXNzZXJ0IChUWVBF X01PREUgKHR5cGUpID09IG1vZGUpOwoKICBpZiAoIUFHR1JFR0FURV9UWVBFX1AgKHR5cGUpKQog ICAgewogICAgICAvKiBUaGUgQUJJIGFsaWdubWVudCBpcyB0aGUgbmF0dXJhbCBhbGlnbm1lbnQg b2YgdGhlIHR5cGUsIHdpdGhvdXQKCSBhbnkgYXR0cmlidXRlcyBhcHBsaWVkLiAgTm9ybWFsbHkg dGhpcyBpcyB0aGUgYWxpZ25tZW50IG9mIHRoZQoJIFRZUEVfTUFJTl9WQVJJQU5ULCBidXQgbm90 IGFsd2F5czsgc2VlIFBSMTA4OTEwIGZvciBhIGNvdW50ZXJleGFtcGxlLgoJIEZvciBub3cgd2Ug anVzdCBoYW5kbGUgdGhlIGtub3duIGV4Y2VwdGlvbnMgZXhwbGljaXRseS4gICovCiAgICAgIHR5 cGUgPSBUWVBFX01BSU5fVkFSSUFOVCAodHlwZSk7CiAgICAgIGlmIChQT0lOVEVSX1RZUEVfUCAo dHlwZSkpCgl7CgkgIGdjY19hc3NlcnQgKGtub3duX2VxIChQT0lOVEVSX1NJWkUsIEdFVF9NT0RF X0JJVFNJWkUgKG1vZGUpKSk7CgkgIHJldHVybiBQT0lOVEVSX1NJWkU7Cgl9CiAgICAgIGlmIChU UkVFX0NPREUgKHR5cGUpID09IEVOVU1FUkFMX1RZUEUgJiYgVFJFRV9UWVBFICh0eXBlKSkKCXsK CSAgKmFiaV9icmVha19nY2NfMTQgPSBUWVBFX0FMSUdOICh0eXBlKTsKCSAgdHlwZSA9IFRZUEVf TUFJTl9WQVJJQU5UIChUUkVFX1RZUEUgKHR5cGUpKTsKCX0KICAgICAgZ2NjX2Fzc2VydCAoIVRZ UEVfVVNFUl9BTElHTiAodHlwZSkpOwogICAgICByZXR1cm4gVFlQRV9BTElHTiAodHlwZSk7CiAg ICB9CgogIGlmIChUUkVFX0NPREUgKHR5cGUpID09IEFSUkFZX1RZUEUpCiAgICByZXR1cm4gVFlQ RV9BTElHTiAoVFJFRV9UWVBFICh0eXBlKSk7CgogIHVuc2lnbmVkIGludCBhbGlnbm1lbnQgPSAw OwogIHVuc2lnbmVkIGludCBiaXRmaWVsZF9hbGlnbm1lbnRfd2l0aF9wYWNrZWQgPSAwOwogIHVu c2lnbmVkIGludCBiaXRmaWVsZF9hbGlnbm1lbnQgPSAwOwogIGZvciAodHJlZSBmaWVsZCA9IFRZ UEVfRklFTERTICh0eXBlKTsgZmllbGQ7IGZpZWxkID0gREVDTF9DSEFJTiAoZmllbGQpKQogICAg aWYgKFRSRUVfQ09ERSAoZmllbGQpID09IEZJRUxEX0RFQ0wpCiAgICAgIHsKCS8qIE5vdGUgdGhh dCB3ZSBleHBsaWNpdGx5IGNvbnNpZGVyIHplcm8tc2l6ZWQgZmllbGRzIGhlcmUsCgkgICBldmVu IHRob3VnaCB0aGV5IGRvbid0IG1hcCB0byBBQVBDUzY0IG1hY2hpbmUgdHlwZXMuCgkgICBGb3Ig ZXhhbXBsZSwgaW46CgoJICAgICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkg ZW1wdHkge307CgoJICAgICAgIHN0cnVjdCBzIHsKCQkgW1tub191bmlxdWVfYWRkcmVzc11dIGVt cHR5IGU7CgkJIGludCB4OwoJICAgICAgIH07CgoJICAgInMiIGNvbnRhaW5zIG9ubHkgb25lIEZ1 bmRhbWVudGFsIERhdGEgVHlwZSAodGhlIGludCBmaWVsZCkKCSAgIGJ1dCBnYWlucyA4LWJ5dGUg YWxpZ25tZW50IGFuZCBzaXplIHRoYW5rcyB0byAiZSIuICAqLwoJYWxpZ25tZW50ID0gc3RkOjpt YXggKGFsaWdubWVudCwgREVDTF9BTElHTiAoZmllbGQpKTsKCWlmIChERUNMX0JJVF9GSUVMRF9U WVBFIChmaWVsZCkpCgkgIHsKCSAgICAvKiBUYWtlIHRoZSBiaXQtZmllbGQgdHlwZSdzIGFsaWdu bWVudCBpbnRvIGFjY291bnQgb25seQoJICAgICAgIGlmIHRoZSB1c2VyIGRpZG4ndCByZWR1Y2Ug dGhpcyBmaWVsZCdzIGFsaWdubWVudCB3aXRoCgkgICAgICAgdGhlIHBhY2tlZCBhdHRyaWJ1dGUu ICAqLwoJICAgIGlmICghREVDTF9QQUNLRUQgKGZpZWxkKSkKCSAgICAgIGJpdGZpZWxkX2FsaWdu bWVudAoJCT0gc3RkOjptYXggKGJpdGZpZWxkX2FsaWdubWVudCwKCQkJICAgIFRZUEVfQUxJR04g KERFQ0xfQklUX0ZJRUxEX1RZUEUgKGZpZWxkKSkpOwoKCSAgICAvKiBDb21wdXRlIHRoZSBhbGln bm1lbnQgZXZlbiBpZiB0aGUgYml0LWZpZWxkIGlzCgkgICAgICAgcGFja2VkLCBzbyB0aGF0IHdl IGNhbiBlbWl0IGEgd2FybmluZyBpbiBjYXNlIHRoZQoJICAgICAgIGFsaWdubWVudCBjaGFuZ2Vk IGJldHdlZW4gR0NDIHZlcnNpb25zLiAgKi8KCSAgICBiaXRmaWVsZF9hbGlnbm1lbnRfd2l0aF9w YWNrZWQKCSAgICAgID0gc3RkOjptYXggKGJpdGZpZWxkX2FsaWdubWVudF93aXRoX3BhY2tlZCwK CQkJICBUWVBFX0FMSUdOIChERUNMX0JJVF9GSUVMRF9UWVBFIChmaWVsZCkpKTsKCSAgfQogICAg ICB9CgogIC8qIEVtaXQgYSB3YXJuaW5nIGlmIHRoZSBhbGlnbm1lbnQgaXMgZGlmZmVyZW50IHdo ZW4gdGFraW5nIHRoZQogICAgICdwYWNrZWQnIGF0dHJpYnV0ZSBpbnRvIGFjY291bnQuICAqLwog IGlmIChiaXRmaWVsZF9hbGlnbm1lbnQgIT0gYml0ZmllbGRfYWxpZ25tZW50X3dpdGhfcGFja2Vk CiAgICAgICYmIGJpdGZpZWxkX2FsaWdubWVudF93aXRoX3BhY2tlZCA+IGFsaWdubWVudCkKICAg ICphYmlfYnJlYWtfZ2NjXzEzID0gYml0ZmllbGRfYWxpZ25tZW50X3dpdGhfcGFja2VkOwoKICBp ZiAoYml0ZmllbGRfYWxpZ25tZW50ID4gYWxpZ25tZW50KQogICAgewogICAgICAqYWJpX2JyZWFr X2djY185ID0gYWxpZ25tZW50OwogICAgICByZXR1cm4gYml0ZmllbGRfYWxpZ25tZW50OwogICAg fQoKICByZXR1cm4gYWxpZ25tZW50Owp9CgovKiBMYXlvdXQgYSBmdW5jdGlvbiBhcmd1bWVudCBh Y2NvcmRpbmcgdG8gdGhlIEFBUENTNjQgcnVsZXMuICBUaGUgcnVsZQogICBudW1iZXJzIHJlZmVy IHRvIHRoZSBydWxlIG51bWJlcnMgaW4gdGhlIEFBUENTNjQuICBPUklHX01PREUgaXMgdGhlCiAg IG1vZGUgdGhhdCB3YXMgb3JpZ2luYWxseSBnaXZlbiB0byB1cyBieSB0aGUgdGFyZ2V0IGhvb2ss IHdoZXJlYXMgdGhlCiAgIG1vZGUgaW4gQVJHIG1pZ2h0IGJlIHRoZSByZXN1bHQgb2YgcmVwbGFj aW5nIHBhcnRpYWwgU1ZFIG1vZGVzIHdpdGgKICAgdGhlIGVxdWl2YWxlbnQgaW50ZWdlciBtb2Rl LiAgKi8KCnN0YXRpYyB2b2lkCmFhcmNoNjRfbGF5b3V0X2FyZyAoY3VtdWxhdGl2ZV9hcmdzX3Qg cGN1bV92LCBjb25zdCBmdW5jdGlvbl9hcmdfaW5mbyAmYXJnKQp7CiAgQ1VNVUxBVElWRV9BUkdT ICpwY3VtID0gZ2V0X2N1bXVsYXRpdmVfYXJncyAocGN1bV92KTsKICB0cmVlIHR5cGUgPSBhcmcu dHlwZTsKICBtYWNoaW5lX21vZGUgbW9kZSA9IGFyZy5tb2RlOwogIGludCBuY3JuLCBudnJuLCBu cmVnczsKICBib29sIGFsbG9jYXRlX25jcm4sIGFsbG9jYXRlX252cm47CiAgSE9TVF9XSURFX0lO VCBzaXplOwogIHVuc2lnbmVkIGludCBhYmlfYnJlYWtfZ2NjXzk7CiAgdW5zaWduZWQgaW50IGFi aV9icmVha19nY2NfMTM7CiAgdW5zaWduZWQgaW50IGFiaV9icmVha19nY2NfMTQ7CgogIC8qIFdl IG5lZWQgdG8gZG8gdGhpcyBvbmNlIHBlciBhcmd1bWVudC4gICovCiAgaWYgKHBjdW0tPmFhcGNz X2FyZ19wcm9jZXNzZWQpCiAgICByZXR1cm47CgogIGJvb2wgd2Fybl9wY3NfY2hhbmdlCiAgICA9 ICh3YXJuX3BzYWJpCiAgICAgICAmJiAhcGN1bS0+c2lsZW50X3AKICAgICAgICYmIChjdXJyZW50 bHlfZXhwYW5kaW5nX2Z1bmN0aW9uX3N0YXJ0CgkgICB8fCBjdXJyZW50bHlfZXhwYW5kaW5nX2dp bXBsZV9zdG10KSk7CgogIC8qIEhGQXMgYW5kIEhWQXMgY2FuIGhhdmUgYW4gYWxpZ25tZW50IGdy ZWF0ZXIgdGhhbiAxNiBieXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgIHR5cGVkZWYgc3RydWN0 IGZvbyB7CiAgICAgICAgIF9fSW50OHgxNl90IGZvb1syXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVk KDMyKSkpOwogICAgICAgfSBmb287CgogICAgIGlzIHN0aWxsIGEgSFZBIGRlc3BpdGUgaXRzIGxh cmdlci10aGFuLW5vcm1hbCBhbGlnbm1lbnQuCiAgICAgSG93ZXZlciwgc3VjaCBvdmVyLWFsaWdu ZWQgSEZBcyBhbmQgSFZBcyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlCiAgICAgbm8gcGFkZGluZy4K CiAgICAgSWYgd2UgZXhjbHVkZSBIRkFzIGFuZCBIVkFzIGZyb20gdGhlIGRpc2N1c3Npb24gYmVs b3csIHRoZW4gdGhlcmUKICAgICBhcmUgc2V2ZXJhbCB0aGluZ3MgdG8gbm90ZToKCiAgICAgLSBC b3RoIHRoZSBDIGFuZCBBQVBDUzY0IGludGVycHJldGF0aW9ucyBvZiBhIHR5cGUncyBhbGlnbm1l bnQgc2hvdWxkCiAgICAgICBnaXZlIGEgdmFsdWUgdGhhdCBpcyBubyBncmVhdGVyIHRoYW4gdGhl IHR5cGUncyBzaXplLgoKICAgICAtIFR5cGVzIGJpZ2dlciB0aGFuIDE2IGJ5dGVzIGFyZSBwYXNz ZWQgaW5kaXJlY3RseS4KCiAgICAgLSBJZiBhbiBhcmd1bWVudCBvZiB0eXBlIFQgaXMgcGFzc2Vk IGluZGlyZWN0bHksIFRZUEUgYW5kIE1PREUgZGVzY3JpYmUKICAgICAgIGEgcG9pbnRlciB0byBU IHJhdGhlciB0aGFuIFQgaXNlbGYuCgogICAgIEl0IGZvbGxvd3MgdGhhdCB0aGUgQUFQQ1M2NCBh bGlnbm1lbnQgb2YgVFlQRSBtdXN0IGJlIG5vIGdyZWF0ZXIKICAgICB0aGFuIDE2IGJ5dGVzLgoK ICAgICBWZXJzaW9ucyBwcmlvciB0byBHQ0MgOS4xIGlnbm9yZWQgYSBiaXRmaWVsZCdzIHVuZGVy bHlpbmcgdHlwZQogICAgIGFuZCBzbyBjb3VsZCBjYWxjdWxhdGUgYW4gYWxpZ25tZW50IHRoYXQg d2FzIHRvbyBzbWFsbC4gIElmIHRoaXMKICAgICBoYXBwZW5lZCBmb3IgVFlQRSB0aGVuIEFCSV9C UkVBS19HQ0NfOSBpcyB0aGlzIG9sZGVyLCB0b28tc21hbGwgYWxpZ25tZW50LgoKICAgICBBbHRo b3VnaCBHQ0MgOS4xIGZpeGVkIHRoYXQgYnVnLCBpdCBpbnRyb2R1Y2VkIGEgZGlmZmVyZW50IG9u ZToKICAgICBpdCB3b3VsZCBjb25zaWRlciB0aGUgYWxpZ25tZW50IG9mIGEgYml0ZmllbGQncyB1 bmRlcmx5aW5nIHR5cGUgZXZlbgogICAgIGlmIHRoZSBmaWVsZCB3YXMgcGFja2VkICh3aGljaCBz aG91bGQgaGF2ZSB0aGUgZWZmZWN0IG9mIG92ZXJyaWRpbmcKICAgICB0aGUgYWxpZ25tZW50IG9m IHRoZSB1bmRlcmx5aW5nIHR5cGUpLiAgVGhpcyB3YXMgZml4ZWQgaW4gR0NDIDEzLjEuCgogICAg IEFzIGEgcmVzdWx0IG9mIHRoaXMgYnVnLCBHQ0MgOSB0byBHQ0MgMTIgY291bGQgY2FsY3VsYXRl IGFuIGFsaWdubWVudAogICAgIHRoYXQgd2FzIHRvbyBiaWcuICBJZiB0aGlzIGhhcHBlbmVkIGZv ciBUWVBFLCBBQklfQlJFQUtfR0NDXzEzIGlzCiAgICAgdGhpcyBvbGRlciwgdG9vLWJpZyBhbGln bm1lbnQuCgogICAgIEFsc28sIHRoZSBmYWN0IHRoYXQgR0NDIDkgdG8gR0NDIDEyIGNvbnNpZGVy ZWQgaXJyZWxldmFudAogICAgIGFsaWdubWVudHMgbWVhbnQgdGhleSBjb3VsZCBjYWxjdWxhdGUg dHlwZSBhbGlnbm1lbnRzIHRoYXQgd2VyZQogICAgIGJpZ2dlciB0aGFuIHRoZSB0eXBlJ3Mgc2l6 ZSwgY29udHJhcnkgdG8gdGhlIGFzc3VtcHRpb24gYWJvdmUuCiAgICAgVGhlIGhhbmRsaW5nIG9m IHJlZ2lzdGVyIGFyZ3VtZW50cyB3YXMgbmV2ZXJ0aGVsZXNzIChhbmQganVzdGlmaWFibHkpCiAg ICAgd3JpdHRlbiB0byBmb2xsb3cgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgYWxpZ25tZW50IGNh biBuZXZlciBiZQogICAgIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZS4gIFRoZSBzYW1lIHdhcyBub3Qg dHJ1ZSBmb3Igc3RhY2sgYXJndW1lbnRzOwogICAgIHRoZWlyIGFsaWdubWVudCB3YXMgaW5zdGVh ZCBoYW5kbGVkIGJ5IE1JTiBib3VuZHMgaW4KICAgICBhYXJjaDY0X2Z1bmN0aW9uX2FyZ19ib3Vu ZGFyeS4KCiAgICAgVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCwgaWYgR0NDIDkgdG8gR0NDIDEyIGlu Y29ycmVjdGx5IGNhbGN1bGF0ZWQKICAgICBhbiBhbGlnbm1lbnQgb2YgbW9yZSB0aGFuIDE2IGJ5 dGVzIGZvciBUWVBFIHRoZW46CgogICAgIC0gSWYgdGhlIGFyZ3VtZW50IHdhcyBwYXNzZWQgaW4g cmVnaXN0ZXJzLCB0aGVzZSBHQ0MgdmVyc2lvbnMKICAgICAgIHdvdWxkIHRyZWF0IHRoZSBhbGln bm1lbnQgYXMgdGhvdWdoIGl0IHdhcyAqbGVzcyB0aGFuKiAxNiBieXRlcy4KCiAgICAgLSBJZiB0 aGUgYXJndW1lbnQgd2FzIHBhc3NlZCBvbiB0aGUgc3RhY2ssIHRoZXNlIEdDQyB2ZXJzaW9ucwog ICAgICAgd291bGQgdHJlYXQgdGhlIGFsaWdubWVudCBhcyB0aG91Z2ggaXQgd2FzICplcXVhbCB0 byogMTYgYnl0ZXMuCgogICAgIEJvdGggYmVoYXZpb3JzIHdlcmUgd3JvbmcsIGJ1dCBpbiBkaWZm ZXJlbnQgY2FzZXMuICAqLwoKICBwY3VtLT5hYXBjc19hcmdfcHJvY2Vzc2VkID0gdHJ1ZTsKCiAg cHVyZV9zY2FsYWJsZV90eXBlX2luZm8gcHN0X2luZm87CiAgaWYgKHR5cGUgJiYgcHN0X2luZm8u YW5hbHl6ZV9yZWdpc3RlcnMgKHR5cGUpKQogICAgewogICAgICAvKiBhYXJjaDY0X2Z1bmN0aW9u X2FyZ19hbGlnbm1lbnQgaGFzIG5ldmVyIGhhZCBhbiBlZmZlY3Qgb24KCSB0aGlzIGNhc2UuICAq LwoKICAgICAgLyogVGhlIFBDUyBzYXlzIHRoYXQgaXQgaXMgaW52YWxpZCB0byBwYXNzIGFuIFNW RSB2YWx1ZSB0byBhbgoJIHVucHJvdG90eXBlZCBmdW5jdGlvbi4gIFRoZXJlIGlzIG5vIEFCSS1k ZWZpbmVkIGxvY2F0aW9uIHdlCgkgY2FuIHJldHVybiBpbiB0aGlzIGNhc2UsIHNvIHdlIGhhdmUg bm8gcmVhbCBjaG9pY2UgYnV0IHRvIHJhaXNlCgkgYW4gZXJyb3IgaW1tZWRpYXRlbHksIGV2ZW4g dGhvdWdoIHRoaXMgaXMgb25seSBhIHF1ZXJ5IGZ1bmN0aW9uLiAgKi8KICAgICAgaWYgKGFyZy5u YW1lZCAmJiBwY3VtLT5wY3NfdmFyaWFudCAhPSBBUk1fUENTX1NWRSkKCXsKCSAgZ2NjX2Fzc2Vy dCAoIXBjdW0tPnNpbGVudF9wKTsKCSAgZXJyb3IgKCJTVkUgdHlwZSAlcVQgY2Fubm90IGJlIHBh c3NlZCB0byBhbiB1bnByb3RvdHlwZWQgZnVuY3Rpb24iLAoJCSBhcmcudHlwZSk7CgkgIC8qIEF2 b2lkIHJlcGVhdGluZyB0aGUgbWVzc2FnZSwgYW5kIGF2b2lkIHRyaXBwaW5nIHRoZSBhc3NlcnQK CSAgICAgYmVsb3cuICAqLwoJICBwY3VtLT5wY3NfdmFyaWFudCA9IEFSTV9QQ1NfU1ZFOwoJfQoK ICAgICAgLyogV2Ugd291bGQgaGF2ZSBjb252ZXJ0ZWQgdGhlIGFyZ3VtZW50IGludG8gcGFzcy1i eS1yZWZlcmVuY2UKCSBmb3JtIGlmIGl0IGRpZG4ndCBmaXQgaW4gcmVnaXN0ZXJzLiAgKi8KICAg ICAgcGN1bS0+YWFwY3NfbmV4dG52cm4gPSBwY3VtLT5hYXBjc19udnJuICsgcHN0X2luZm8ubnVt X3pyICgpOwogICAgICBwY3VtLT5hYXBjc19uZXh0bnBybiA9IHBjdW0tPmFhcGNzX25wcm4gKyBw c3RfaW5mby5udW1fcHIgKCk7CiAgICAgIGdjY19hc3NlcnQgKGFyZy5uYW1lZAoJCSAgJiYgcGN1 bS0+cGNzX3ZhcmlhbnQgPT0gQVJNX1BDU19TVkUKCQkgICYmIHBjdW0tPmFhcGNzX25leHRudnJu IDw9IE5VTV9GUF9BUkdfUkVHUwoJCSAgJiYgcGN1bS0+YWFwY3NfbmV4dG5wcm4gPD0gTlVNX1BS X0FSR19SRUdTKTsKICAgICAgcGN1bS0+YWFwY3NfcmVnID0gcHN0X2luZm8uZ2V0X3J0eCAobW9k ZSwgVjBfUkVHTlVNICsgcGN1bS0+YWFwY3NfbnZybiwKCQkJCQkgIFAwX1JFR05VTSArIHBjdW0t PmFhcGNzX25wcm4pOwogICAgICByZXR1cm47CiAgICB9CgogIC8qIEdlbmVyaWMgdmVjdG9ycyB0 aGF0IG1hcCB0byBmdWxsIFNWRSBtb2RlcyB3aXRoIC1tc3ZlLXZlY3Rvci1iaXRzPU4KICAgICBh cmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSwgbm90IGJ5IHZhbHVlLiAgKi8KICB1bnNpZ25lZCBpbnQg dmVjX2ZsYWdzID0gYWFyY2g2NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAobW9kZSk7CiAgYm9vbCBz dmVfcCA9ICh2ZWNfZmxhZ3MgJiBWRUNfQU5ZX1NWRSk7CiAgaWYgKHN2ZV9wKQogICAgLyogVmVj dG9yIHR5cGVzIGNhbiBhY3F1aXJlIGEgcGFydGlhbCBTVkUgbW9kZSB1c2luZyB0aGluZ3MgbGlr ZQogICAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoTikpKSwgYW5kIHRoaXMgaXMgcG90 ZW50aWFsbHkgdXNlZnVsLgogICAgICAgSG93ZXZlciwgdGhlIGNob2ljZSBvZiBtb2RlIGRvZXNu J3QgYWZmZWN0IHRoZSB0eXBlJ3MgQUJJCiAgICAgICBpZGVudGl0eSwgc28gd2Ugc2hvdWxkIHRy ZWF0IHRoZSB0eXBlcyBhcyB0aG91Z2ggdGhleSBoYWQKICAgICAgIHRoZSBhc3NvY2lhdGVkIGlu dGVnZXIgbW9kZSwganVzdCBsaWtlIHRoZXkgZGlkIGJlZm9yZSBTVkUKICAgICAgIHdhcyBpbnRy b2R1Y2VkLgoKICAgICAgIFdlIGtub3cgdGhhdCB0aGUgdmVjdG9yIG11c3QgYmUgMTI4IGJpdHMg b3Igc21hbGxlciwKICAgICAgIG90aGVyd2lzZSB3ZSdkIGhhdmUgcGFzc2VkIGl0IGluIG1lbW9y eSBpbnN0ZWFkLiAgKi8KICAgIGdjY19hc3NlcnQgKHR5cGUKCQkmJiAoYWFyY2g2NF9zb21lX3Zh bHVlc19pbmNsdWRlX3BzdF9vYmplY3RzX3AgKHR5cGUpCgkJICAgIHx8ICh2ZWNfZmxhZ3MgJiBW RUNfUEFSVElBTCkpKTsKCiAgLyogU2l6ZSBpbiBieXRlcywgcm91bmRlZCB0byB0aGUgbmVhcmVz dCBtdWx0aXBsZSBvZiA4IGJ5dGVzLiAgKi8KICBpZiAodHlwZSkKICAgIHNpemUgPSBpbnRfc2l6 ZV9pbl9ieXRlcyAodHlwZSk7CiAgZWxzZQogICAgLyogTm8gZnJvbnRlbmRzIGNhbiBjcmVhdGUg dHlwZXMgd2l0aCB2YXJpYWJsZS1zaXplZCBtb2Rlcywgc28gd2UKICAgICAgIHNob3VsZG4ndCBi ZSBhc2tlZCB0byBwYXNzIG9yIHJldHVybiB0aGVtLiAgKi8KICAgIHNpemUgPSBHRVRfTU9ERV9T SVpFIChtb2RlKS50b19jb25zdGFudCAoKTsKICBzaXplID0gUk9VTkRfVVAgKHNpemUsIFVOSVRT X1BFUl9XT1JEKTsKCiAgYWxsb2NhdGVfbmNybiA9ICh0eXBlKSA/ICEoRkxPQVRfVFlQRV9QICh0 eXBlKSkgOiAhRkxPQVRfTU9ERV9QIChtb2RlKTsKICBhbGxvY2F0ZV9udnJuID0gYWFyY2g2NF92 ZnBfaXNfY2FsbF9jYW5kaWRhdGUgKHBjdW1fdiwKCQkJCQkJIG1vZGUsCgkJCQkJCSB0eXBlLAoJ CQkJCQkgJm5yZWdzKTsKICBnY2NfYXNzZXJ0ICghc3ZlX3AgfHwgIWFsbG9jYXRlX252cm4pOwoK ICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50CiAgICA9IGFhcmNoNjRfZnVuY3Rpb25fYXJnX2FsaWdu bWVudCAobW9kZSwgdHlwZSwgJmFiaV9icmVha19nY2NfOSwKCQkJCSAgICAgICZhYmlfYnJlYWtf Z2NjXzEzLCAmYWJpX2JyZWFrX2djY18xNCk7CgogIGdjY19hc3NlcnQgKChhbGxvY2F0ZV9udnJu IHx8IGFsaWdubWVudCA8PSAxNiAqIEJJVFNfUEVSX1VOSVQpCgkgICAgICAmJiAoIWFsaWdubWVu dCB8fCBhYmlfYnJlYWtfZ2NjXzkgPCBhbGlnbm1lbnQpCgkgICAgICAmJiAoIWFiaV9icmVha19n Y2NfMTMgfHwgYWxpZ25tZW50IDwgYWJpX2JyZWFrX2djY18xMykpOwoKICAvKiBhbGxvY2F0ZV9u Y3JuIG1heSBiZSBmYWxzZS1wb3NpdGl2ZSwgYnV0IGFsbG9jYXRlX252cm4gaXMgcXVpdGUgcmVs aWFibGUuCiAgICAgVGhlIGZvbGxvd2luZyBjb2RlIHRodXMgaGFuZGxlcyBwYXNzaW5nIGJ5IFNJ TUQvRlAgcmVnaXN0ZXJzIGZpcnN0LiAgKi8KCiAgbnZybiA9IHBjdW0tPmFhcGNzX252cm47Cgog IC8qIEMxIC0gQzUgZm9yIGZsb2F0aW5nIHBvaW50LCBob21vZ2Vub3VzIGZsb2F0aW5nIHBvaW50 IGFnZ3JlZ2F0ZXMgKEhGQSkKICAgICBhbmQgaG9tb2dlbm91cyBzaG9ydC12ZWN0b3IgYWdncmVn YXRlcyAoSFZBKS4gICovCiAgaWYgKGFsbG9jYXRlX252cm4pCiAgICB7CiAgICAgIC8qIGFhcmNo NjRfZnVuY3Rpb25fYXJnX2FsaWdubWVudCBoYXMgbmV2ZXIgaGFkIGFuIGVmZmVjdCBvbgoJIHRo aXMgY2FzZS4gICovCiAgICAgIGlmICghcGN1bS0+c2lsZW50X3AgJiYgIVRBUkdFVF9GTE9BVCkK CWFhcmNoNjRfZXJyX25vX2ZwYWR2c2ltZCAobW9kZSk7CgogICAgICBpZiAobnZybiArIG5yZWdz IDw9IE5VTV9GUF9BUkdfUkVHUykKCXsKCSAgcGN1bS0+YWFwY3NfbmV4dG52cm4gPSBudnJuICsg bnJlZ3M7CgkgIGlmICghYWFyY2g2NF9jb21wb3NpdGVfdHlwZV9wICh0eXBlLCBtb2RlKSkKCSAg ICB7CgkgICAgICBnY2NfYXNzZXJ0IChucmVncyA9PSAxKTsKCSAgICAgIHBjdW0tPmFhcGNzX3Jl ZyA9IGdlbl9ydHhfUkVHIChtb2RlLCBWMF9SRUdOVU0gKyBudnJuKTsKCSAgICB9CgkgIGVsc2Ug aWYgKGFhcmNoNjRfYWR2c2ltZF9mdWxsX3N0cnVjdF9tb2RlX3AgKG1vZGUpCgkJICAgJiYga25v d25fZXEgKEdFVF9NT0RFX1NJWkUgKHBjdW0tPmFhcGNzX3ZmcF9ybW9kZSksIDE2KSkKCSAgICBw Y3VtLT5hYXBjc19yZWcgPSBnZW5fcnR4X1JFRyAobW9kZSwgVjBfUkVHTlVNICsgbnZybik7Cgkg IGVsc2UgaWYgKGFhcmNoNjRfYWR2c2ltZF9wYXJ0aWFsX3N0cnVjdF9tb2RlX3AgKG1vZGUpCgkJ ICAgJiYga25vd25fZXEgKEdFVF9NT0RFX1NJWkUgKHBjdW0tPmFhcGNzX3ZmcF9ybW9kZSksIDgp KQoJICAgIHBjdW0tPmFhcGNzX3JlZyA9IGdlbl9ydHhfUkVHIChtb2RlLCBWMF9SRUdOVU0gKyBu dnJuKTsKCSAgZWxzZQoJICAgIHsKCSAgICAgIHJ0eCBwYXI7CgkgICAgICBpbnQgaTsKCSAgICAg IHBhciA9IGdlbl9ydHhfUEFSQUxMRUwgKG1vZGUsIHJ0dmVjX2FsbG9jIChucmVncykpOwoJICAg ICAgZm9yIChpID0gMDsgaSA8IG5yZWdzOyBpKyspCgkJewoJCSAgcnR4IHRtcCA9IGdlbl9ydHhf UkVHIChwY3VtLT5hYXBjc192ZnBfcm1vZGUsCgkJCQkJIFYwX1JFR05VTSArIG52cm4gKyBpKTsK CQkgIHJ0eCBvZmZzZXQgPSBnZW5faW50X21vZGUKCQkgICAgKGkgKiBHRVRfTU9ERV9TSVpFIChw Y3VtLT5hYXBjc192ZnBfcm1vZGUpLCBQbW9kZSk7CgkJICB0bXAgPSBnZW5fcnR4X0VYUFJfTElT VCAoVk9JRG1vZGUsIHRtcCwgb2Zmc2V0KTsKCQkgIFhWRUNFWFAgKHBhciwgMCwgaSkgPSB0bXA7 CgkJfQoJICAgICAgcGN1bS0+YWFwY3NfcmVnID0gcGFyOwoJICAgIH0KCSAgcmV0dXJuOwoJfQog ICAgICBlbHNlCgl7CgkgIC8qIEMuMyBOU1JOIGlzIHNldCB0byA4LiAgKi8KCSAgcGN1bS0+YWFw Y3NfbmV4dG52cm4gPSBOVU1fRlBfQVJHX1JFR1M7CgkgIGdvdG8gb25fc3RhY2s7Cgl9CiAgICB9 CgogIG5jcm4gPSBwY3VtLT5hYXBjc19uY3JuOwogIG5yZWdzID0gc2l6ZSAvIFVOSVRTX1BFUl9X T1JEOwoKICAvKiBDNiAtIEM5LiAgdGhvdWdoIHRoZSBzaWduIGFuZCB6ZXJvIGV4dGVuc2lvbiBz ZW1hbnRpY3MgYXJlCiAgICAgaGFuZGxlZCBlbHNld2hlcmUuICBUaGlzIGlzIHRoZSBjYXNlIHdo ZXJlIHRoZSBhcmd1bWVudCBmaXRzCiAgICAgZW50aXJlbHkgZ2VuZXJhbCByZWdpc3RlcnMuICAq LwogIGlmIChhbGxvY2F0ZV9uY3JuICYmIChuY3JuICsgbnJlZ3MgPD0gTlVNX0FSR19SRUdTKSkK ICAgIHsKICAgICAgZ2NjX2Fzc2VydCAobnJlZ3MgPT0gMCB8fCBucmVncyA9PSAxIHx8IG5yZWdz ID09IDIpOwoKICAgICAgLyogQy44IGlmIHRoZSBhcmd1bWVudCBoYXMgYW4gYWxpZ25tZW50IG9m IDE2IHRoZW4gdGhlIE5HUk4gaXMKCSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVy LiAgKi8KICAgICAgaWYgKG5yZWdzID09IDIKCSAgJiYgbmNybiAlIDIpCgl7CgkgIC8qIEVtaXQg YSB3YXJuaW5nIGlmIHRoZSBhbGlnbm1lbnQgY2hhbmdlZCB3aGVuIHRha2luZyB0aGUKCSAgICAg J3BhY2tlZCcgYXR0cmlidXRlIGludG8gYWNjb3VudC4gICovCgkgIGlmICh3YXJuX3Bjc19jaGFu Z2UKCSAgICAgICYmIGFiaV9icmVha19nY2NfMTMKCSAgICAgICYmICgoYWJpX2JyZWFrX2djY18x MyA9PSAxNiAqIEJJVFNfUEVSX1VOSVQpCgkJICAhPSAoYWxpZ25tZW50ID09IDE2ICogQklUU19Q RVJfVU5JVCkpKQoJICAgIGluZm9ybSAoaW5wdXRfbG9jYXRpb24sICJwYXJhbWV0ZXIgcGFzc2lu ZyBmb3IgYXJndW1lbnQgb2YgdHlwZSAiCgkJICAgICIlcVQgY2hhbmdlZCBpbiBHQ0MgMTMuMSIs IHR5cGUpOwoKCSAgaWYgKHdhcm5fcGNzX2NoYW5nZQoJICAgICAgJiYgYWJpX2JyZWFrX2djY18x NAoJICAgICAgJiYgKChhYmlfYnJlYWtfZ2NjXzE0ID09IDE2ICogQklUU19QRVJfVU5JVCkKCQkg ICE9IChhbGlnbm1lbnQgPT0gMTYgKiBCSVRTX1BFUl9VTklUKSkpCgkgICAgaW5mb3JtIChpbnB1 dF9sb2NhdGlvbiwgInBhcmFtZXRlciBwYXNzaW5nIGZvciBhcmd1bWVudCBvZiB0eXBlICIKCQkg ICAgIiVxVCBjaGFuZ2VkIGluIEdDQyAxNC4xIiwgdHlwZSk7CgoJICAvKiBUaGUgPT0gMTYgKiBC SVRTX1BFUl9VTklUIGluc3RlYWQgb2YgPj0gMTYgKiBCSVRTX1BFUl9VTklUCgkgICAgIGNvbXBh cmlzb24gaXMgdGhlcmUgYmVjYXVzZSBmb3IgPiAxNiAqIEJJVFNfUEVSX1VOSVQKCSAgICAgYWxp Z25tZW50IG5yZWdzIHNob3VsZCBiZSA+IDIgYW5kIHRoZXJlZm9yZSBpdCBzaG91bGQgYmUKCSAg ICAgcGFzc2VkIGJ5IHJlZmVyZW5jZSByYXRoZXIgdGhhbiB2YWx1ZS4gICovCgkgIGlmIChhbGln bm1lbnQgPT0gMTYgKiBCSVRTX1BFUl9VTklUKQoJICAgIHsKCSAgICAgIGlmICh3YXJuX3Bjc19j aGFuZ2UgJiYgYWJpX2JyZWFrX2djY185KQoJCWluZm9ybSAoaW5wdXRfbG9jYXRpb24sICJwYXJh bWV0ZXIgcGFzc2luZyBmb3IgYXJndW1lbnQgb2YgdHlwZSAiCgkJCSIlcVQgY2hhbmdlZCBpbiBH Q0MgOS4xIiwgdHlwZSk7CgkgICAgICArK25jcm47CgkgICAgICBnY2NfYXNzZXJ0IChuY3JuICsg bnJlZ3MgPD0gTlVNX0FSR19SRUdTKTsKCSAgICB9Cgl9CgogICAgICAvKiBJZiBhbiBhcmd1bWVu dCB3aXRoIGFuIFNWRSBtb2RlIG5lZWRzIHRvIGJlIHNoaWZ0ZWQgdXAgdG8gdGhlCgkgaGlnaCBw YXJ0IG9mIHRoZSByZWdpc3RlciwgdHJlYXQgaXQgYXMgdGhvdWdoIGl0IGhhZCBhbiBpbnRlZ2Vy IG1vZGUuCgkgVXNpbmcgdGhlIG5vcm1hbCAocGFyYWxsZWwgWy4uLl0pIHdvdWxkIHN1cHByZXNz IHRoZSBzaGlmdGluZy4gICovCiAgICAgIGlmIChzdmVfcAoJICAmJiBCWVRFU19CSUdfRU5ESUFO CgkgICYmIG1heWJlX25lIChHRVRfTU9ERV9TSVpFIChtb2RlKSwgbnJlZ3MgKiBVTklUU19QRVJf V09SRCkKCSAgJiYgYWFyY2g2NF9wYWRfcmVnX3Vwd2FyZCAobW9kZSwgdHlwZSwgZmFsc2UpKQoJ ewoJICBtb2RlID0gaW50X21vZGVfZm9yX21vZGUgKG1vZGUpLnJlcXVpcmUgKCk7CgkgIHN2ZV9w ID0gZmFsc2U7Cgl9CgogICAgICAvKiBOUkVHUyBjYW4gYmUgMCB3aGVuIGUuZy4gYW4gZW1wdHkg c3RydWN0dXJlIGlzIHRvIGJlIHBhc3NlZC4KCSBBIHJlZyBpcyBzdGlsbCBnZW5lcmF0ZWQgZm9y IGl0LCBidXQgdGhlIGNhbGxlciBzaG91bGQgYmUgc21hcnQKCSBlbm91Z2ggbm90IHRvIHVzZSBp dC4gICovCiAgICAgIGlmIChucmVncyA9PSAwCgkgIHx8IChucmVncyA9PSAxICYmICFzdmVfcCkK CSAgfHwgR0VUX01PREVfQ0xBU1MgKG1vZGUpID09IE1PREVfSU5UKQoJcGN1bS0+YWFwY3NfcmVn ID0gZ2VuX3J0eF9SRUcgKG1vZGUsIFIwX1JFR05VTSArIG5jcm4pOwogICAgICBlbHNlCgl7Cgkg IHJ0eCBwYXI7CgkgIGludCBpOwoKCSAgcGFyID0gZ2VuX3J0eF9QQVJBTExFTCAobW9kZSwgcnR2 ZWNfYWxsb2MgKG5yZWdzKSk7CgkgIGZvciAoaSA9IDA7IGkgPCBucmVnczsgaSsrKQoJICAgIHsK CSAgICAgIHNjYWxhcl9pbnRfbW9kZSByZWdfbW9kZSA9IHdvcmRfbW9kZTsKCSAgICAgIGlmIChu cmVncyA9PSAxKQoJCXJlZ19tb2RlID0gaW50X21vZGVfZm9yX21vZGUgKG1vZGUpLnJlcXVpcmUg KCk7CgkgICAgICBydHggdG1wID0gZ2VuX3J0eF9SRUcgKHJlZ19tb2RlLCBSMF9SRUdOVU0gKyBu Y3JuICsgaSk7CgkgICAgICB0bXAgPSBnZW5fcnR4X0VYUFJfTElTVCAoVk9JRG1vZGUsIHRtcCwK CQkJCSAgICAgICBHRU5fSU5UIChpICogVU5JVFNfUEVSX1dPUkQpKTsKCSAgICAgIFhWRUNFWFAg KHBhciwgMCwgaSkgPSB0bXA7CgkgICAgfQoJICBwY3VtLT5hYXBjc19yZWcgPSBwYXI7Cgl9Cgog ICAgICBwY3VtLT5hYXBjc19uZXh0bmNybiA9IG5jcm4gKyBucmVnczsKICAgICAgcmV0dXJuOwog ICAgfQoKICAvKiBDLjExICAqLwogIHBjdW0tPmFhcGNzX25leHRuY3JuID0gTlVNX0FSR19SRUdT OwoKICAvKiBUaGUgYXJndW1lbnQgaXMgcGFzc2VkIG9uIHN0YWNrOyByZWNvcmQgdGhlIG5lZWRl ZCBudW1iZXIgb2Ygd29yZHMgZm9yCiAgICAgdGhpcyBhcmd1bWVudCBhbmQgYWxpZ24gdGhlIHRv dGFsIHNpemUgaWYgbmVjZXNzYXJ5LiAgKi8Kb25fc3RhY2s6CiAgcGN1bS0+YWFwY3Nfc3RhY2tf d29yZHMgPSBzaXplIC8gVU5JVFNfUEVSX1dPUkQ7CgogIGlmICh3YXJuX3Bjc19jaGFuZ2UKICAg ICAgJiYgYWJpX2JyZWFrX2djY18xMwogICAgICAmJiAoKGFiaV9icmVha19nY2NfMTMgPj0gMTYg KiBCSVRTX1BFUl9VTklUKQoJICAhPSAoYWxpZ25tZW50ID49IDE2ICogQklUU19QRVJfVU5JVCkp KQogICAgaW5mb3JtIChpbnB1dF9sb2NhdGlvbiwgInBhcmFtZXRlciBwYXNzaW5nIGZvciBhcmd1 bWVudCBvZiB0eXBlICIKCSAgICAiJXFUIGNoYW5nZWQgaW4gR0NDIDEzLjEiLCB0eXBlKTsKCiAg aWYgKHdhcm5fcGNzX2NoYW5nZQogICAgICAmJiBhYmlfYnJlYWtfZ2NjXzE0CiAgICAgICYmICgo YWJpX2JyZWFrX2djY18xNCA+PSAxNiAqIEJJVFNfUEVSX1VOSVQpCgkgICE9IChhbGlnbm1lbnQg Pj0gMTYgKiBCSVRTX1BFUl9VTklUKSkpCiAgICBpbmZvcm0gKGlucHV0X2xvY2F0aW9uLCAicGFy YW1ldGVyIHBhc3NpbmcgZm9yIGFyZ3VtZW50IG9mIHR5cGUgIgoJICAgICIlcVQgY2hhbmdlZCBp biBHQ0MgMTQuMSIsIHR5cGUpOwoKICBpZiAoYWxpZ25tZW50ID09IDE2ICogQklUU19QRVJfVU5J VCkKICAgIHsKICAgICAgaW50IG5ld19zaXplID0gUk9VTkRfVVAgKHBjdW0tPmFhcGNzX3N0YWNr X3NpemUsIDE2IC8gVU5JVFNfUEVSX1dPUkQpOwogICAgICBpZiAocGN1bS0+YWFwY3Nfc3RhY2tf c2l6ZSAhPSBuZXdfc2l6ZSkKCXsKCSAgaWYgKHdhcm5fcGNzX2NoYW5nZSAmJiBhYmlfYnJlYWtf Z2NjXzkpCgkgICAgaW5mb3JtIChpbnB1dF9sb2NhdGlvbiwgInBhcmFtZXRlciBwYXNzaW5nIGZv ciBhcmd1bWVudCBvZiB0eXBlICIKCQkgICAgIiVxVCBjaGFuZ2VkIGluIEdDQyA5LjEiLCB0eXBl KTsKCSAgcGN1bS0+YWFwY3Nfc3RhY2tfc2l6ZSA9IG5ld19zaXplOwoJfQogICAgfQogIHJldHVy bjsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9GVU5DVElPTl9BUkcuICAqLwoKc3RhdGljIHJ0eAph YXJjaDY0X2Z1bmN0aW9uX2FyZyAoY3VtdWxhdGl2ZV9hcmdzX3QgcGN1bV92LCBjb25zdCBmdW5j dGlvbl9hcmdfaW5mbyAmYXJnKQp7CiAgQ1VNVUxBVElWRV9BUkdTICpwY3VtID0gZ2V0X2N1bXVs YXRpdmVfYXJncyAocGN1bV92KTsKICBnY2NfYXNzZXJ0IChwY3VtLT5wY3NfdmFyaWFudCA9PSBB Uk1fUENTX0FBUENTNjQKCSAgICAgIHx8IHBjdW0tPnBjc192YXJpYW50ID09IEFSTV9QQ1NfU0lN RAoJICAgICAgfHwgcGN1bS0+cGNzX3ZhcmlhbnQgPT0gQVJNX1BDU19TVkUpOwoKICBpZiAoYXJn LmVuZF9tYXJrZXJfcCAoKSkKICAgIHJldHVybiBnZW5faW50X21vZGUgKHBjdW0tPnBjc192YXJp YW50LCBESW1vZGUpOwoKICBhYXJjaDY0X2xheW91dF9hcmcgKHBjdW1fdiwgYXJnKTsKICByZXR1 cm4gcGN1bS0+YWFwY3NfcmVnOwp9Cgp2b2lkCmFhcmNoNjRfaW5pdF9jdW11bGF0aXZlX2FyZ3Mg KENVTVVMQVRJVkVfQVJHUyAqcGN1bSwKCQkJICAgICAgY29uc3RfdHJlZSBmbnR5cGUsCgkJCSAg ICAgIHJ0eCBsaWJuYW1lIEFUVFJJQlVURV9VTlVTRUQsCgkJCSAgICAgIGNvbnN0X3RyZWUgZm5k ZWNsIEFUVFJJQlVURV9VTlVTRUQsCgkJCSAgICAgIHVuc2lnbmVkIG5fbmFtZWQgQVRUUklCVVRF X1VOVVNFRCwKCQkJICAgICAgYm9vbCBzaWxlbnRfcCkKewogIHBjdW0tPmFhcGNzX25jcm4gPSAw OwogIHBjdW0tPmFhcGNzX252cm4gPSAwOwogIHBjdW0tPmFhcGNzX25wcm4gPSAwOwogIHBjdW0t PmFhcGNzX25leHRuY3JuID0gMDsKICBwY3VtLT5hYXBjc19uZXh0bnZybiA9IDA7CiAgcGN1bS0+ YWFwY3NfbmV4dG5wcm4gPSAwOwogIGlmIChmbnR5cGUpCiAgICBwY3VtLT5wY3NfdmFyaWFudCA9 IChhcm1fcGNzKSBmbnR5cGVfYWJpIChmbnR5cGUpLmlkICgpOwogIGVsc2UKICAgIHBjdW0tPnBj c192YXJpYW50ID0gQVJNX1BDU19BQVBDUzY0OwogIHBjdW0tPmFhcGNzX3JlZyA9IE5VTExfUlRY OwogIHBjdW0tPmFhcGNzX2FyZ19wcm9jZXNzZWQgPSBmYWxzZTsKICBwY3VtLT5hYXBjc19zdGFj a193b3JkcyA9IDA7CiAgcGN1bS0+YWFwY3Nfc3RhY2tfc2l6ZSA9IDA7CiAgcGN1bS0+c2lsZW50 X3AgPSBzaWxlbnRfcDsKCiAgaWYgKCFzaWxlbnRfcAogICAgICAmJiAhVEFSR0VUX0ZMT0FUCiAg ICAgICYmIGZudHlwZSAmJiBmbnR5cGUgIT0gZXJyb3JfbWFya19ub2RlKQogICAgewogICAgICBj b25zdF90cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGZudHlwZSk7CiAgICAgIG1hY2hpbmVfbW9kZSBt b2RlIEFUVFJJQlVURV9VTlVTRUQ7IC8qIFRvIHBhc3MgcG9pbnRlciBhcyBhcmd1bWVudC4gICov CiAgICAgIGludCBucmVncyBBVFRSSUJVVEVfVU5VU0VEOyAvKiBMaWtld2lzZS4gICovCiAgICAg IGlmIChhYXJjaDY0X3ZmcF9pc19jYWxsX29yX3JldHVybl9jYW5kaWRhdGUgKFRZUEVfTU9ERSAo dHlwZSksIHR5cGUsCgkJCQkJCSAgICZtb2RlLCAmbnJlZ3MsIE5VTEwsIGZhbHNlKSkKCWFhcmNo NjRfZXJyX25vX2ZwYWR2c2ltZCAoVFlQRV9NT0RFICh0eXBlKSk7CiAgICB9CgogIGlmICghc2ls ZW50X3AKICAgICAgJiYgIVRBUkdFVF9TVkUKICAgICAgJiYgcGN1bS0+cGNzX3ZhcmlhbnQgPT0g QVJNX1BDU19TVkUpCiAgICB7CiAgICAgIC8qIFdlIGNhbid0IGdyYWNlZnVsbHkgcmVjb3ZlciBh dCB0aGlzIHBvaW50LCBzbyBtYWtlIHRoaXMgYQoJIGZhdGFsIGVycm9yLiAgKi8KICAgICAgaWYg KGZuZGVjbCkKCWZhdGFsX2Vycm9yIChpbnB1dF9sb2NhdGlvbiwgIiVxRSByZXF1aXJlcyB0aGUg U1ZFIElTQSBleHRlbnNpb24iLAoJCSAgICAgZm5kZWNsKTsKICAgICAgZWxzZQoJZmF0YWxfZXJy b3IgKGlucHV0X2xvY2F0aW9uLCAiY2FsbHMgdG8gZnVuY3Rpb25zIG9mIHR5cGUgJXFUIHJlcXVp cmUiCgkJICAgICAiIHRoZSBTVkUgSVNBIGV4dGVuc2lvbiIsIGZudHlwZSk7CiAgICB9Cn0KCnN0 YXRpYyB2b2lkCmFhcmNoNjRfZnVuY3Rpb25fYXJnX2FkdmFuY2UgKGN1bXVsYXRpdmVfYXJnc190 IHBjdW1fdiwKCQkJICAgICAgY29uc3QgZnVuY3Rpb25fYXJnX2luZm8gJmFyZykKewogIENVTVVM QVRJVkVfQVJHUyAqcGN1bSA9IGdldF9jdW11bGF0aXZlX2FyZ3MgKHBjdW1fdik7CiAgaWYgKHBj dW0tPnBjc192YXJpYW50ID09IEFSTV9QQ1NfQUFQQ1M2NAogICAgICB8fCBwY3VtLT5wY3NfdmFy aWFudCA9PSBBUk1fUENTX1NJTUQKICAgICAgfHwgcGN1bS0+cGNzX3ZhcmlhbnQgPT0gQVJNX1BD U19TVkUpCiAgICB7CiAgICAgIGFhcmNoNjRfbGF5b3V0X2FyZyAocGN1bV92LCBhcmcpOwogICAg ICBnY2NfYXNzZXJ0ICgocGN1bS0+YWFwY3NfcmVnICE9IE5VTExfUlRYKQoJCSAgIT0gKHBjdW0t PmFhcGNzX3N0YWNrX3dvcmRzICE9IDApKTsKICAgICAgcGN1bS0+YWFwY3NfYXJnX3Byb2Nlc3Nl ZCA9IGZhbHNlOwogICAgICBwY3VtLT5hYXBjc19uY3JuID0gcGN1bS0+YWFwY3NfbmV4dG5jcm47 CiAgICAgIHBjdW0tPmFhcGNzX252cm4gPSBwY3VtLT5hYXBjc19uZXh0bnZybjsKICAgICAgcGN1 bS0+YWFwY3NfbnBybiA9IHBjdW0tPmFhcGNzX25leHRucHJuOwogICAgICBwY3VtLT5hYXBjc19z dGFja19zaXplICs9IHBjdW0tPmFhcGNzX3N0YWNrX3dvcmRzOwogICAgICBwY3VtLT5hYXBjc19z dGFja193b3JkcyA9IDA7CiAgICAgIHBjdW0tPmFhcGNzX3JlZyA9IE5VTExfUlRYOwogICAgfQp9 Cgpib29sCmFhcmNoNjRfZnVuY3Rpb25fYXJnX3JlZ25vX3AgKHVuc2lnbmVkIHJlZ25vKQp7CiAg cmV0dXJuICgoR1BfUkVHTlVNX1AgKHJlZ25vKSAmJiByZWdubyA8IFIwX1JFR05VTSArIE5VTV9B UkdfUkVHUykKCSAgfHwgKEZQX1JFR05VTV9QIChyZWdubykgJiYgcmVnbm8gPCBWMF9SRUdOVU0g KyBOVU1fRlBfQVJHX1JFR1MpCgkgIHx8IChQUl9SRUdOVU1fUCAocmVnbm8pICYmIHJlZ25vIDwg UDBfUkVHTlVNICsgTlVNX1BSX0FSR19SRUdTKSk7Cn0KCi8qIEltcGxlbWVudCBGVU5DVElPTl9B UkdfQk9VTkRBUlkuICBFdmVyeSBwYXJhbWV0ZXIgZ2V0cyBhdCBsZWFzdAogICBQQVJNX0JPVU5E QVJZIGJpdHMgb2YgYWxpZ25tZW50LCBidXQgd2lsbCBiZSBnaXZlbiBhbnl0aGluZyB1cAogICB0 byBTVEFDS19CT1VOREFSWSBiaXRzIGlmIHRoZSB0eXBlIHJlcXVpcmVzIGl0LiAgVGhpcyBtYWtl cyBzdXJlCiAgIHRoYXQgYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBsYXlvdXQgb2YgZWFjaCBh cmd1bWVudCwgdGhlIE5leHQKICAgU3RhY2tlZCBBcmd1bWVudCBBZGRyZXNzIChOU0FBKSB3aWxs IGhhdmUgYSBtaW5pbXVtIGFsaWdubWVudCBvZgogICA4IGJ5dGVzLiAgKi8KCnN0YXRpYyB1bnNp Z25lZCBpbnQKYWFyY2g2NF9mdW5jdGlvbl9hcmdfYm91bmRhcnkgKG1hY2hpbmVfbW9kZSBtb2Rl LCBjb25zdF90cmVlIHR5cGUpCnsKICB1bnNpZ25lZCBpbnQgYWJpX2JyZWFrX2djY185OwogIHVu c2lnbmVkIGludCBhYmlfYnJlYWtfZ2NjXzEzOwogIHVuc2lnbmVkIGludCBhYmlfYnJlYWtfZ2Nj XzE0OwogIHVuc2lnbmVkIGludCBhbGlnbm1lbnQgPSBhYXJjaDY0X2Z1bmN0aW9uX2FyZ19hbGln bm1lbnQgKG1vZGUsIHR5cGUsCgkJCQkJCQkgICAmYWJpX2JyZWFrX2djY185LAoJCQkJCQkJICAg JmFiaV9icmVha19nY2NfMTMsCgkJCQkJCQkgICAmYWJpX2JyZWFrX2djY18xNCk7CiAgLyogV2Ug cmVseSBvbiBhYXJjaDY0X2xheW91dF9hcmcgYW5kIGFhcmNoNjRfZ2ltcGxpZnlfdmFfYXJnX2V4 cHIKICAgICB0byBlbWl0IHdhcm5pbmdzIGFib3V0IEFCSSBpbmNvbXBhdGliaWxpdHkuICAqLwog IGFsaWdubWVudCA9IE1JTiAoTUFYIChhbGlnbm1lbnQsIFBBUk1fQk9VTkRBUlkpLCBTVEFDS19C T1VOREFSWSk7CiAgcmV0dXJuIGFsaWdubWVudDsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9HRVRf UkFXX1JFU1VMVF9NT0RFIGFuZCBUQVJHRVRfR0VUX1JBV19BUkdfTU9ERS4gICovCgpzdGF0aWMg Zml4ZWRfc2l6ZV9tb2RlCmFhcmNoNjRfZ2V0X3JlZ19yYXdfbW9kZSAoaW50IHJlZ25vKQp7CiAg aWYgKFRBUkdFVF9TVkUgJiYgRlBfUkVHTlVNX1AgKHJlZ25vKSkKICAgIC8qIERvbid0IHVzZSB0 aGUgU1ZFIHBhcnQgb2YgdGhlIHJlZ2lzdGVyIGZvciBfX2J1aWx0aW5fYXBwbHkgYW5kCiAgICAg ICBfX2J1aWx0aW5fcmV0dXJuLiAgVGhlIFNWRSByZWdpc3RlcnMgYXJlbid0IHVzZWQgYnkgdGhl IG5vcm1hbCBQQ1MsCiAgICAgICBzbyB1c2luZyB0aGVtIHRoZXJlIHdvdWxkIGJlIGEgd2FzdGUg b2YgdGltZS4gIFRoZSBQQ1MgZXh0ZW5zaW9ucwogICAgICAgZm9yIFNWRSB0eXBlcyBhcmUgZnVu ZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUKICAgICAgIF9fYnVpbHRpbl9yZXR1cm4v X19idWlsdGluX2FwcGx5IGludGVyZmFjZS4gICovCiAgICByZXR1cm4gYXNfYSA8Zml4ZWRfc2l6 ZV9tb2RlPiAoVjE2UUltb2RlKTsKICBpZiAoUFJfUkVHTlVNX1AgKHJlZ25vKSkKICAgIC8qIEZv ciBTVkUgUFIgcmVncywgaW5kaWNhdGUgdGhhdCB0aGV5IHNob3VsZCBiZSBpZ25vcmVkIGZvcgog ICAgICAgX19idWlsdGluX2FwcGx5L19fYnVpbHRpbl9yZXR1cm4uICAqLwogICAgcmV0dXJuIGFz X2EgPGZpeGVkX3NpemVfbW9kZT4gKFZPSURtb2RlKTsKICByZXR1cm4gZGVmYXVsdF9nZXRfcmVn X3Jhd19tb2RlIChyZWdubyk7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfRlVOQ1RJT05fQVJHX1BB RERJTkcuCgogICBTbWFsbCBhZ2dyZWdhdGUgdHlwZXMgYXJlIHBsYWNlZCBpbiB0aGUgbG93ZXN0 IG1lbW9yeSBhZGRyZXNzLgoKICAgVGhlIHJlbGF0ZWQgcGFyYW1ldGVyIHBhc3NpbmcgcnVsZXMg YXJlIEIuNCwgQy4zLCBDLjUgYW5kIEMuMTQuICAqLwoKc3RhdGljIHBhZF9kaXJlY3Rpb24KYWFy Y2g2NF9mdW5jdGlvbl9hcmdfcGFkZGluZyAobWFjaGluZV9tb2RlIG1vZGUsIGNvbnN0X3RyZWUg dHlwZSkKewogIC8qIE9uIGxpdHRsZS1lbmRpYW4gdGFyZ2V0cywgdGhlIGxlYXN0IHNpZ25pZmlj YW50IGJ5dGUgb2YgZXZlcnkgc3RhY2sKICAgICBhcmd1bWVudCBpcyBwYXNzZWQgYXQgdGhlIGxv d2VzdCBieXRlIGFkZHJlc3Mgb2YgdGhlIHN0YWNrIHNsb3QuICAqLwogIGlmICghQllURVNfQklH X0VORElBTikKICAgIHJldHVybiBQQURfVVBXQVJEOwoKICAvKiBPdGhlcndpc2UsIGludGVncmFs LCBmbG9hdGluZy1wb2ludCBhbmQgcG9pbnRlciB0eXBlcyBhcmUgcGFkZGVkIGRvd253YXJkOgog ICAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIGEgc3RhY2sgYXJndW1lbnQgaXMgcGFz c2VkIGF0IHRoZSBoaWdoZXN0CiAgICAgYnl0ZSBhZGRyZXNzIG9mIHRoZSBzdGFjayBzbG90LiAg Ki8KICBpZiAodHlwZQogICAgICA/IChJTlRFR1JBTF9UWVBFX1AgKHR5cGUpIHx8IFNDQUxBUl9G TE9BVF9UWVBFX1AgKHR5cGUpCgkgfHwgUE9JTlRFUl9UWVBFX1AgKHR5cGUpKQogICAgICA6IChT Q0FMQVJfSU5UX01PREVfUCAobW9kZSkgfHwgU0NBTEFSX0ZMT0FUX01PREVfUCAobW9kZSkpKQog ICAgcmV0dXJuIFBBRF9ET1dOV0FSRDsKCiAgLyogRXZlcnl0aGluZyBlbHNlIHBhZGRlZCB1cHdh cmQsIGkuZS4gZGF0YSBpbiBmaXJzdCBieXRlIG9mIHN0YWNrIHNsb3QuICAqLwogIHJldHVybiBQ QURfVVBXQVJEOwp9CgovKiBTaW1pbGFybHksIGZvciB1c2UgYnkgQkxPQ0tfUkVHX1BBRERJTkcg KE1PREUsIFRZUEUsIEZJUlNUKS4KCiAgIEl0IHNwZWNpZmllcyBwYWRkaW5nIGZvciB0aGUgbGFz dCAobWF5IGFsc28gYmUgdGhlIG9ubHkpCiAgIGVsZW1lbnQgb2YgYSBibG9jayBtb3ZlIGJldHdl ZW4gcmVnaXN0ZXJzIGFuZCBtZW1vcnkuICBJZgogICBhc3N1bWluZyB0aGUgYmxvY2sgaXMgaW4g dGhlIG1lbW9yeSwgcGFkZGluZyB1cHdhcmQgbWVhbnMgdGhhdAogICB0aGUgbGFzdCBlbGVtZW50 IGlzIHBhZGRlZCBhZnRlciBpdHMgaGlnaGVzdCBzaWduaWZpY2FudCBieXRlLAogICB3aGlsZSBp biBkb3dud2FyZCBwYWRkaW5nLCB0aGUgbGFzdCBlbGVtZW50IGlzIHBhZGRlZCBhdCB0aGUKICAg aXRzIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgc2lkZS4KCiAgIFNtYWxsIGFnZ3JlZ2F0ZXMgYW5k IHNtYWxsIGNvbXBsZXggdHlwZXMgYXJlIGFsd2F5cyBwYWRkZWQKICAgdXB3YXJkcy4KCiAgIFdl IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaG9tb2dlbmVvdXMgZmxvYXRpbmctcG9pbnQgb3IK ICAgc2hvcnQtdmVjdG9yIGFnZ3JlZ2F0ZXM7IHRoZWlyIG1vdmUgaXMgbm90IGFmZmVjdGVkIGJ5 IHRoZQogICBwYWRkaW5nIGRpcmVjdGlvbiBkZXRlcm1pbmVkIGhlcmUuICBSZWdhcmRsZXNzIG9m IGVuZGlhbm5lc3MsCiAgIGVhY2ggZWxlbWVudCBvZiBzdWNoIGFuIGFnZ3JlZ2F0ZSBpcyBwdXQg aW4gdGhlIGxlYXN0CiAgIHNpZ25pZmljYW50IGJpdHMgb2YgYSBmcC9zaW1kIHJlZ2lzdGVyLgoK ICAgUmV0dXJuICFCWVRFU19CSUdfRU5ESUFOIGlmIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRl IG9mIHRoZQogICByZWdpc3RlciBoYXMgdXNlZnVsIGRhdGEsIGFuZCByZXR1cm4gdGhlIG9wcG9z aXRlIGlmIHRoZSBtb3N0CiAgIHNpZ25pZmljYW50IGJ5dGUgZG9lcy4gICovCgpib29sCmFhcmNo NjRfcGFkX3JlZ191cHdhcmQgKG1hY2hpbmVfbW9kZSBtb2RlLCBjb25zdF90cmVlIHR5cGUsCgkJ ICAgICBib29sIGZpcnN0IEFUVFJJQlVURV9VTlVTRUQpCnsKCiAgLyogQXNpZGUgZnJvbSBwdXJl IHNjYWxhYmxlIHR5cGVzLCBzbWFsbCBjb21wb3NpdGUgdHlwZXMgYXJlIGFsd2F5cwogICAgIHBh ZGRlZCB1cHdhcmQuICAqLwogIGlmIChCWVRFU19CSUdfRU5ESUFOICYmIGFhcmNoNjRfY29tcG9z aXRlX3R5cGVfcCAodHlwZSwgbW9kZSkpCiAgICB7CiAgICAgIEhPU1RfV0lERV9JTlQgc2l6ZTsK ICAgICAgaWYgKHR5cGUpCglzaXplID0gaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpOwogICAgICBl bHNlCgkvKiBObyBmcm9udGVuZHMgY2FuIGNyZWF0ZSB0eXBlcyB3aXRoIHZhcmlhYmxlLXNpemVk IG1vZGVzLCBzbyB3ZQoJICAgc2hvdWxkbid0IGJlIGFza2VkIHRvIHBhc3Mgb3IgcmV0dXJuIHRo ZW0uICAqLwoJc2l6ZSA9IEdFVF9NT0RFX1NJWkUgKG1vZGUpLnRvX2NvbnN0YW50ICgpOwogICAg ICBpZiAoc2l6ZSA8IDIgKiBVTklUU19QRVJfV09SRCkKCXsKCSAgcHVyZV9zY2FsYWJsZV90eXBl X2luZm8gcHN0X2luZm87CgkgIGlmIChwc3RfaW5mby5hbmFseXplX3JlZ2lzdGVycyAodHlwZSkp CgkgICAgcmV0dXJuIGZhbHNlOwoJICByZXR1cm4gdHJ1ZTsKCX0KICAgIH0KCiAgLyogT3RoZXJ3 aXNlLCB1c2UgdGhlIGRlZmF1bHQgcGFkZGluZy4gICovCiAgcmV0dXJuICFCWVRFU19CSUdfRU5E SUFOOwp9CgpzdGF0aWMgc2NhbGFyX2ludF9tb2RlCmFhcmNoNjRfbGliZ2NjX2NtcF9yZXR1cm5f bW9kZSAodm9pZCkKewogIHJldHVybiBTSW1vZGU7Cn0KCiNkZWZpbmUgUFJPQkVfSU5URVJWQUwg KDEgPDwgU1RBQ0tfQ0hFQ0tfUFJPQkVfSU5URVJWQUxfRVhQKQoKLyogV2UgdXNlIHRoZSAxMi1i aXQgc2hpZnRlZCBpbW1lZGlhdGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgc28gdmFsdWVzCiAg IG11c3QgYmUgbXVsdGlwbGUgb2YgKDEgPDwgMTIpLCBpLmUuIDQwOTYuICAqLwojZGVmaW5lIEFS SVRIX0ZBQ1RPUiA0MDk2CgojaWYgKFBST0JFX0lOVEVSVkFMICUgQVJJVEhfRkFDVE9SKSAhPSAw CiNlcnJvciBDYW5ub3QgdXNlIHNpbXBsZSBhZGRyZXNzIGNhbGN1bGF0aW9uIGZvciBzdGFjayBw cm9iaW5nCiNlbmRpZgoKLyogRW1pdCBjb2RlIHRvIHByb2JlIGEgcmFuZ2Ugb2Ygc3RhY2sgYWRk cmVzc2VzIGZyb20gRklSU1QgdG8gRklSU1QrUE9MWV9TSVpFLAogICBpbmNsdXNpdmUuICBUaGVz ZSBhcmUgb2Zmc2V0cyBmcm9tIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuICAqLwoKc3RhdGlj IHZvaWQKYWFyY2g2NF9lbWl0X3Byb2JlX3N0YWNrX3JhbmdlIChIT1NUX1dJREVfSU5UIGZpcnN0 LCBwb2x5X2ludDY0IHBvbHlfc2l6ZSkKewogIEhPU1RfV0lERV9JTlQgc2l6ZTsKICBpZiAoIXBv bHlfc2l6ZS5pc19jb25zdGFudCAoJnNpemUpKQogICAgewogICAgICBzb3JyeSAoInN0YWNrIHBy b2JlcyBmb3IgU1ZFIGZyYW1lcyIpOwogICAgICByZXR1cm47CiAgICB9CgogIHJ0eCByZWcxID0g Z2VuX3J0eF9SRUcgKFBtb2RlLCBQUk9CRV9TVEFDS19GSVJTVF9SRUdOVU0pOwoKICAvKiBTZWUg dGhlIHNhbWUgYXNzZXJ0aW9uIG9uIFBST0JFX0lOVEVSVkFMIGFib3ZlLiAgKi8KICBnY2NfYXNz ZXJ0ICgoZmlyc3QgJSBBUklUSF9GQUNUT1IpID09IDApOwoKICAvKiBTZWUgaWYgd2UgaGF2ZSBh IGNvbnN0YW50IHNtYWxsIG51bWJlciBvZiBwcm9iZXMgdG8gZ2VuZXJhdGUuICBJZiBzbywKICAg ICB0aGF0J3MgdGhlIGVhc3kgY2FzZS4gICovCiAgaWYgKHNpemUgPD0gUFJPQkVfSU5URVJWQUwp CiAgICB7CiAgICAgIGNvbnN0IEhPU1RfV0lERV9JTlQgYmFzZSA9IFJPVU5EX1VQIChzaXplLCBB UklUSF9GQUNUT1IpOwoKICAgICAgZW1pdF9zZXRfaW5zbiAocmVnMSwKCQkgICAgIHBsdXNfY29u c3RhbnQgKFBtb2RlLAoJCQkJICAgIHN0YWNrX3BvaW50ZXJfcnR4LCAtKGZpcnN0ICsgYmFzZSkp KTsKICAgICAgZW1pdF9zdGFja19wcm9iZSAocGx1c19jb25zdGFudCAoUG1vZGUsIHJlZzEsIGJh c2UgLSBzaXplKSk7CiAgICB9CgogIC8qIFRoZSBydW4tdGltZSBsb29wIGlzIG1hZGUgdXAgb2Yg OCBpbnNucyBpbiB0aGUgZ2VuZXJpYyBjYXNlIHdoaWxlIHRoZQogICAgIGNvbXBpbGUtdGltZSBs b29wIGlzIG1hZGUgdXAgb2YgNCsyKihuLTIpIGluc25zIGZvciBuICMgb2YgaW50ZXJ2YWxzLiAg Ki8KICBlbHNlIGlmIChzaXplIDw9IDQgKiBQUk9CRV9JTlRFUlZBTCkKICAgIHsKICAgICAgSE9T VF9XSURFX0lOVCBpLCByZW07CgogICAgICBlbWl0X3NldF9pbnNuIChyZWcxLAoJCSAgICAgcGx1 c19jb25zdGFudCAoUG1vZGUsCgkJCQkgICAgc3RhY2tfcG9pbnRlcl9ydHgsCgkJCQkgICAgLShm aXJzdCArIFBST0JFX0lOVEVSVkFMKSkpOwogICAgICBlbWl0X3N0YWNrX3Byb2JlIChyZWcxKTsK CiAgICAgIC8qIFByb2JlIGF0IEZJUlNUICsgTiAqIFBST0JFX0lOVEVSVkFMIGZvciB2YWx1ZXMg b2YgTiBmcm9tIDIgdW50aWwKCSBpdCBleGNlZWRzIFNJWkUuICBJZiBvbmx5IHR3byBwcm9iZXMg YXJlIG5lZWRlZCwgdGhpcyB3aWxsIG5vdAoJIGdlbmVyYXRlIGFueSBjb2RlLiAgVGhlbiBwcm9i ZSBhdCBGSVJTVCArIFNJWkUuICAqLwogICAgICBmb3IgKGkgPSAyICogUFJPQkVfSU5URVJWQUw7 IGkgPCBzaXplOyBpICs9IFBST0JFX0lOVEVSVkFMKQoJewoJICBlbWl0X3NldF9pbnNuIChyZWcx LAoJCQkgcGx1c19jb25zdGFudCAoUG1vZGUsIHJlZzEsIC1QUk9CRV9JTlRFUlZBTCkpOwoJICBl bWl0X3N0YWNrX3Byb2JlIChyZWcxKTsKCX0KCiAgICAgIHJlbSA9IHNpemUgLSAoaSAtIFBST0JF X0lOVEVSVkFMKTsKICAgICAgaWYgKHJlbSA+IDI1NikKCXsKCSAgY29uc3QgSE9TVF9XSURFX0lO VCBiYXNlID0gUk9VTkRfVVAgKHJlbSwgQVJJVEhfRkFDVE9SKTsKCgkgIGVtaXRfc2V0X2luc24g KHJlZzEsIHBsdXNfY29uc3RhbnQgKFBtb2RlLCByZWcxLCAtYmFzZSkpOwoJICBlbWl0X3N0YWNr X3Byb2JlIChwbHVzX2NvbnN0YW50IChQbW9kZSwgcmVnMSwgYmFzZSAtIHJlbSkpOwoJfQogICAg ICBlbHNlCgllbWl0X3N0YWNrX3Byb2JlIChwbHVzX2NvbnN0YW50IChQbW9kZSwgcmVnMSwgLXJl bSkpOwogICAgfQoKICAvKiBPdGhlcndpc2UsIGRvIHRoZSBzYW1lIGFzIGFib3ZlLCBidXQgaW4g YSBsb29wLiAgTm90ZSB0aGF0IHdlIG11c3QgYmUKICAgICBleHRyYSBjYXJlZnVsIHdpdGggdmFy aWFibGVzIHdyYXBwaW5nIGFyb3VuZCBiZWNhdXNlIHdlIG1pZ2h0IGJlIGF0CiAgICAgdGhlIHZl cnkgdG9wIChvciB0aGUgdmVyeSBib3R0b20pIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB3ZSBo YXZlCiAgICAgdG8gYmUgYWJsZSB0byBoYW5kbGUgdGhpcyBjYXNlIHByb3Blcmx5OyBpbiBwYXJ0 aWN1bGFyLCB3ZSB1c2UgYW4KICAgICBlcXVhbGl0eSB0ZXN0IGZvciB0aGUgbG9vcCBjb25kaXRp b24uICAqLwogIGVsc2UKICAgIHsKICAgICAgcnR4IHJlZzIgPSBnZW5fcnR4X1JFRyAoUG1vZGUs IFBST0JFX1NUQUNLX1NFQ09ORF9SRUdOVU0pOwoKICAgICAgLyogU3RlcCAxOiByb3VuZCBTSVpF IHRvIHRoZSBwcmV2aW91cyBtdWx0aXBsZSBvZiB0aGUgaW50ZXJ2YWwuICAqLwoKICAgICAgSE9T VF9XSURFX0lOVCByb3VuZGVkX3NpemUgPSBzaXplICYgLVBST0JFX0lOVEVSVkFMOwoKCiAgICAg IC8qIFN0ZXAgMjogY29tcHV0ZSBpbml0aWFsIGFuZCBmaW5hbCB2YWx1ZSBvZiB0aGUgbG9vcCBj b3VudGVyLiAgKi8KCiAgICAgIC8qIFRFU1RfQUREUiA9IFNQICsgRklSU1QuICAqLwogICAgICBl bWl0X3NldF9pbnNuIChyZWcxLAoJCSAgICAgcGx1c19jb25zdGFudCAoUG1vZGUsIHN0YWNrX3Bv aW50ZXJfcnR4LCAtZmlyc3QpKTsKCiAgICAgIC8qIExBU1RfQUREUiA9IFNQICsgRklSU1QgKyBS T1VOREVEX1NJWkUuICAqLwogICAgICBIT1NUX1dJREVfSU5UIGFkanVzdG1lbnQgPSAtIChmaXJz dCArIHJvdW5kZWRfc2l6ZSk7CiAgICAgIGlmICghIGFhcmNoNjRfdWltbTEyX3NoaWZ0IChhZGp1 c3RtZW50KSkKCXsKCSAgYWFyY2g2NF9pbnRlcm5hbF9tb3ZfaW1tZWRpYXRlIChyZWcyLCBHRU5f SU5UIChhZGp1c3RtZW50KSwKCQkJCQkgIHRydWUsIFBtb2RlKTsKCSAgZW1pdF9zZXRfaW5zbiAo cmVnMiwgZ2VuX3J0eF9QTFVTIChQbW9kZSwgc3RhY2tfcG9pbnRlcl9ydHgsIHJlZzIpKTsKCX0K ICAgICAgZWxzZQoJZW1pdF9zZXRfaW5zbiAocmVnMiwKCQkgICAgICAgcGx1c19jb25zdGFudCAo UG1vZGUsIHN0YWNrX3BvaW50ZXJfcnR4LCBhZGp1c3RtZW50KSk7CgogICAgICAvKiBTdGVwIDM6 IHRoZSBsb29wCgoJIGRvCgkgICB7CgkgICAgIFRFU1RfQUREUiA9IFRFU1RfQUREUiArIFBST0JF X0lOVEVSVkFMCgkgICAgIHByb2JlIGF0IFRFU1RfQUREUgoJICAgfQoJIHdoaWxlIChURVNUX0FE RFIgIT0gTEFTVF9BRERSKQoKCSBwcm9iZXMgYXQgRklSU1QgKyBOICogUFJPQkVfSU5URVJWQUwg Zm9yIHZhbHVlcyBvZiBOIGZyb20gMQoJIHVudGlsIGl0IGlzIGVxdWFsIHRvIFJPVU5ERURfU0la RS4gICovCgogICAgICBlbWl0X2luc24gKGdlbl9wcm9iZV9zdGFja19yYW5nZSAocmVnMSwgcmVn MSwgcmVnMikpOwoKCiAgICAgIC8qIFN0ZXAgNDogcHJvYmUgYXQgRklSU1QgKyBTSVpFIGlmIHdl IGNhbm5vdCBhc3NlcnQgYXQgY29tcGlsZS10aW1lCgkgdGhhdCBTSVpFIGlzIGVxdWFsIHRvIFJP VU5ERURfU0laRS4gICovCgogICAgICBpZiAoc2l6ZSAhPSByb3VuZGVkX3NpemUpCgl7CgkgIEhP U1RfV0lERV9JTlQgcmVtID0gc2l6ZSAtIHJvdW5kZWRfc2l6ZTsKCgkgIGlmIChyZW0gPiAyNTYp CgkgICAgewoJICAgICAgY29uc3QgSE9TVF9XSURFX0lOVCBiYXNlID0gUk9VTkRfVVAgKHJlbSwg QVJJVEhfRkFDVE9SKTsKCgkgICAgICBlbWl0X3NldF9pbnNuIChyZWcyLCBwbHVzX2NvbnN0YW50 IChQbW9kZSwgcmVnMiwgLWJhc2UpKTsKCSAgICAgIGVtaXRfc3RhY2tfcHJvYmUgKHBsdXNfY29u c3RhbnQgKFBtb2RlLCByZWcyLCBiYXNlIC0gcmVtKSk7CgkgICAgfQoJICBlbHNlCgkgICAgZW1p dF9zdGFja19wcm9iZSAocGx1c19jb25zdGFudCAoUG1vZGUsIHJlZzIsIC1yZW0pKTsKCX0KICAg IH0KCiAgLyogTWFrZSBzdXJlIG5vdGhpbmcgaXMgc2NoZWR1bGVkIGJlZm9yZSB3ZSBhcmUgZG9u ZS4gICovCiAgZW1pdF9pbnNuIChnZW5fYmxvY2thZ2UgKCkpOwp9CgovKiBQcm9iZSBhIHJhbmdl IG9mIHN0YWNrIGFkZHJlc3NlcyBmcm9tIFJFRzEgdG8gUkVHMiBpbmNsdXNpdmUuICBUaGVzZSBh cmUKICAgYWJzb2x1dGUgYWRkcmVzc2VzLiAgKi8KCmNvbnN0IGNoYXIgKgphYXJjaDY0X291dHB1 dF9wcm9iZV9zdGFja19yYW5nZSAocnR4IHJlZzEsIHJ0eCByZWcyKQp7CiAgc3RhdGljIGludCBs YWJlbG5vID0gMDsKICBjaGFyIGxvb3BfbGFiWzMyXTsKICBydHggeG9wc1syXTsKCiAgQVNNX0dF TkVSQVRFX0lOVEVSTkFMX0xBQkVMIChsb29wX2xhYiwgIkxQU1JMIiwgbGFiZWxubysrKTsKCiAg LyogTG9vcC4gICovCiAgQVNNX09VVFBVVF9JTlRFUk5BTF9MQUJFTCAoYXNtX291dF9maWxlLCBs b29wX2xhYik7CgogIEhPU1RfV0lERV9JTlQgc3RhY2tfY2xhc2hfcHJvYmVfaW50ZXJ2YWwKICAg ID0gMSA8PCBwYXJhbV9zdGFja19jbGFzaF9wcm90ZWN0aW9uX2d1YXJkX3NpemU7CgogIC8qIFRF U1RfQUREUiA9IFRFU1RfQUREUiArIFBST0JFX0lOVEVSVkFMLiAgKi8KICB4b3BzWzBdID0gcmVn MTsKICBIT1NUX1dJREVfSU5UIGludGVydmFsOwogIGlmIChmbGFnX3N0YWNrX2NsYXNoX3Byb3Rl Y3Rpb24pCiAgICBpbnRlcnZhbCA9IHN0YWNrX2NsYXNoX3Byb2JlX2ludGVydmFsOwogIGVsc2UK ICAgIGludGVydmFsID0gUFJPQkVfSU5URVJWQUw7CgogIGdjY19hc3NlcnQgKGFhcmNoNjRfdWlt bTEyX3NoaWZ0IChpbnRlcnZhbCkpOwogIHhvcHNbMV0gPSBHRU5fSU5UIChpbnRlcnZhbCk7Cgog IG91dHB1dF9hc21faW5zbiAoInN1Ylx0JTAsICUwLCAlMSIsIHhvcHMpOwoKICAvKiBJZiBkb2lu ZyBzdGFjayBjbGFzaCBwcm90ZWN0aW9uIHRoZW4gd2UgcHJvYmUgdXAgYnkgdGhlIEFCSSBzcGVj aWZpZWQKICAgICBhbW91bnQuICBXZSBkbyB0aGlzIGJlY2F1c2Ugd2UncmUgZHJvcHBpbmcgZnVs bCBwYWdlcyBhdCBhIHRpbWUgaW4gdGhlCiAgICAgbG9vcC4gIEJ1dCBpZiB3ZSdyZSBkb2luZyBu b24tc3RhY2sgY2xhc2ggcHJvYmluZywgcHJvYmUgYXQgU1AgMC4gICovCiAgaWYgKGZsYWdfc3Rh Y2tfY2xhc2hfcHJvdGVjdGlvbikKICAgIHhvcHNbMV0gPSBHRU5fSU5UIChTVEFDS19DTEFTSF9D QUxMRVJfR1VBUkQpOwogIGVsc2UKICAgIHhvcHNbMV0gPSBDT05TVDBfUlRYIChHRVRfTU9ERSAo eG9wc1sxXSkpOwoKICAvKiBQcm9iZSBhdCBURVNUX0FERFIuICBJZiB3ZSdyZSBpbnNpZGUgdGhl IGxvb3AgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcHJvYmUKICAgICBieSB0aGlzIGFtb3VudCBmb3Ig ZWFjaCBpdGVyYXRpb24uICAqLwogIG91dHB1dF9hc21faW5zbiAoInN0clx0eHpyLCBbJTAsICUx XSIsIHhvcHMpOwoKICAvKiBUZXN0IGlmIFRFU1RfQUREUiA9PSBMQVNUX0FERFIuICAqLwogIHhv cHNbMV0gPSByZWcyOwogIG91dHB1dF9hc21faW5zbiAoImNtcFx0JTAsICUxIiwgeG9wcyk7Cgog IC8qIEJyYW5jaC4gICovCiAgZnB1dHMgKCJcdGIubmVcdCIsIGFzbV9vdXRfZmlsZSk7CiAgYXNz ZW1ibGVfbmFtZV9yYXcgKGFzbV9vdXRfZmlsZSwgbG9vcF9sYWIpOwogIGZwdXRjICgnXG4nLCBh c21fb3V0X2ZpbGUpOwoKICByZXR1cm4gIiI7Cn0KCi8qIEVtaXQgdGhlIHByb2JlIGxvb3AgZm9y IGRvaW5nIHN0YWNrIGNsYXNoIHByb2JlcyBhbmQgc3RhY2sgYWRqdXN0bWVudHMgZm9yCiAgIFNW RS4gIFRoaXMgZW1pdHMgcHJvYmVzIGZyb20gQkFTRSB0byBCQVNFIC0gQURKVVNUTUVOVCBiYXNl ZCBvbiBhIGd1YXJkIHNpemUKICAgb2YgR1VBUkRfU0laRS4gIFdoZW4gYSBwcm9iZSBpcyBlbWl0 dGVkIGl0IGlzIGRvbmUgYXQgbW9zdAogICBNSU5fUFJPQkVfVEhSRVNIT0xEIGJ5dGVzIGZyb20g dGhlIGN1cnJlbnQgQkFTRSBhdCBhbiBpbnRlcnZhbCBvZgogICBhdCBtb3N0IE1JTl9QUk9CRV9U SFJFU0hPTEQuICBCeSB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24KICAgQkFTRSA9IEJBU0UgLSBB REpVU1RNRU5ULiAgKi8KCmNvbnN0IGNoYXIgKgphYXJjaDY0X291dHB1dF9wcm9iZV9zdmVfc3Rh Y2tfY2xhc2ggKHJ0eCBiYXNlLCBydHggYWRqdXN0bWVudCwKCQkJCSAgICAgIHJ0eCBtaW5fcHJv YmVfdGhyZXNob2xkLCBydHggZ3VhcmRfc2l6ZSkKewogIC8qIFRoaXMgZnVuY3Rpb24gaXMgbm90 IGFsbG93ZWQgdG8gdXNlIGFueSBpbnN0cnVjdGlvbiBnZW5lcmF0aW9uIGZ1bmN0aW9uCiAgICAg bGlrZSBnZW5fIGFuZCBmcmllbmRzLiAgSWYgeW91IGRvIHlvdSdsbCBsaWtlbHkgSUNFIGR1cmlu ZyBDRkcgdmFsaWRhdGlvbiwKICAgICBzbyBpbnN0ZWFkIGVtaXQgdGhlIGNvZGUgeW91IHdhbnQg dXNpbmcgb3V0cHV0X2FzbV9pbnNuLiAgKi8KICBnY2NfYXNzZXJ0IChmbGFnX3N0YWNrX2NsYXNo X3Byb3RlY3Rpb24pOwogIGdjY19hc3NlcnQgKENPTlNUX0lOVF9QIChtaW5fcHJvYmVfdGhyZXNo b2xkKSAmJiBDT05TVF9JTlRfUCAoZ3VhcmRfc2l6ZSkpOwogIGdjY19hc3NlcnQgKElOVFZBTCAo Z3VhcmRfc2l6ZSkgPiBJTlRWQUwgKG1pbl9wcm9iZV90aHJlc2hvbGQpKTsKCiAgLyogVGhlIG1p bmltdW0gcmVxdWlyZWQgYWxsb2NhdGlvbiBiZWZvcmUgdGhlIHJlc2lkdWFsIHJlcXVpcmVzIHBy b2JpbmcuICAqLwogIEhPU1RfV0lERV9JTlQgcmVzaWR1YWxfcHJvYmVfZ3VhcmQgPSBJTlRWQUwg KG1pbl9wcm9iZV90aHJlc2hvbGQpOwoKICAvKiBDbGFtcCB0aGUgdmFsdWUgZG93biB0byB0aGUg bmVhcmVzdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYSBjbXAuICAqLwogIHJlc2lkdWFs X3Byb2JlX2d1YXJkID0gYWFyY2g2NF9jbGFtcF90b191aW1tMTJfc2hpZnQgKHJlc2lkdWFsX3By b2JlX2d1YXJkKTsKICBydHggcHJvYmVfb2Zmc2V0X3ZhbHVlX3J0eCA9IGdlbl9pbnRfbW9kZSAo cmVzaWR1YWxfcHJvYmVfZ3VhcmQsIFBtb2RlKTsKCiAgZ2NjX2Fzc2VydCAoSU5UVkFMIChtaW5f cHJvYmVfdGhyZXNob2xkKSA+PSByZXNpZHVhbF9wcm9iZV9ndWFyZCk7CiAgZ2NjX2Fzc2VydCAo YWFyY2g2NF91aW1tMTJfc2hpZnQgKHJlc2lkdWFsX3Byb2JlX2d1YXJkKSk7CgogIHN0YXRpYyBp bnQgbGFiZWxubyA9IDA7CiAgY2hhciBsb29wX3N0YXJ0X2xhYlszMl07CiAgY2hhciBsb29wX2Vu ZF9sYWJbMzJdOwogIHJ0eCB4b3BzWzJdOwoKICBBU01fR0VORVJBVEVfSU5URVJOQUxfTEFCRUwg KGxvb3Bfc3RhcnRfbGFiLCAiU1ZMUFNQTCIsIGxhYmVsbm8pOwogIEFTTV9HRU5FUkFURV9JTlRF Uk5BTF9MQUJFTCAobG9vcF9lbmRfbGFiLCAiU1ZMUEVORCIsIGxhYmVsbm8rKyk7CgogIC8qIEVt aXQgbG9vcCBzdGFydCBsYWJlbC4gICovCiAgQVNNX09VVFBVVF9JTlRFUk5BTF9MQUJFTCAoYXNt X291dF9maWxlLCBsb29wX3N0YXJ0X2xhYik7CgogIC8qIEFESlVTVE1FTlQgPCBSRVNJRFVBTF9Q Uk9CRV9HVUFSRC4gICovCiAgeG9wc1swXSA9IGFkanVzdG1lbnQ7CiAgeG9wc1sxXSA9IHByb2Jl X29mZnNldF92YWx1ZV9ydHg7CiAgb3V0cHV0X2FzbV9pbnNuICgiY21wXHQlMCwgJTEiLCB4b3Bz KTsKCiAgLyogQnJhbmNoIHRvIGVuZCBpZiBub3QgZW5vdWdoIGFkanVzdG1lbnQgdG8gcHJvYmUu ICAqLwogIGZwdXRzICgiXHRiLmx0XHQiLCBhc21fb3V0X2ZpbGUpOwogIGFzc2VtYmxlX25hbWVf cmF3IChhc21fb3V0X2ZpbGUsIGxvb3BfZW5kX2xhYik7CiAgZnB1dGMgKCdcbicsIGFzbV9vdXRf ZmlsZSk7CgogIC8qIEJBU0UgPSBCQVNFIC0gUkVTSURVQUxfUFJPQkVfR1VBUkQuICAqLwogIHhv cHNbMF0gPSBiYXNlOwogIHhvcHNbMV0gPSBwcm9iZV9vZmZzZXRfdmFsdWVfcnR4OwogIG91dHB1 dF9hc21faW5zbiAoInN1Ylx0JTAsICUwLCAlMSIsIHhvcHMpOwoKICAvKiBQcm9iZSBhdCBCQVNF LiAgKi8KICB4b3BzWzFdID0gY29uc3QwX3J0eDsKICBvdXRwdXRfYXNtX2luc24gKCJzdHJcdHh6 ciwgWyUwLCAlMV0iLCB4b3BzKTsKCiAgLyogQURKVVNUTUVOVCA9IEFESlVTVE1FTlQgLSBSRVNJ RFVBTF9QUk9CRV9HVUFSRC4gICovCiAgeG9wc1swXSA9IGFkanVzdG1lbnQ7CiAgeG9wc1sxXSA9 IHByb2JlX29mZnNldF92YWx1ZV9ydHg7CiAgb3V0cHV0X2FzbV9pbnNuICgic3ViXHQlMCwgJTAs ICUxIiwgeG9wcyk7CgogIC8qIEJyYW5jaCB0byBzdGFydCBpZiBzdGlsbCBtb3JlIGJ5dGVzIHRv IGFsbG9jYXRlLiAgKi8KICBmcHV0cyAoIlx0Ylx0IiwgYXNtX291dF9maWxlKTsKICBhc3NlbWJs ZV9uYW1lX3JhdyAoYXNtX291dF9maWxlLCBsb29wX3N0YXJ0X2xhYik7CiAgZnB1dGMgKCdcbics IGFzbV9vdXRfZmlsZSk7CgogIC8qIE5vIHByb2JlIGxlYXZlLiAgKi8KICBBU01fT1VUUFVUX0lO VEVSTkFMX0xBQkVMIChhc21fb3V0X2ZpbGUsIGxvb3BfZW5kX2xhYik7CgogIC8qIEJBU0UgPSBC QVNFIC0gQURKVVNUTUVOVC4gICovCiAgeG9wc1swXSA9IGJhc2U7CiAgeG9wc1sxXSA9IGFkanVz dG1lbnQ7CiAgb3V0cHV0X2FzbV9pbnNuICgic3ViXHQlMCwgJTAsICUxIiwgeG9wcyk7CiAgcmV0 dXJuICIiOwp9CgovKiBEZXRlcm1pbmUgd2hldGhlciBhIGZyYW1lIGNoYWluIG5lZWRzIHRvIGJl IGdlbmVyYXRlZC4gICovCnN0YXRpYyBib29sCmFhcmNoNjRfbmVlZHNfZnJhbWVfY2hhaW4gKHZv aWQpCnsKICAvKiBGb3JjZSBhIGZyYW1lIGNoYWluIGZvciBFSCByZXR1cm5zIHNvIHRoZSByZXR1 cm4gYWRkcmVzcyBpcyBhdCBGUCs4LiAgKi8KICBpZiAoZnJhbWVfcG9pbnRlcl9uZWVkZWQgfHwg Y3J0bC0+Y2FsbHNfZWhfcmV0dXJuKQogICAgcmV0dXJuIHRydWU7CgogIC8qIEEgbGVhZiBmdW5j dGlvbiBjYW5ub3QgaGF2ZSBjYWxscyBvciB3cml0ZSBMUi4gICovCiAgYm9vbCBpc19sZWFmID0g Y3J0bC0+aXNfbGVhZiAmJiAhZGZfcmVnc19ldmVyX2xpdmVfcCAoTFJfUkVHTlVNKTsKCiAgLyog RG9uJ3QgdXNlIGEgZnJhbWUgY2hhaW4gaW4gbGVhZiBmdW5jdGlvbnMgaWYgbGVhZiBmcmFtZSBw b2ludGVycwogICAgIGFyZSBkaXNhYmxlZC4gICovCiAgaWYgKGZsYWdfb21pdF9sZWFmX2ZyYW1l X3BvaW50ZXIgJiYgaXNfbGVhZikKICAgIHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIGFhcmNoNjRf dXNlX2ZyYW1lX3BvaW50ZXI7Cn0KCi8qIE1hcmsgdGhlIHJlZ2lzdGVycyB0aGF0IG5lZWQgdG8g YmUgc2F2ZWQgYnkgdGhlIGNhbGxlZSBhbmQgY2FsY3VsYXRlCiAgIHRoZSBzaXplIG9mIHRoZSBj YWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIGFyZWEgYW5kIGZyYW1lIHJlY29yZCAoYm90aCBGUAogICBh bmQgTFIgbWF5IGJlIG9taXR0ZWQpLiAgKi8Kc3RhdGljIHZvaWQKYWFyY2g2NF9sYXlvdXRfZnJh bWUgKHZvaWQpCnsKICBwb2x5X2ludDY0IG9mZnNldCA9IDA7CiAgaW50IHJlZ25vLCBsYXN0X2Zw X3JlZyA9IElOVkFMSURfUkVHTlVNOwogIG1hY2hpbmVfbW9kZSB2ZWN0b3Jfc2F2ZV9tb2RlID0g YWFyY2g2NF9yZWdfc2F2ZV9tb2RlIChWOF9SRUdOVU0pOwogIHBvbHlfaW50NjQgdmVjdG9yX3Nh dmVfc2l6ZSA9IEdFVF9NT0RFX1NJWkUgKHZlY3Rvcl9zYXZlX21vZGUpOwogIGJvb2wgZnJhbWVf cmVsYXRlZF9mcF9yZWdfcCA9IGZhbHNlOwogIGFhcmNoNjRfZnJhbWUgJmZyYW1lID0gY2Z1bi0+ bWFjaGluZS0+ZnJhbWU7CgogIGZyYW1lLmVtaXRfZnJhbWVfY2hhaW4gPSBhYXJjaDY0X25lZWRz X2ZyYW1lX2NoYWluICgpOwoKICAvKiBBZGp1c3QgdGhlIG91dGdvaW5nIGFyZ3VtZW50cyBzaXpl IGlmIHJlcXVpcmVkLiAgS2VlcCBpdCBpbiBzeW5jIHdpdGggd2hhdAogICAgIHRoZSBtaWQtZW5k IGlzIGRvaW5nLiAgKi8KICBjcnRsLT5vdXRnb2luZ19hcmdzX3NpemUgPSBTVEFDS19EWU5BTUlD X09GRlNFVCAoY2Z1bik7CgojZGVmaW5lIFNMT1RfTk9UX1JFUVVJUkVEICgtMikKI2RlZmluZSBT TE9UX1JFUVVJUkVEICAgICAoLTEpCgogIGZyYW1lLndiX3B1c2hfY2FuZGlkYXRlMSA9IElOVkFM SURfUkVHTlVNOwogIGZyYW1lLndiX3B1c2hfY2FuZGlkYXRlMiA9IElOVkFMSURfUkVHTlVNOwog IGZyYW1lLnNwYXJlX3ByZWRfcmVnID0gSU5WQUxJRF9SRUdOVU07CgogIC8qIEZpcnN0IG1hcmsg YWxsIHRoZSByZWdpc3RlcnMgdGhhdCByZWFsbHkgbmVlZCB0byBiZSBzYXZlZC4uLiAgKi8KICBm b3IgKHJlZ25vID0gMDsgcmVnbm8gPD0gTEFTVF9TQVZFRF9SRUdOVU07IHJlZ25vKyspCiAgICBm cmFtZS5yZWdfb2Zmc2V0W3JlZ25vXSA9IFNMT1RfTk9UX1JFUVVJUkVEOwoKICAvKiAuLi4gdGhh dCBpbmNsdWRlcyB0aGUgZWggZGF0YSByZWdpc3RlcnMgKGlmIG5lZWRlZCkuLi4gICovCiAgaWYg KGNydGwtPmNhbGxzX2VoX3JldHVybikKICAgIGZvciAocmVnbm8gPSAwOyBFSF9SRVRVUk5fREFU QV9SRUdOTyAocmVnbm8pICE9IElOVkFMSURfUkVHTlVNOyByZWdubysrKQogICAgICBmcmFtZS5y ZWdfb2Zmc2V0W0VIX1JFVFVSTl9EQVRBX1JFR05PIChyZWdubyldID0gU0xPVF9SRVFVSVJFRDsK CiAgLyogLi4uIGFuZCBhbnkgY2FsbGVlIHNhdmVkIHJlZ2lzdGVyIHRoYXQgZGF0YWZsb3cgc2F5 cyBpcyBsaXZlLiAgKi8KICBmb3IgKHJlZ25vID0gUjBfUkVHTlVNOyByZWdubyA8PSBSMzBfUkVH TlVNOyByZWdubysrKQogICAgaWYgKGRmX3JlZ3NfZXZlcl9saXZlX3AgKHJlZ25vKQoJJiYgIWZp eGVkX3JlZ3NbcmVnbm9dCgkmJiAocmVnbm8gPT0gUjMwX1JFR05VTQoJICAgIHx8ICFjcnRsLT5h YmktPmNsb2JiZXJzX2Z1bGxfcmVnX3AgKHJlZ25vKSkpCiAgICAgIGZyYW1lLnJlZ19vZmZzZXRb cmVnbm9dID0gU0xPVF9SRVFVSVJFRDsKCiAgZm9yIChyZWdubyA9IFYwX1JFR05VTTsgcmVnbm8g PD0gVjMxX1JFR05VTTsgcmVnbm8rKykKICAgIGlmIChkZl9yZWdzX2V2ZXJfbGl2ZV9wIChyZWdu bykKCSYmICFmaXhlZF9yZWdzW3JlZ25vXQoJJiYgIWNydGwtPmFiaS0+Y2xvYmJlcnNfZnVsbF9y ZWdfcCAocmVnbm8pKQogICAgICB7CglmcmFtZS5yZWdfb2Zmc2V0W3JlZ25vXSA9IFNMT1RfUkVR VUlSRUQ7CglsYXN0X2ZwX3JlZyA9IHJlZ25vOwoJaWYgKGFhcmNoNjRfZW1pdF9jZmlfZm9yX3Jl Z19wIChyZWdubykpCgkgIGZyYW1lX3JlbGF0ZWRfZnBfcmVnX3AgPSB0cnVlOwogICAgICB9Cgog IC8qIEJpZy1lbmRpYW4gU1ZFIGZyYW1lcyBuZWVkIGEgc3BhcmUgcHJlZGljYXRlIHJlZ2lzdGVy IGluIG9yZGVyCiAgICAgdG8gc2F2ZSBaOC1aMTUuICBEZWNpZGUgd2hpY2ggcmVnaXN0ZXIgdGhl eSBzaG91bGQgdXNlLiAgUHJlZmVyCiAgICAgYW4gdW51c2VkIGFyZ3VtZW50IHJlZ2lzdGVyIGlm IHBvc3NpYmxlLCBzbyB0aGF0IHdlIGRvbid0IGZvcmNlIFA0CiAgICAgdG8gYmUgc2F2ZWQgdW5u ZWNlc3NhcmlseS4gICovCiAgaWYgKGZyYW1lX3JlbGF0ZWRfZnBfcmVnX3AKICAgICAgJiYgY3J0 bC0+YWJpLT5pZCAoKSA9PSBBUk1fUENTX1NWRQogICAgICAmJiBCWVRFU19CSUdfRU5ESUFOKQog ICAgewogICAgICBiaXRtYXAgbGl2ZTEgPSBkZl9nZXRfbGl2ZV9vdXQgKEVOVFJZX0JMT0NLX1BU Ul9GT1JfRk4gKGNmdW4pKTsKICAgICAgYml0bWFwIGxpdmUyID0gZGZfZ2V0X2xpdmVfaW4gKEVY SVRfQkxPQ0tfUFRSX0ZPUl9GTiAoY2Z1bikpOwogICAgICBmb3IgKHJlZ25vID0gUDBfUkVHTlVN OyByZWdubyA8PSBQN19SRUdOVU07IHJlZ25vKyspCglpZiAoIWJpdG1hcF9iaXRfcCAobGl2ZTEs IHJlZ25vKSAmJiAhYml0bWFwX2JpdF9wIChsaXZlMiwgcmVnbm8pKQoJICBicmVhazsKICAgICAg Z2NjX2Fzc2VydCAocmVnbm8gPD0gUDdfUkVHTlVNKTsKICAgICAgZnJhbWUuc3BhcmVfcHJlZF9y ZWcgPSByZWdubzsKICAgICAgZGZfc2V0X3JlZ3NfZXZlcl9saXZlIChyZWdubywgdHJ1ZSk7CiAg ICB9CgogIGZvciAocmVnbm8gPSBQMF9SRUdOVU07IHJlZ25vIDw9IFAxNV9SRUdOVU07IHJlZ25v KyspCiAgICBpZiAoZGZfcmVnc19ldmVyX2xpdmVfcCAocmVnbm8pCgkmJiAhZml4ZWRfcmVnc1ty ZWdub10KCSYmICFjcnRsLT5hYmktPmNsb2JiZXJzX2Z1bGxfcmVnX3AgKHJlZ25vKSkKICAgICAg ZnJhbWUucmVnX29mZnNldFtyZWdub10gPSBTTE9UX1JFUVVJUkVEOwoKICAvKiBXaXRoIHN0YWNr LWNsYXNoLCBMUiBtdXN0IGJlIHNhdmVkIGluIG5vbi1sZWFmIGZ1bmN0aW9ucy4gIFRoZSBzYXZp bmcgb2YKICAgICBMUiBjb3VudHMgYXMgYW4gaW1wbGljaXQgcHJvYmUgd2hpY2ggYWxsb3dzIHVz IHRvIG1haW50YWluIHRoZSBpbnZhcmlhbnQKICAgICBkZXNjcmliZWQgaW4gdGhlIGNvbW1lbnQg YXQgZXhwYW5kX3Byb2xvZ3VlLiAgKi8KICBnY2NfYXNzZXJ0IChjcnRsLT5pc19sZWFmCgkgICAg ICB8fCBtYXliZV9uZSAoZnJhbWUucmVnX29mZnNldFtSMzBfUkVHTlVNXSwgU0xPVF9OT1RfUkVR VUlSRUQpKTsKCiAgLyogTm93IGFzc2lnbiBzdGFjayBzbG90cyBmb3IgdGhlIHJlZ2lzdGVycy4g IFN0YXJ0IHdpdGggdGhlIHByZWRpY2F0ZQogICAgIHJlZ2lzdGVycywgc2luY2UgcHJlZGljYXRl IExEUiBhbmQgU1RSIGhhdmUgYSByZWxhdGl2ZWx5IHNtYWxsCiAgICAgb2Zmc2V0IHJhbmdlLiAg VGhlc2Ugc2F2ZXMgaGFwcGVuIGJlbG93IHRoZSBoYXJkIGZyYW1lIHBvaW50ZXIuICAqLwogIGZv ciAocmVnbm8gPSBQMF9SRUdOVU07IHJlZ25vIDw9IFAxNV9SRUdOVU07IHJlZ25vKyspCiAgICBp ZiAoa25vd25fZXEgKGZyYW1lLnJlZ19vZmZzZXRbcmVnbm9dLCBTTE9UX1JFUVVJUkVEKSkKICAg ICAgewoJZnJhbWUucmVnX29mZnNldFtyZWdub10gPSBvZmZzZXQ7CglvZmZzZXQgKz0gQllURVNf UEVSX1NWRV9QUkVEOwogICAgICB9CgogIGlmIChtYXliZV9uZSAob2Zmc2V0LCAwKSkKICAgIHsK ICAgICAgLyogSWYgd2UgaGF2ZSBhbnkgdmVjdG9yIHJlZ2lzdGVycyB0byBzYXZlIGFib3ZlIHRo ZSBwcmVkaWNhdGUgcmVnaXN0ZXJzLAoJIHRoZSBvZmZzZXQgb2YgdGhlIHZlY3RvciByZWdpc3Rl ciBzYXZlIHNsb3RzIG5lZWQgdG8gYmUgYSBtdWx0aXBsZQoJIG9mIHRoZSB2ZWN0b3Igc2l6ZS4g IFRoaXMgbGV0cyB1cyB1c2UgdGhlIGltbWVkaWF0ZSBmb3JtcyBvZiBMRFIvU1RSCgkgKG9yIExE MS9TVDEgZm9yIGJpZy1lbmRpYW4pLgoKCSBBIHZlY3RvciByZWdpc3RlciBpcyA4IHRpbWVzIHRo ZSBzaXplIG9mIGEgcHJlZGljYXRlIHJlZ2lzdGVyLAoJIGFuZCB3ZSBuZWVkIHRvIHNhdmUgYSBt YXhpbXVtIG9mIDEyIHByZWRpY2F0ZSByZWdpc3RlcnMsIHNvIHRoZQoJIGZpcnN0IHZlY3RvciBy ZWdpc3RlciB3aWxsIGJlIGF0IGVpdGhlciAjMSwgTVVMIFZMIG9yICMyLCBNVUwgVkwuCgoJIElm IHdlIGRvbid0IGhhdmUgYW55IHZlY3RvciByZWdpc3RlcnMgdG8gc2F2ZSwgYW5kIHdlIGtub3cg aG93CgkgYmlnIHRoZSBwcmVkaWNhdGUgc2F2ZSBhcmVhIGlzLCB3ZSBjYW4ganVzdCByb3VuZCBp dCB1cCB0byB0aGUKCSBuZXh0IDE2LWJ5dGUgYm91bmRhcnkuICAqLwogICAgICBpZiAobGFzdF9m cF9yZWcgPT0gKGludCkgSU5WQUxJRF9SRUdOVU0gJiYgb2Zmc2V0LmlzX2NvbnN0YW50ICgpKQoJ b2Zmc2V0ID0gYWxpZ25lZF91cHBlcl9ib3VuZCAob2Zmc2V0LCBTVEFDS19CT1VOREFSWSAvIEJJ VFNfUEVSX1VOSVQpOwogICAgICBlbHNlCgl7CgkgIGlmIChrbm93bl9sZSAob2Zmc2V0LCB2ZWN0 b3Jfc2F2ZV9zaXplKSkKCSAgICBvZmZzZXQgPSB2ZWN0b3Jfc2F2ZV9zaXplOwoJICBlbHNlIGlm IChrbm93bl9sZSAob2Zmc2V0LCB2ZWN0b3Jfc2F2ZV9zaXplICogMikpCgkgICAgb2Zmc2V0ID0g dmVjdG9yX3NhdmVfc2l6ZSAqIDI7CgkgIGVsc2UKCSAgICBnY2NfdW5yZWFjaGFibGUgKCk7Cgl9 CiAgICB9CgogIC8qIElmIHdlIG5lZWQgdG8gc2F2ZSBhbnkgU1ZFIHZlY3RvciByZWdpc3RlcnMs IGFkZCB0aGVtIG5leHQuICAqLwogIGlmIChsYXN0X2ZwX3JlZyAhPSAoaW50KSBJTlZBTElEX1JF R05VTSAmJiBjcnRsLT5hYmktPmlkICgpID09IEFSTV9QQ1NfU1ZFKQogICAgZm9yIChyZWdubyA9 IFYwX1JFR05VTTsgcmVnbm8gPD0gVjMxX1JFR05VTTsgcmVnbm8rKykKICAgICAgaWYgKGtub3du X2VxIChmcmFtZS5yZWdfb2Zmc2V0W3JlZ25vXSwgU0xPVF9SRVFVSVJFRCkpCgl7CgkgIGZyYW1l LnJlZ19vZmZzZXRbcmVnbm9dID0gb2Zmc2V0OwoJICBvZmZzZXQgKz0gdmVjdG9yX3NhdmVfc2l6 ZTsKCX0KCiAgLyogT0ZGU0VUIGlzIG5vdyB0aGUgb2Zmc2V0IG9mIHRoZSBoYXJkIGZyYW1lIHBv aW50ZXIgZnJvbSB0aGUgYm90dG9tCiAgICAgb2YgdGhlIGNhbGxlZSBzYXZlIGFyZWEuICAqLwog IGJvb2wgc2F2ZXNfYmVsb3dfaGFyZF9mcF9wID0gbWF5YmVfbmUgKG9mZnNldCwgMCk7CiAgZnJh bWUuYmVsb3dfaGFyZF9mcF9zYXZlZF9yZWdzX3NpemUgPSBvZmZzZXQ7CiAgaWYgKGZyYW1lLmVt aXRfZnJhbWVfY2hhaW4pCiAgICB7CiAgICAgIC8qIEZQIGFuZCBMUiBhcmUgcGxhY2VkIGluIHRo ZSBsaW5rYWdlIHJlY29yZC4gICovCiAgICAgIGZyYW1lLnJlZ19vZmZzZXRbUjI5X1JFR05VTV0g PSBvZmZzZXQ7CiAgICAgIGZyYW1lLndiX3B1c2hfY2FuZGlkYXRlMSA9IFIyOV9SRUdOVU07CiAg ICAgIGZyYW1lLnJlZ19vZmZzZXRbUjMwX1JFR05VTV0gPSBvZmZzZXQgKyBVTklUU19QRVJfV09S RDsKICAgICAgZnJhbWUud2JfcHVzaF9jYW5kaWRhdGUyID0gUjMwX1JFR05VTTsKICAgICAgb2Zm c2V0ICs9IDIgKiBVTklUU19QRVJfV09SRDsKICAgIH0KCiAgZm9yIChyZWdubyA9IFIwX1JFR05V TTsgcmVnbm8gPD0gUjMwX1JFR05VTTsgcmVnbm8rKykKICAgIGlmIChrbm93bl9lcSAoZnJhbWUu cmVnX29mZnNldFtyZWdub10sIFNMT1RfUkVRVUlSRUQpKQogICAgICB7CglmcmFtZS5yZWdfb2Zm c2V0W3JlZ25vXSA9IG9mZnNldDsKCWlmIChmcmFtZS53Yl9wdXNoX2NhbmRpZGF0ZTEgPT0gSU5W QUxJRF9SRUdOVU0pCgkgIGZyYW1lLndiX3B1c2hfY2FuZGlkYXRlMSA9IHJlZ25vOwoJZWxzZSBp ZiAoZnJhbWUud2JfcHVzaF9jYW5kaWRhdGUyID09IElOVkFMSURfUkVHTlVNKQoJICBmcmFtZS53 Yl9wdXNoX2NhbmRpZGF0ZTIgPSByZWdubzsKCW9mZnNldCArPSBVTklUU19QRVJfV09SRDsKICAg ICAgfQoKICBwb2x5X2ludDY0IG1heF9pbnRfb2Zmc2V0ID0gb2Zmc2V0OwogIG9mZnNldCA9IGFs aWduZWRfdXBwZXJfYm91bmQgKG9mZnNldCwgU1RBQ0tfQk9VTkRBUlkgLyBCSVRTX1BFUl9VTklU KTsKICBib29sIGhhc19hbGlnbl9nYXAgPSBtYXliZV9uZSAob2Zmc2V0LCBtYXhfaW50X29mZnNl dCk7CgogIGZvciAocmVnbm8gPSBWMF9SRUdOVU07IHJlZ25vIDw9IFYzMV9SRUdOVU07IHJlZ25v KyspCiAgICBpZiAoa25vd25fZXEgKGZyYW1lLnJlZ19vZmZzZXRbcmVnbm9dLCBTTE9UX1JFUVVJ UkVEKSkKICAgICAgewoJLyogSWYgdGhlcmUgaXMgYW4gYWxpZ25tZW50IGdhcCBiZXR3ZWVuIGlu dGVnZXIgYW5kIGZwIGNhbGxlZS1zYXZlcywKCSAgIGFsbG9jYXRlIHRoZSBsYXN0IGZwIHJlZ2lz dGVyIHRvIGl0IGlmIHBvc3NpYmxlLiAgKi8KCWlmIChyZWdubyA9PSBsYXN0X2ZwX3JlZwoJICAg ICYmIGhhc19hbGlnbl9nYXAKCSAgICAmJiBrbm93bl9lcSAodmVjdG9yX3NhdmVfc2l6ZSwgOCkK CSAgICAmJiBtdWx0aXBsZV9wIChvZmZzZXQsIDE2KSkKCSAgewoJICAgIGZyYW1lLnJlZ19vZmZz ZXRbcmVnbm9dID0gbWF4X2ludF9vZmZzZXQ7CgkgICAgYnJlYWs7CgkgIH0KCglmcmFtZS5yZWdf b2Zmc2V0W3JlZ25vXSA9IG9mZnNldDsKCWlmIChmcmFtZS53Yl9wdXNoX2NhbmRpZGF0ZTEgPT0g SU5WQUxJRF9SRUdOVU0pCgkgIGZyYW1lLndiX3B1c2hfY2FuZGlkYXRlMSA9IHJlZ25vOwoJZWxz ZSBpZiAoZnJhbWUud2JfcHVzaF9jYW5kaWRhdGUyID09IElOVkFMSURfUkVHTlVNCgkJICYmIGZy YW1lLndiX3B1c2hfY2FuZGlkYXRlMSA+PSBWMF9SRUdOVU0pCgkgIGZyYW1lLndiX3B1c2hfY2Fu ZGlkYXRlMiA9IHJlZ25vOwoJb2Zmc2V0ICs9IHZlY3Rvcl9zYXZlX3NpemU7CiAgICAgIH0KCiAg b2Zmc2V0ID0gYWxpZ25lZF91cHBlcl9ib3VuZCAob2Zmc2V0LCBTVEFDS19CT1VOREFSWSAvIEJJ VFNfUEVSX1VOSVQpOwoKICBmcmFtZS5zYXZlZF9yZWdzX3NpemUgPSBvZmZzZXQ7CgogIHBvbHlf aW50NjQgdmFyYXJnc19hbmRfc2F2ZWRfcmVnc19zaXplID0gb2Zmc2V0ICsgZnJhbWUuc2F2ZWRf dmFyYXJnc19zaXplOwoKICBwb2x5X2ludDY0IGFib3ZlX291dGdvaW5nX2FyZ3MKICAgID0gYWxp Z25lZF91cHBlcl9ib3VuZCAodmFyYXJnc19hbmRfc2F2ZWRfcmVnc19zaXplCgkJCSAgICsgZ2V0 X2ZyYW1lX3NpemUgKCksCgkJCSAgIFNUQUNLX0JPVU5EQVJZIC8gQklUU19QRVJfVU5JVCk7Cgog IGZyYW1lLmhhcmRfZnBfb2Zmc2V0CiAgICA9IGFib3ZlX291dGdvaW5nX2FyZ3MgLSBmcmFtZS5i ZWxvd19oYXJkX2ZwX3NhdmVkX3JlZ3Nfc2l6ZTsKCiAgLyogQm90aCB0aGVzZSB2YWx1ZXMgYXJl IGFscmVhZHkgYWxpZ25lZC4gICovCiAgZ2NjX2Fzc2VydCAobXVsdGlwbGVfcCAoY3J0bC0+b3V0 Z29pbmdfYXJnc19zaXplLAoJCQkgIFNUQUNLX0JPVU5EQVJZIC8gQklUU19QRVJfVU5JVCkpOwog IGZyYW1lLmZyYW1lX3NpemUgPSBhYm92ZV9vdXRnb2luZ19hcmdzICsgY3J0bC0+b3V0Z29pbmdf YXJnc19zaXplOwoKICBmcmFtZS5sb2NhbHNfb2Zmc2V0ID0gZnJhbWUuc2F2ZWRfdmFyYXJnc19z aXplOwoKICBmcmFtZS5pbml0aWFsX2FkanVzdCA9IDA7CiAgZnJhbWUuZmluYWxfYWRqdXN0ID0g MDsKICBmcmFtZS5jYWxsZWVfYWRqdXN0ID0gMDsKICBmcmFtZS5zdmVfY2FsbGVlX2FkanVzdCA9 IDA7CiAgZnJhbWUuY2FsbGVlX29mZnNldCA9IDA7CgogIGZyYW1lLndiX3BvcF9jYW5kaWRhdGUx ID0gZnJhbWUud2JfcHVzaF9jYW5kaWRhdGUxOwogIGZyYW1lLndiX3BvcF9jYW5kaWRhdGUyID0g ZnJhbWUud2JfcHVzaF9jYW5kaWRhdGUyOwoKICAvKiBTaGFkb3cgY2FsbCBzdGFjayBvbmx5IGRl YWxzIHdpdGggZnVuY3Rpb25zIHdoZXJlIHRoZSBMUiBpcyBwdXNoZWQKICAgICBvbnRvIHRoZSBz dGFjayBhbmQgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSAibm9fc2FuaXRpemUiIGF0dHJpYnV0ZQog ICAgIHdpdGggdGhlIGFyZ3VtZW50ICJzaGFkb3ctY2FsbC1zdGFjayIuICAqLwogIGZyYW1lLmlz X3Njc19lbmFibGVkCiAgICA9ICghY3J0bC0+Y2FsbHNfZWhfcmV0dXJuCiAgICAgICAmJiBzYW5p dGl6ZV9mbGFnc19wIChTQU5JVElaRV9TSEFET1dfQ0FMTF9TVEFDSykKICAgICAgICYmIGtub3du X2dlIChjZnVuLT5tYWNoaW5lLT5mcmFtZS5yZWdfb2Zmc2V0W0xSX1JFR05VTV0sIDApKTsKCiAg LyogV2hlbiBzaGFkb3cgY2FsbCBzdGFjayBpcyBlbmFibGVkLCB0aGUgc2NzX3BvcCBpbiB0aGUg ZXBpbG9ndWUgd2lsbAogICAgIHJlc3RvcmUgeDMwLCBhbmQgd2UgZG9uJ3QgbmVlZCB0byBwb3Ag eDMwIGFnYWluIGluIHRoZSB0cmFkaXRpb25hbAogICAgIHdheS4gIFBvcCBjYW5kaWRhdGVzIHJl Y29yZCB0aGUgcmVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSBwb3BwZWQKICAgICBldmVudHVhbGx5 LiAgKi8KICBpZiAoZnJhbWUuaXNfc2NzX2VuYWJsZWQpCiAgICB7CiAgICAgIGlmIChmcmFtZS53 Yl9wb3BfY2FuZGlkYXRlMiA9PSBSMzBfUkVHTlVNKQoJZnJhbWUud2JfcG9wX2NhbmRpZGF0ZTIg PSBJTlZBTElEX1JFR05VTTsKICAgICAgZWxzZSBpZiAoZnJhbWUud2JfcG9wX2NhbmRpZGF0ZTEg PT0gUjMwX1JFR05VTSkKCWZyYW1lLndiX3BvcF9jYW5kaWRhdGUxID0gSU5WQUxJRF9SRUdOVU07 CiAgICB9CgogIC8qIElmIGNhbmRpZGF0ZTIgaXMgSU5WQUxJRF9SRUdOVU0sIHdlIG5lZWQgdG8g YWRqdXN0IG1heF9wdXNoX29mZnNldCB0bwogICAgIDI1NiB0byBlbnN1cmUgdGhhdCB0aGUgb2Zm c2V0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgZW1pdF9tb3ZlX2luc24uCiAgICAgU2ltaWxh cmx5LCBpZiBjYW5kaWRhdGUxIGlzIElOVkFMSURfUkVHTlVNLCB3ZSBuZWVkIHRvIHNldAogICAg IG1heF9wdXNoX29mZnNldCB0byAwLCBiZWNhdXNlIG5vIHJlZ2lzdGVycyBhcmUgcG9wcGVkIGF0 IHRoaXMgdGltZSwKICAgICBzbyBjYWxsZWVfYWRqdXN0IGNhbm5vdCBiZSBhZGp1c3RlZC4gICov CiAgSE9TVF9XSURFX0lOVCBtYXhfcHVzaF9vZmZzZXQgPSAwOwogIGlmIChmcmFtZS53Yl9wb3Bf Y2FuZGlkYXRlMiAhPSBJTlZBTElEX1JFR05VTSkKICAgIG1heF9wdXNoX29mZnNldCA9IDUxMjsK ICBlbHNlIGlmIChmcmFtZS53Yl9wb3BfY2FuZGlkYXRlMSAhPSBJTlZBTElEX1JFR05VTSkKICAg IG1heF9wdXNoX29mZnNldCA9IDI1NjsKCiAgSE9TVF9XSURFX0lOVCBjb25zdF9zaXplLCBjb25z dF9vdXRnb2luZ19hcmdzX3NpemUsIGNvbnN0X2ZwX29mZnNldDsKICBIT1NUX1dJREVfSU5UIGNv bnN0X3NhdmVkX3JlZ3Nfc2l6ZTsKICBpZiAoZnJhbWUuZnJhbWVfc2l6ZS5pc19jb25zdGFudCAo JmNvbnN0X3NpemUpCiAgICAgICYmIGNvbnN0X3NpemUgPCBtYXhfcHVzaF9vZmZzZXQKICAgICAg JiYga25vd25fZXEgKGZyYW1lLmhhcmRfZnBfb2Zmc2V0LCBjb25zdF9zaXplKSkKICAgIHsKICAg ICAgLyogU2ltcGxlLCBzbWFsbCBmcmFtZSB3aXRoIG5vIG91dGdvaW5nIGFyZ3VtZW50czoKCgkg c3RwIHJlZzEsIHJlZzIsIFtzcCwgLWZyYW1lX3NpemVdIQoJIHN0cCByZWczLCByZWc0LCBbc3As IDE2XSAgKi8KICAgICAgZnJhbWUuY2FsbGVlX2FkanVzdCA9IGNvbnN0X3NpemU7CiAgICB9CiAg ZWxzZSBpZiAoY3J0bC0+b3V0Z29pbmdfYXJnc19zaXplLmlzX2NvbnN0YW50ICgmY29uc3Rfb3V0 Z29pbmdfYXJnc19zaXplKQoJICAgJiYgZnJhbWUuc2F2ZWRfcmVnc19zaXplLmlzX2NvbnN0YW50 ICgmY29uc3Rfc2F2ZWRfcmVnc19zaXplKQoJICAgJiYgY29uc3Rfb3V0Z29pbmdfYXJnc19zaXpl ICsgY29uc3Rfc2F2ZWRfcmVnc19zaXplIDwgNTEyCgkgICAvKiBXZSBjb3VsZCBoYW5kbGUgdGhp cyBjYXNlIGV2ZW4gd2l0aCBvdXRnb2luZyBhcmdzLCBwcm92aWRlZAoJICAgICAgdGhhdCB0aGUg bnVtYmVyIG9mIGFyZ3MgbGVmdCB1cyB3aXRoIHZhbGlkIG9mZnNldHMgZm9yIGFsbAoJICAgICAg cHJlZGljYXRlIGFuZCB2ZWN0b3Igc2F2ZSBzbG90cy4gIEl0J3Mgc3VjaCBhIHJhcmUgY2FzZSB0 aGF0CgkgICAgICBpdCBoYXJkbHkgc2VlbXMgd29ydGggdGhlIGVmZm9ydCB0aG91Z2guICAqLwoJ ICAgJiYgKCFzYXZlc19iZWxvd19oYXJkX2ZwX3AgfHwgY29uc3Rfb3V0Z29pbmdfYXJnc19zaXpl ID09IDApCgkgICAmJiAhKGNmdW4tPmNhbGxzX2FsbG9jYQoJCSYmIGZyYW1lLmhhcmRfZnBfb2Zm c2V0LmlzX2NvbnN0YW50ICgmY29uc3RfZnBfb2Zmc2V0KQoJCSYmIGNvbnN0X2ZwX29mZnNldCA8 IG1heF9wdXNoX29mZnNldCkpCiAgICB7CiAgICAgIC8qIEZyYW1lIHdpdGggc21hbGwgb3V0Z29p bmcgYXJndW1lbnRzOgoKCSBzdWIgc3AsIHNwLCBmcmFtZV9zaXplCgkgc3RwIHJlZzEsIHJlZzIs IFtzcCwgb3V0Z29pbmdfYXJnc19zaXplXQoJIHN0cCByZWczLCByZWc0LCBbc3AsIG91dGdvaW5n X2FyZ3Nfc2l6ZSArIDE2XSAgKi8KICAgICAgZnJhbWUuaW5pdGlhbF9hZGp1c3QgPSBmcmFtZS5m cmFtZV9zaXplOwogICAgICBmcmFtZS5jYWxsZWVfb2Zmc2V0ID0gY29uc3Rfb3V0Z29pbmdfYXJn c19zaXplOwogICAgfQogIGVsc2UgaWYgKHNhdmVzX2JlbG93X2hhcmRfZnBfcAoJICAgJiYga25v d25fZXEgKGZyYW1lLnNhdmVkX3JlZ3Nfc2l6ZSwKCQkJZnJhbWUuYmVsb3dfaGFyZF9mcF9zYXZl ZF9yZWdzX3NpemUpKQogICAgewogICAgICAvKiBGcmFtZSBpbiB3aGljaCBhbGwgc2F2ZXMgYXJl IFNWRSBzYXZlczoKCgkgc3ViIHNwLCBzcCwgaGFyZF9mcF9vZmZzZXQgKyBiZWxvd19oYXJkX2Zw X3NhdmVkX3JlZ3Nfc2l6ZQoJIHNhdmUgU1ZFIHJlZ2lzdGVycyByZWxhdGl2ZSB0byBTUAoJIHN1 YiBzcCwgc3AsIG91dGdvaW5nX2FyZ3Nfc2l6ZSAgKi8KICAgICAgZnJhbWUuaW5pdGlhbF9hZGp1 c3QgPSAoZnJhbWUuaGFyZF9mcF9vZmZzZXQKCQkJICAgICAgKyBmcmFtZS5iZWxvd19oYXJkX2Zw X3NhdmVkX3JlZ3Nfc2l6ZSk7CiAgICAgIGZyYW1lLmZpbmFsX2FkanVzdCA9IGNydGwtPm91dGdv aW5nX2FyZ3Nfc2l6ZTsKICAgIH0KICBlbHNlIGlmIChmcmFtZS5oYXJkX2ZwX29mZnNldC5pc19j b25zdGFudCAoJmNvbnN0X2ZwX29mZnNldCkKCSAgICYmIGNvbnN0X2ZwX29mZnNldCA8IG1heF9w dXNoX29mZnNldCkKICAgIHsKICAgICAgLyogRnJhbWUgd2l0aCBsYXJnZSBvdXRnb2luZyBhcmd1 bWVudHMgb3IgU1ZFIHNhdmVzLCBidXQgd2l0aAoJIGEgc21hbGwgbG9jYWwgYXJlYToKCgkgc3Rw IHJlZzEsIHJlZzIsIFtzcCwgLWhhcmRfZnBfb2Zmc2V0XSEKCSBzdHAgcmVnMywgcmVnNCwgW3Nw LCAxNl0KCSBbc3ViIHNwLCBzcCwgYmVsb3dfaGFyZF9mcF9zYXZlZF9yZWdzX3NpemVdCgkgW3Nh dmUgU1ZFIHJlZ2lzdGVycyByZWxhdGl2ZSB0byBTUF0KCSBzdWIgc3AsIHNwLCBvdXRnb2luZ19h cmdzX3NpemUgICovCiAgICAgIGZyYW1lLmNhbGxlZV9hZGp1c3QgPSBjb25zdF9mcF9vZmZzZXQ7 CiAgICAgIGZyYW1lLnN2ZV9jYWxsZWVfYWRqdXN0ID0gZnJhbWUuYmVsb3dfaGFyZF9mcF9zYXZl ZF9yZWdzX3NpemU7CiAgICAgIGZyYW1lLmZpbmFsX2FkanVzdCA9IGNydGwtPm91dGdvaW5nX2Fy Z3Nfc2l6ZTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIC8qIEZyYW1lIHdpdGggbGFyZ2UgbG9j YWwgYXJlYSBhbmQgb3V0Z29pbmcgYXJndW1lbnRzIG9yIFNWRSBzYXZlcywKCSB1c2luZyBmcmFt ZSBwb2ludGVyOgoKCSBzdWIgc3AsIHNwLCBoYXJkX2ZwX29mZnNldAoJIHN0cCB4MjksIHgzMCwg W3NwLCAwXQoJIGFkZCB4MjksIHNwLCAwCgkgc3RwIHJlZzMsIHJlZzQsIFtzcCwgMTZdCgkgW3N1 YiBzcCwgc3AsIGJlbG93X2hhcmRfZnBfc2F2ZWRfcmVnc19zaXplXQoJIFtzYXZlIFNWRSByZWdp c3RlcnMgcmVsYXRpdmUgdG8gU1BdCgkgc3ViIHNwLCBzcCwgb3V0Z29pbmdfYXJnc19zaXplICAq LwogICAgICBmcmFtZS5pbml0aWFsX2FkanVzdCA9IGZyYW1lLmhhcmRfZnBfb2Zmc2V0OwogICAg ICBmcmFtZS5zdmVfY2FsbGVlX2FkanVzdCA9IGZyYW1lLmJlbG93X2hhcmRfZnBfc2F2ZWRfcmVn c19zaXplOwogICAgICBmcmFtZS5maW5hbF9hZGp1c3QgPSBjcnRsLT5vdXRnb2luZ19hcmdzX3Np emU7CiAgICB9CgogIC8qIE1ha2Ugc3VyZSB0aGUgaW5kaXZpZHVhbCBhZGp1c3RtZW50cyBhZGQg dXAgdG8gdGhlIGZ1bGwgZnJhbWUgc2l6ZS4gICovCiAgZ2NjX2Fzc2VydCAoa25vd25fZXEgKGZy YW1lLmluaXRpYWxfYWRqdXN0CgkJCSsgZnJhbWUuY2FsbGVlX2FkanVzdAoJCQkrIGZyYW1lLnN2 ZV9jYWxsZWVfYWRqdXN0CgkJCSsgZnJhbWUuZmluYWxfYWRqdXN0LCBmcmFtZS5mcmFtZV9zaXpl KSk7CgogIGlmICghZnJhbWUuZW1pdF9mcmFtZV9jaGFpbiAmJiBmcmFtZS5jYWxsZWVfYWRqdXN0 ID09IDApCiAgICB7CiAgICAgIC8qIFdlJ3ZlIGRlY2lkZWQgbm90IHRvIGFzc29jaWF0ZSBhbnkg cmVnaXN0ZXIgc2F2ZXMgd2l0aCB0aGUgaW5pdGlhbAoJIHN0YWNrIGFsbG9jYXRpb24uICAqLwog ICAgICBmcmFtZS53Yl9wb3BfY2FuZGlkYXRlMSA9IGZyYW1lLndiX3B1c2hfY2FuZGlkYXRlMSA9 IElOVkFMSURfUkVHTlVNOwogICAgICBmcmFtZS53Yl9wb3BfY2FuZGlkYXRlMiA9IGZyYW1lLndi X3B1c2hfY2FuZGlkYXRlMiA9IElOVkFMSURfUkVHTlVNOwogICAgfQoKICBmcmFtZS5sYWlkX291 dCA9IHRydWU7Cn0KCi8qIFJldHVybiB0cnVlIGlmIHRoZSByZWdpc3RlciBSRUdOTyBpcyBzYXZl ZCBvbiBlbnRyeSB0bwogICB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCgpzdGF0aWMgYm9vbAph YXJjaDY0X3JlZ2lzdGVyX3NhdmVkX29uX2VudHJ5IChpbnQgcmVnbm8pCnsKICByZXR1cm4ga25v d25fZ2UgKGNmdW4tPm1hY2hpbmUtPmZyYW1lLnJlZ19vZmZzZXRbcmVnbm9dLCAwKTsKfQoKLyog UmV0dXJuIHRoZSBuZXh0IHJlZ2lzdGVyIHVwIGZyb20gUkVHTk8gdXAgdG8gTElNSVQgZm9yIHRo ZSBjYWxsZWUKICAgdG8gc2F2ZS4gICovCgpzdGF0aWMgdW5zaWduZWQKYWFyY2g2NF9uZXh0X2Nh bGxlZV9zYXZlICh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgbGltaXQpCnsKICB3aGlsZSAocmVn bm8gPD0gbGltaXQgJiYgIWFhcmNoNjRfcmVnaXN0ZXJfc2F2ZWRfb25fZW50cnkgKHJlZ25vKSkK ICAgIHJlZ25vICsrOwogIHJldHVybiByZWdubzsKfQoKLyogUHVzaCB0aGUgcmVnaXN0ZXIgbnVt YmVyIFJFR05PIG9mIG1vZGUgTU9ERSB0byB0aGUgc3RhY2sgd2l0aCB3cml0ZS1iYWNrCiAgIGFk anVzdGluZyB0aGUgc3RhY2sgYnkgQURKVVNUTUVOVC4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0 X3B1c2h3Yl9zaW5nbGVfcmVnIChtYWNoaW5lX21vZGUgbW9kZSwgdW5zaWduZWQgcmVnbm8sCgkJ CSAgIEhPU1RfV0lERV9JTlQgYWRqdXN0bWVudCkKIHsKICBydHggYmFzZV9ydHggPSBzdGFja19w b2ludGVyX3J0eDsKICBydHggaW5zbiwgcmVnLCBtZW07CgogIHJlZyA9IGdlbl9ydHhfUkVHICht b2RlLCByZWdubyk7CiAgbWVtID0gZ2VuX3J0eF9QUkVfTU9ESUZZIChQbW9kZSwgYmFzZV9ydHgs CgkJCSAgICBwbHVzX2NvbnN0YW50IChQbW9kZSwgYmFzZV9ydHgsIC1hZGp1c3RtZW50KSk7CiAg bWVtID0gZ2VuX2ZyYW1lX21lbSAobW9kZSwgbWVtKTsKCiAgaW5zbiA9IGVtaXRfbW92ZV9pbnNu IChtZW0sIHJlZyk7CiAgUlRYX0ZSQU1FX1JFTEFURURfUCAoaW5zbikgPSAxOwp9CgovKiBHZW5l cmF0ZSBhbmQgcmV0dXJuIGFuIGluc3RydWN0aW9uIHRvIHN0b3JlIHRoZSBwYWlyIG9mIHJlZ2lz dGVycwogICBSRUcgYW5kIFJFRzIgb2YgbW9kZSBNT0RFIHRvIGxvY2F0aW9uIEJBU0Ugd2l0aCB3 cml0ZS1iYWNrIGFkanVzdGluZwogICB0aGUgc3RhY2sgbG9jYXRpb24gQkFTRSBieSBBREpVU1RN RU5ULiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF9nZW5fc3RvcmV3Yl9wYWlyIChtYWNoaW5lX21v ZGUgbW9kZSwgcnR4IGJhc2UsIHJ0eCByZWcsIHJ0eCByZWcyLAoJCQkgIEhPU1RfV0lERV9JTlQg YWRqdXN0bWVudCkKewogIHN3aXRjaCAobW9kZSkKICAgIHsKICAgIGNhc2UgRV9ESW1vZGU6CiAg ICAgIHJldHVybiBnZW5fc3RvcmV3Yl9wYWlyZGlfZGkgKGJhc2UsIGJhc2UsIHJlZywgcmVnMiwK CQkJCSAgICBHRU5fSU5UICgtYWRqdXN0bWVudCksCgkJCQkgICAgR0VOX0lOVCAoVU5JVFNfUEVS X1dPUkQgLSBhZGp1c3RtZW50KSk7CiAgICBjYXNlIEVfREZtb2RlOgogICAgICByZXR1cm4gZ2Vu X3N0b3Jld2JfcGFpcmRmX2RpIChiYXNlLCBiYXNlLCByZWcsIHJlZzIsCgkJCQkgICAgR0VOX0lO VCAoLWFkanVzdG1lbnQpLAoJCQkJICAgIEdFTl9JTlQgKFVOSVRTX1BFUl9XT1JEIC0gYWRqdXN0 bWVudCkpOwogICAgY2FzZSBFX1RGbW9kZToKICAgICAgcmV0dXJuIGdlbl9zdG9yZXdiX3BhaXJ0 Zl9kaSAoYmFzZSwgYmFzZSwgcmVnLCByZWcyLAoJCQkJICAgIEdFTl9JTlQgKC1hZGp1c3RtZW50 KSwKCQkJCSAgICBHRU5fSU5UIChVTklUU19QRVJfVlJFRyAtIGFkanVzdG1lbnQpKTsKICAgIGRl ZmF1bHQ6CiAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsKICAgIH0KfQoKLyogUHVzaCByZWdpc3Rl cnMgbnVtYmVyZWQgUkVHTk8xIGFuZCBSRUdOTzIgdG8gdGhlIHN0YWNrLCBhZGp1c3RpbmcgdGhl CiAgIHN0YWNrIHBvaW50ZXIgYnkgQURKVVNUTUVOVC4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0 X3B1c2hfcmVncyAodW5zaWduZWQgcmVnbm8xLCB1bnNpZ25lZCByZWdubzIsIEhPU1RfV0lERV9J TlQgYWRqdXN0bWVudCkKewogIHJ0eF9pbnNuICppbnNuOwogIG1hY2hpbmVfbW9kZSBtb2RlID0g YWFyY2g2NF9yZWdfc2F2ZV9tb2RlIChyZWdubzEpOwoKICBpZiAocmVnbm8yID09IElOVkFMSURf UkVHTlVNKQogICAgcmV0dXJuIGFhcmNoNjRfcHVzaHdiX3NpbmdsZV9yZWcgKG1vZGUsIHJlZ25v MSwgYWRqdXN0bWVudCk7CgogIHJ0eCByZWcxID0gZ2VuX3J0eF9SRUcgKG1vZGUsIHJlZ25vMSk7 CiAgcnR4IHJlZzIgPSBnZW5fcnR4X1JFRyAobW9kZSwgcmVnbm8yKTsKCiAgaW5zbiA9IGVtaXRf aW5zbiAoYWFyY2g2NF9nZW5fc3RvcmV3Yl9wYWlyIChtb2RlLCBzdGFja19wb2ludGVyX3J0eCwg cmVnMSwKCQkJCQkgICAgICByZWcyLCBhZGp1c3RtZW50KSk7CiAgUlRYX0ZSQU1FX1JFTEFURURf UCAoWFZFQ0VYUCAoUEFUVEVSTiAoaW5zbiksIDAsIDIpKSA9IDE7CiAgUlRYX0ZSQU1FX1JFTEFU RURfUCAoWFZFQ0VYUCAoUEFUVEVSTiAoaW5zbiksIDAsIDEpKSA9IDE7CiAgUlRYX0ZSQU1FX1JF TEFURURfUCAoaW5zbikgPSAxOwp9CgovKiBMb2FkIHRoZSBwYWlyIG9mIHJlZ2lzdGVyIFJFRywg UkVHMiBvZiBtb2RlIE1PREUgZnJvbSBzdGFjayBsb2NhdGlvbiBCQVNFLAogICBhZGp1c3Rpbmcg aXQgYnkgQURKVVNUTUVOVCBhZnRlcndhcmRzLiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF9nZW5f bG9hZHdiX3BhaXIgKG1hY2hpbmVfbW9kZSBtb2RlLCBydHggYmFzZSwgcnR4IHJlZywgcnR4IHJl ZzIsCgkJCSBIT1NUX1dJREVfSU5UIGFkanVzdG1lbnQpCnsKICBzd2l0Y2ggKG1vZGUpCiAgICB7 CiAgICBjYXNlIEVfREltb2RlOgogICAgICByZXR1cm4gZ2VuX2xvYWR3Yl9wYWlyZGlfZGkgKGJh c2UsIGJhc2UsIHJlZywgcmVnMiwgR0VOX0lOVCAoYWRqdXN0bWVudCksCgkJCQkgICBHRU5fSU5U IChVTklUU19QRVJfV09SRCkpOwogICAgY2FzZSBFX0RGbW9kZToKICAgICAgcmV0dXJuIGdlbl9s b2Fkd2JfcGFpcmRmX2RpIChiYXNlLCBiYXNlLCByZWcsIHJlZzIsIEdFTl9JTlQgKGFkanVzdG1l bnQpLAoJCQkJICAgR0VOX0lOVCAoVU5JVFNfUEVSX1dPUkQpKTsKICAgIGNhc2UgRV9URm1vZGU6 CiAgICAgIHJldHVybiBnZW5fbG9hZHdiX3BhaXJ0Zl9kaSAoYmFzZSwgYmFzZSwgcmVnLCByZWcy LCBHRU5fSU5UIChhZGp1c3RtZW50KSwKCQkJCSAgIEdFTl9JTlQgKFVOSVRTX1BFUl9WUkVHKSk7 CiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CiAgICB9Cn0KCi8qIFBvcCB0 aGUgdHdvIHJlZ2lzdGVycyBudW1iZXJlZCBSRUdOTzEsIFJFR05PMiBmcm9tIHRoZSBzdGFjaywg YWRqdXN0aW5nIGl0CiAgIGFmdGVyd2FyZHMgYnkgQURKVVNUTUVOVCBhbmQgd3JpdGluZyB0aGUg YXBwcm9wcmlhdGUgUkVHX0NGQV9SRVNUT1JFIG5vdGVzCiAgIGludG8gQ0ZJX09QUy4gICovCgpz dGF0aWMgdm9pZAphYXJjaDY0X3BvcF9yZWdzICh1bnNpZ25lZCByZWdubzEsIHVuc2lnbmVkIHJl Z25vMiwgSE9TVF9XSURFX0lOVCBhZGp1c3RtZW50LAoJCSAgcnR4ICpjZmlfb3BzKQp7CiAgbWFj aGluZV9tb2RlIG1vZGUgPSBhYXJjaDY0X3JlZ19zYXZlX21vZGUgKHJlZ25vMSk7CiAgcnR4IHJl ZzEgPSBnZW5fcnR4X1JFRyAobW9kZSwgcmVnbm8xKTsKCiAgKmNmaV9vcHMgPSBhbGxvY19yZWdf bm90ZSAoUkVHX0NGQV9SRVNUT1JFLCByZWcxLCAqY2ZpX29wcyk7CgogIGlmIChyZWdubzIgPT0g SU5WQUxJRF9SRUdOVU0pCiAgICB7CiAgICAgIHJ0eCBtZW0gPSBwbHVzX2NvbnN0YW50IChQbW9k ZSwgc3RhY2tfcG9pbnRlcl9ydHgsIGFkanVzdG1lbnQpOwogICAgICBtZW0gPSBnZW5fcnR4X1BP U1RfTU9ESUZZIChQbW9kZSwgc3RhY2tfcG9pbnRlcl9ydHgsIG1lbSk7CiAgICAgIGVtaXRfbW92 ZV9pbnNuIChyZWcxLCBnZW5fZnJhbWVfbWVtIChtb2RlLCBtZW0pKTsKICAgIH0KICBlbHNlCiAg ICB7CiAgICAgIHJ0eCByZWcyID0gZ2VuX3J0eF9SRUcgKG1vZGUsIHJlZ25vMik7CiAgICAgICpj Zmlfb3BzID0gYWxsb2NfcmVnX25vdGUgKFJFR19DRkFfUkVTVE9SRSwgcmVnMiwgKmNmaV9vcHMp OwogICAgICBlbWl0X2luc24gKGFhcmNoNjRfZ2VuX2xvYWR3Yl9wYWlyIChtb2RlLCBzdGFja19w b2ludGVyX3J0eCwgcmVnMSwKCQkJCQkgIHJlZzIsIGFkanVzdG1lbnQpKTsKICAgIH0KfQoKLyog R2VuZXJhdGUgYW5kIHJldHVybiBhIHN0b3JlIHBhaXIgaW5zdHJ1Y3Rpb24gb2YgbW9kZSBNT0RF IHRvIHN0b3JlCiAgIHJlZ2lzdGVyIFJFRzEgdG8gTUVNMSBhbmQgcmVnaXN0ZXIgUkVHMiB0byBN RU0yLiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF9nZW5fc3RvcmVfcGFpciAobWFjaGluZV9tb2Rl IG1vZGUsIHJ0eCBtZW0xLCBydHggcmVnMSwgcnR4IG1lbTIsCgkJCXJ0eCByZWcyKQp7CiAgc3dp dGNoIChtb2RlKQogICAgewogICAgY2FzZSBFX0RJbW9kZToKICAgICAgcmV0dXJuIGdlbl9zdG9y ZV9wYWlyX2R3X2RpZGkgKG1lbTEsIHJlZzEsIG1lbTIsIHJlZzIpOwoKICAgIGNhc2UgRV9ERm1v ZGU6CiAgICAgIHJldHVybiBnZW5fc3RvcmVfcGFpcl9kd19kZmRmIChtZW0xLCByZWcxLCBtZW0y LCByZWcyKTsKCiAgICBjYXNlIEVfVEZtb2RlOgogICAgICByZXR1cm4gZ2VuX3N0b3JlX3BhaXJf ZHdfdGZ0ZiAobWVtMSwgcmVnMSwgbWVtMiwgcmVnMik7CgogICAgY2FzZSBFX1Y0U0ltb2RlOgog ICAgICByZXR1cm4gZ2VuX3ZlY19zdG9yZV9wYWlydjRzaXY0c2kgKG1lbTEsIHJlZzEsIG1lbTIs IHJlZzIpOwoKICAgIGNhc2UgRV9WMTZRSW1vZGU6CiAgICAgIHJldHVybiBnZW5fdmVjX3N0b3Jl X3BhaXJ2MTZxaXYxNnFpIChtZW0xLCByZWcxLCBtZW0yLCByZWcyKTsKCiAgICBkZWZhdWx0Ogog ICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CiAgICB9Cn0KCi8qIEdlbmVyYXRlIGFuZCByZWd1cm4g YSBsb2FkIHBhaXIgaXNudHJ1Y3Rpb24gb2YgbW9kZSBNT0RFIHRvIGxvYWQgcmVnaXN0ZXIKICAg UkVHMSBmcm9tIE1FTTEgYW5kIHJlZ2lzdGVyIFJFRzIgZnJvbSBNRU0yLiAgKi8KCnN0YXRpYyBy dHgKYWFyY2g2NF9nZW5fbG9hZF9wYWlyIChtYWNoaW5lX21vZGUgbW9kZSwgcnR4IHJlZzEsIHJ0 eCBtZW0xLCBydHggcmVnMiwKCQkgICAgICAgcnR4IG1lbTIpCnsKICBzd2l0Y2ggKG1vZGUpCiAg ICB7CiAgICBjYXNlIEVfREltb2RlOgogICAgICByZXR1cm4gZ2VuX2xvYWRfcGFpcl9kd19kaWRp IChyZWcxLCBtZW0xLCByZWcyLCBtZW0yKTsKCiAgICBjYXNlIEVfREZtb2RlOgogICAgICByZXR1 cm4gZ2VuX2xvYWRfcGFpcl9kd19kZmRmIChyZWcxLCBtZW0xLCByZWcyLCBtZW0yKTsKCiAgICBj YXNlIEVfVEZtb2RlOgogICAgICByZXR1cm4gZ2VuX2xvYWRfcGFpcl9kd190ZnRmIChyZWcxLCBt ZW0xLCByZWcyLCBtZW0yKTsKCiAgICBjYXNlIEVfVjRTSW1vZGU6CiAgICAgIHJldHVybiBnZW5f bG9hZF9wYWlydjRzaXY0c2kgKHJlZzEsIG1lbTEsIHJlZzIsIG1lbTIpOwoKICAgIGRlZmF1bHQ6 CiAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsKICAgIH0KfQoKLyogUmV0dXJuIFRSVUUgaWYgcmV0 dXJuIGFkZHJlc3Mgc2lnbmluZyBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQKICAg ZnVuY3Rpb24sIG90aGVyd2lzZSByZXR1cm4gRkFMU0UuICAqLwoKYm9vbAphYXJjaDY0X3JldHVy bl9hZGRyZXNzX3NpZ25pbmdfZW5hYmxlZCAodm9pZCkKewogIC8qIFRoaXMgZnVuY3Rpb24gc2hv dWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGZyYW1lIGxhaWQgb3V0LiAgICovCiAgZ2NjX2Fzc2Vy dCAoY2Z1bi0+bWFjaGluZS0+ZnJhbWUubGFpZF9vdXQpOwoKICAvKiBUdXJuIHJldHVybiBhZGRy ZXNzIHNpZ25pbmcgb2ZmIGluIGFueSBmdW5jdGlvbiB0aGF0IHVzZXMKICAgICBfX2J1aWx0aW5f ZWhfcmV0dXJuLiAgVGhlIGFkZHJlc3MgcGFzc2VkIHRvIF9fYnVpbHRpbl9laF9yZXR1cm4KICAg ICBpcyBub3Qgc2lnbmVkIHNvIGVpdGhlciBpdCBoYXMgdG8gYmUgc2lnbmVkICh3aXRoIG9yaWdp bmFsIHNwKQogICAgIG9yIHRoZSBjb2RlIHBhdGggdGhhdCB1c2VzIGl0IGhhcyB0byBhdm9pZCBh dXRoZW50aWNhdGluZyBpdC4KICAgICBDdXJyZW50bHkgZWggcmV0dXJuIGludHJvZHVjZXMgYSBy ZXR1cm4gdG8gYW55d2hlcmUgZ2FkZ2V0LCBubwogICAgIG1hdHRlciB3aGF0IHdlIGRvIGhlcmUg c2luY2UgaXQgdXNlcyByZXQgd2l0aCB1c2VyIHByb3ZpZGVkCiAgICAgYWRkcmVzcy4gQW4gaWRl YWwgZml4IGZvciB0aGF0IGlzIHRvIHVzZSBpbmRpcmVjdCBicmFuY2ggd2hpY2gKICAgICBjYW4g YmUgcHJvdGVjdGVkIHdpdGggQlRJIGogKHRvIHNvbWUgZXh0ZW50KS4gICovCiAgaWYgKGNydGwt PmNhbGxzX2VoX3JldHVybikKICAgIHJldHVybiBmYWxzZTsKCiAgLyogSWYgc2lnbmluZyBzY29w ZSBpcyBBQVJDSF9GVU5DVElPTl9OT05fTEVBRiwgd2Ugb25seSBzaWduIGEgbGVhZiBmdW5jdGlv bgogICAgIGlmIGl0cyBMUiBpcyBwdXNoZWQgb250byBzdGFjay4gICovCiAgcmV0dXJuIChhYXJj aF9yYV9zaWduX3Njb3BlID09IEFBUkNIX0ZVTkNUSU9OX0FMTAoJICB8fCAoYWFyY2hfcmFfc2ln bl9zY29wZSA9PSBBQVJDSF9GVU5DVElPTl9OT05fTEVBRgoJICAgICAgJiYga25vd25fZ2UgKGNm dW4tPm1hY2hpbmUtPmZyYW1lLnJlZ19vZmZzZXRbTFJfUkVHTlVNXSwgMCkpKTsKfQoKLyogT25s eSB1c2VkIGJ5IHRoZSBhcm0gYmFja2VuZC4gICovCnZvaWQgYWFyY2hfYnRpX2FyY2hfY2hlY2sg KHZvaWQpCnt9CgovKiBSZXR1cm4gVFJVRSBpZiBCcmFuY2ggVGFyZ2V0IElkZW50aWZpY2F0aW9u IE1lY2hhbmlzbSBpcyBlbmFibGVkLiAgKi8KYm9vbAphYXJjaF9idGlfZW5hYmxlZCAodm9pZCkK ewogIHJldHVybiAoYWFyY2hfZW5hYmxlX2J0aSA9PSAxKTsKfQoKLyogQ2hlY2sgaWYgSU5TTiBp cyBhIEJUSSBKIGluc24uICAqLwpib29sCmFhcmNoX2J0aV9qX2luc25fcCAocnR4X2luc24gKmlu c24pCnsKICBpZiAoIWluc24gfHwgIUlOU05fUCAoaW5zbikpCiAgICByZXR1cm4gZmFsc2U7Cgog IHJ0eCBwYXQgPSBQQVRURVJOIChpbnNuKTsKICByZXR1cm4gR0VUX0NPREUgKHBhdCkgPT0gVU5T UEVDX1ZPTEFUSUxFICYmIFhJTlQgKHBhdCwgMSkgPT0gVU5TUEVDVl9CVElfSjsKfQoKLyogQ2hl Y2sgaWYgWCAob3IgYW55IHN1Yi1ydHggb2YgWCkgaXMgYSBQQUNJQVNQL1BBQ0lCU1AgaW5zdHJ1 Y3Rpb24uICAqLwpib29sCmFhcmNoX3BhY19pbnNuX3AgKHJ0eCB4KQp7CiAgaWYgKCFJTlNOX1Ag KHgpKQogICAgcmV0dXJuIGZhbHNlOwoKICBzdWJydHhfdmFyX2l0ZXJhdG9yOjphcnJheV90eXBl IGFycmF5OwogIEZPUl9FQUNIX1NVQlJUWF9WQVIgKGl0ZXIsIGFycmF5LCBQQVRURVJOICh4KSwg QUxMKQogICAgewogICAgICBydHggc3ViID0gKml0ZXI7CiAgICAgIGlmIChzdWIgJiYgR0VUX0NP REUgKHN1YikgPT0gVU5TUEVDKQoJewoJICBpbnQgdW5zcGVjX3ZhbCA9IFhJTlQgKHN1YiwgMSk7 CgkgIHN3aXRjaCAodW5zcGVjX3ZhbCkKCSAgICB7CgkgICAgY2FzZSBVTlNQRUNfUEFDSUFTUDoK ICAgICAgICAgICAgY2FzZSBVTlNQRUNfUEFDSUJTUDoKCSAgICAgIHJldHVybiB0cnVlOwoKCSAg ICBkZWZhdWx0OgoJICAgICAgcmV0dXJuIGZhbHNlOwoJICAgIH0KCSAgaXRlci5za2lwX3N1YnJ0 eGVzICgpOwoJfQogICAgfQogIHJldHVybiBmYWxzZTsKfQoKcnR4IGFhcmNoX2dlbl9idGlfYyAo dm9pZCkKewogIHJldHVybiBnZW5fYnRpX2MgKCk7Cn0KCnJ0eCBhYXJjaF9nZW5fYnRpX2ogKHZv aWQpCnsKICByZXR1cm4gZ2VuX2J0aV9qICgpOwp9CgovKiBUaGUgY2FsbGVyIGlzIGdvaW5nIHRv IHVzZSBTVDFEIG9yIExEMUQgdG8gc2F2ZSBvciByZXN0b3JlIGFuIFNWRQogICByZWdpc3RlciBp biBtb2RlIE1PREUgYXQgQkFTRV9SVFggKyBPRkZTRVQsIHdoZXJlIE9GRlNFVCBpcyBpbgogICB0 aGUgcmFuZ2UgWzEsIDE2XSAqIEdFVF9NT0RFX1NJWkUgKE1PREUpLiAgUHJlcGFyZSBmb3IgdGhp cyBieToKCiAgICAgKDEpIHVwZGF0aW5nIEJBU0VfUlRYICsgT0ZGU0VUIHNvIHRoYXQgaXQgaXMg YSBsZWdpdGltYXRlIFNUMUQKCSBvciBMRDFEIGFkZHJlc3MKCiAgICAgKDIpIHNldHRpbmcgUFJF RCB0byBhIHZhbGlkIHByZWRpY2F0ZSByZWdpc3RlciBmb3IgdGhlIFNUMUQgb3IgTEQxRCwKCSBp ZiB0aGUgdmFyaWFibGUgaXNuJ3QgYWxyZWFkeSBub25udWxsCgogICAoMSkgaXMgbmVlZGVkIHdo ZW4gT0ZGU0VUIGlzIGluIHRoZSByYW5nZSBbOCwgMTZdICogR0VUX01PREVfU0laRSAoTU9ERSku CiAgIEhhbmRsZSB0aGlzIGNhc2UgdXNpbmcgYSB0ZW1wb3JhcnkgYmFzZSByZWdpc3RlciB0aGF0 IGlzIHN1aXRhYmxlIGZvcgogICBhbGwgb2Zmc2V0cyBpbiB0aGF0IHJhbmdlLiAgVXNlIEFOQ0hP Ul9SRUcgYXMgdGhpcyBiYXNlIHJlZ2lzdGVyIGlmIGl0CiAgIGlzIG5vbm51bGwsIG90aGVyd2lz ZSBjcmVhdGUgYSBuZXcgcmVnaXN0ZXIgYW5kIHN0b3JlIGl0IGluIEFOQ0hPUl9SRUcuICAqLwoK c3RhdGljIGlubGluZSB2b2lkCmFhcmNoNjRfYWRqdXN0X3N2ZV9jYWxsZWVfc2F2ZV9iYXNlICht YWNoaW5lX21vZGUgbW9kZSwgcnR4ICZiYXNlX3J0eCwKCQkJCSAgICAgcnR4ICZhbmNob3JfcmVn LCBwb2x5X2ludDY0ICZvZmZzZXQsCgkJCQkgICAgIHJ0eCAmcHRydWUpCnsKICBpZiAobWF5YmVf Z2UgKG9mZnNldCwgOCAqIEdFVF9NT0RFX1NJWkUgKG1vZGUpKSkKICAgIHsKICAgICAgLyogVGhp cyBpcyB0aGUgbWF4aW11bSB2YWxpZCBvZmZzZXQgb2YgdGhlIGFuY2hvciBmcm9tIHRoZSBiYXNl LgoJIExvd2VyIHZhbHVlcyB3b3VsZCBiZSB2YWxpZCB0b28uICAqLwogICAgICBwb2x5X2ludDY0 IGFuY2hvcl9vZmZzZXQgPSAxNiAqIEdFVF9NT0RFX1NJWkUgKG1vZGUpOwogICAgICBpZiAoIWFu Y2hvcl9yZWcpCgl7CgkgIGFuY2hvcl9yZWcgPSBnZW5fcnR4X1JFRyAoUG1vZGUsIFNUQUNLX0NM QVNIX1NWRV9DRkFfUkVHTlVNKTsKCSAgZW1pdF9pbnNuIChnZW5fYWRkM19pbnNuIChhbmNob3Jf cmVnLCBiYXNlX3J0eCwKCQkJCSAgICBnZW5faW50X21vZGUgKGFuY2hvcl9vZmZzZXQsIFBtb2Rl KSkpOwoJfQogICAgICBiYXNlX3J0eCA9IGFuY2hvcl9yZWc7CiAgICAgIG9mZnNldCAtPSBhbmNo b3Jfb2Zmc2V0OwogICAgfQogIGlmICghcHRydWUpCiAgICB7CiAgICAgIGludCBwcmVkX3JlZyA9 IGNmdW4tPm1hY2hpbmUtPmZyYW1lLnNwYXJlX3ByZWRfcmVnOwogICAgICBlbWl0X21vdmVfaW5z biAoZ2VuX3J0eF9SRUcgKFZOeDE2Qkltb2RlLCBwcmVkX3JlZyksCgkJICAgICAgQ09OU1RNMV9S VFggKFZOeDE2Qkltb2RlKSk7CiAgICAgIHB0cnVlID0gZ2VuX3J0eF9SRUcgKFZOeDJCSW1vZGUs IHByZWRfcmVnKTsKICAgIH0KfQoKLyogQWRkIGEgUkVHX0NGQV9FWFBSRVNTSU9OIG5vdGUgdG8g SU5TTiB0byBzYXkgdGhhdCByZWdpc3RlciBSRUcKICAgaXMgc2F2ZWQgYXQgQkFTRSArIE9GRlNF VC4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X2FkZF9jZmFfZXhwcmVzc2lvbiAocnR4X2luc24g Kmluc24sIHJ0eCByZWcsCgkJCSAgICBydHggYmFzZSwgcG9seV9pbnQ2NCBvZmZzZXQpCnsKICBy dHggbWVtID0gZ2VuX2ZyYW1lX21lbSAoR0VUX01PREUgKHJlZyksCgkJCSAgIHBsdXNfY29uc3Rh bnQgKFBtb2RlLCBiYXNlLCBvZmZzZXQpKTsKICBhZGRfcmVnX25vdGUgKGluc24sIFJFR19DRkFf RVhQUkVTU0lPTiwgZ2VuX3J0eF9TRVQgKG1lbSwgcmVnKSk7Cn0KCi8qIEVtaXQgY29kZSB0byBz YXZlIHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIGZyb20gcmVnaXN0ZXIgbnVtYmVyIFNUQVJU CiAgIHRvIExJTUlUIHRvIHRoZSBzdGFjayBhdCB0aGUgbG9jYXRpb24gc3RhcnRpbmcgYXQgb2Zm c2V0IFNUQVJUX09GRlNFVCwKICAgc2tpcHBpbmcgYW55IHdyaXRlLWJhY2sgY2FuZGlkYXRlcyBp ZiBTS0lQX1dCIGlzIHRydWUuICBIQVJEX0ZQX1ZBTElEX1AKICAgaXMgdHJ1ZSBpZiB0aGUgaGFy ZCBmcmFtZSBwb2ludGVyIGhhcyBiZWVuIHNldCB1cC4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0 X3NhdmVfY2FsbGVlX3NhdmVzIChwb2x5X2ludDY0IHN0YXJ0X29mZnNldCwKCQkJICAgdW5zaWdu ZWQgc3RhcnQsIHVuc2lnbmVkIGxpbWl0LCBib29sIHNraXBfd2IsCgkJCSAgIGJvb2wgaGFyZF9m cF92YWxpZF9wKQp7CiAgcnR4X2luc24gKmluc247CiAgdW5zaWduZWQgcmVnbm87CiAgdW5zaWdu ZWQgcmVnbm8yOwogIHJ0eCBhbmNob3JfcmVnID0gTlVMTF9SVFgsIHB0cnVlID0gTlVMTF9SVFg7 CgogIGZvciAocmVnbm8gPSBhYXJjaDY0X25leHRfY2FsbGVlX3NhdmUgKHN0YXJ0LCBsaW1pdCk7 CiAgICAgICByZWdubyA8PSBsaW1pdDsKICAgICAgIHJlZ25vID0gYWFyY2g2NF9uZXh0X2NhbGxl ZV9zYXZlIChyZWdubyArIDEsIGxpbWl0KSkKICAgIHsKICAgICAgcnR4IHJlZywgbWVtOwogICAg ICBwb2x5X2ludDY0IG9mZnNldDsKICAgICAgYm9vbCBmcmFtZV9yZWxhdGVkX3AgPSBhYXJjaDY0 X2VtaXRfY2ZpX2Zvcl9yZWdfcCAocmVnbm8pOwoKICAgICAgaWYgKHNraXBfd2IKCSAgJiYgKHJl Z25vID09IGNmdW4tPm1hY2hpbmUtPmZyYW1lLndiX3B1c2hfY2FuZGlkYXRlMQoJICAgICAgfHwg cmVnbm8gPT0gY2Z1bi0+bWFjaGluZS0+ZnJhbWUud2JfcHVzaF9jYW5kaWRhdGUyKSkKCWNvbnRp bnVlOwoKICAgICAgaWYgKGNmdW4tPm1hY2hpbmUtPnJlZ19pc193cmFwcGVkX3NlcGFyYXRlbHlb cmVnbm9dKQoJY29udGludWU7CgogICAgICBtYWNoaW5lX21vZGUgbW9kZSA9IGFhcmNoNjRfcmVn X3NhdmVfbW9kZSAocmVnbm8pOwogICAgICByZWcgPSBnZW5fcnR4X1JFRyAobW9kZSwgcmVnbm8p OwogICAgICBvZmZzZXQgPSBzdGFydF9vZmZzZXQgKyBjZnVuLT5tYWNoaW5lLT5mcmFtZS5yZWdf b2Zmc2V0W3JlZ25vXTsKICAgICAgcnR4IGJhc2VfcnR4ID0gc3RhY2tfcG9pbnRlcl9ydHg7CiAg ICAgIHBvbHlfaW50NjQgc3Bfb2Zmc2V0ID0gb2Zmc2V0OwoKICAgICAgSE9TVF9XSURFX0lOVCBj b25zdF9vZmZzZXQ7CiAgICAgIGlmIChtb2RlID09IFZOeDJESW1vZGUgJiYgQllURVNfQklHX0VO RElBTikKCWFhcmNoNjRfYWRqdXN0X3N2ZV9jYWxsZWVfc2F2ZV9iYXNlIChtb2RlLCBiYXNlX3J0 eCwgYW5jaG9yX3JlZywKCQkJCQkgICAgIG9mZnNldCwgcHRydWUpOwogICAgICBlbHNlIGlmIChH UF9SRUdOVU1fUCAocmVnbm8pCgkgICAgICAgJiYgKCFvZmZzZXQuaXNfY29uc3RhbnQgKCZjb25z dF9vZmZzZXQpIHx8IGNvbnN0X29mZnNldCA+PSA1MTIpKQoJewoJICBnY2NfYXNzZXJ0IChrbm93 bl9lcSAoc3RhcnRfb2Zmc2V0LCAwKSk7CgkgIHBvbHlfaW50NjQgZnBfb2Zmc2V0CgkgICAgPSBj ZnVuLT5tYWNoaW5lLT5mcmFtZS5iZWxvd19oYXJkX2ZwX3NhdmVkX3JlZ3Nfc2l6ZTsKCSAgaWYg KGhhcmRfZnBfdmFsaWRfcCkKCSAgICBiYXNlX3J0eCA9IGhhcmRfZnJhbWVfcG9pbnRlcl9ydHg7 CgkgIGVsc2UKCSAgICB7CgkgICAgICBpZiAoIWFuY2hvcl9yZWcpCgkJewoJCSAgYW5jaG9yX3Jl ZyA9IGdlbl9ydHhfUkVHIChQbW9kZSwgU1RBQ0tfQ0xBU0hfU1ZFX0NGQV9SRUdOVU0pOwoJCSAg ZW1pdF9pbnNuIChnZW5fYWRkM19pbnNuIChhbmNob3JfcmVnLCBiYXNlX3J0eCwKCQkJCQkgICAg Z2VuX2ludF9tb2RlIChmcF9vZmZzZXQsIFBtb2RlKSkpOwoJCX0KCSAgICAgIGJhc2VfcnR4ID0g YW5jaG9yX3JlZzsKCSAgICB9CgkgIG9mZnNldCAtPSBmcF9vZmZzZXQ7Cgl9CiAgICAgIG1lbSA9 IGdlbl9mcmFtZV9tZW0gKG1vZGUsIHBsdXNfY29uc3RhbnQgKFBtb2RlLCBiYXNlX3J0eCwgb2Zm c2V0KSk7CiAgICAgIGJvb2wgbmVlZF9jZmFfbm90ZV9wID0gKGJhc2VfcnR4ICE9IHN0YWNrX3Bv aW50ZXJfcnR4KTsKCiAgICAgIGlmICghYWFyY2g2NF9zdmVfbW9kZV9wIChtb2RlKQoJICAmJiAo cmVnbm8yID0gYWFyY2g2NF9uZXh0X2NhbGxlZV9zYXZlIChyZWdubyArIDEsIGxpbWl0KSkgPD0g bGltaXQKCSAgJiYgIWNmdW4tPm1hY2hpbmUtPnJlZ19pc193cmFwcGVkX3NlcGFyYXRlbHlbcmVn bm8yXQoJICAmJiBrbm93bl9lcSAoR0VUX01PREVfU0laRSAobW9kZSksCgkJICAgICAgIGNmdW4t Pm1hY2hpbmUtPmZyYW1lLnJlZ19vZmZzZXRbcmVnbm8yXQoJCSAgICAgICAtIGNmdW4tPm1hY2hp bmUtPmZyYW1lLnJlZ19vZmZzZXRbcmVnbm9dKSkKCXsKCSAgcnR4IHJlZzIgPSBnZW5fcnR4X1JF RyAobW9kZSwgcmVnbm8yKTsKCSAgcnR4IG1lbTI7CgoJICBvZmZzZXQgKz0gR0VUX01PREVfU0la RSAobW9kZSk7CgkgIG1lbTIgPSBnZW5fZnJhbWVfbWVtIChtb2RlLCBwbHVzX2NvbnN0YW50IChQ bW9kZSwgYmFzZV9ydHgsIG9mZnNldCkpOwoJICBpbnNuID0gZW1pdF9pbnNuIChhYXJjaDY0X2dl bl9zdG9yZV9wYWlyIChtb2RlLCBtZW0sIHJlZywgbWVtMiwKCQkJCQkJICAgIHJlZzIpKTsKCgkg IC8qIFRoZSBmaXJzdCBwYXJ0IG9mIGEgZnJhbWUtcmVsYXRlZCBwYXJhbGxlbCBpbnNuIGlzCgkg ICAgIGFsd2F5cyBhc3N1bWVkIHRvIGJlIHJlbGV2YW50IHRvIHRoZSBmcmFtZQoJICAgICBjYWxj dWxhdGlvbnM7IHN1YnNlcXVlbnQgcGFydHMsIGFyZSBvbmx5CgkgICAgIGZyYW1lLXJlbGF0ZWQg aWYgZXhwbGljaXRseSBtYXJrZWQuICAqLwoJICBpZiAoYWFyY2g2NF9lbWl0X2NmaV9mb3JfcmVn X3AgKHJlZ25vMikpCgkgICAgewoJICAgICAgaWYgKG5lZWRfY2ZhX25vdGVfcCkKCQlhYXJjaDY0 X2FkZF9jZmFfZXhwcmVzc2lvbiAoaW5zbiwgcmVnMiwgc3RhY2tfcG9pbnRlcl9ydHgsCgkJCQkJ ICAgIHNwX29mZnNldCArIEdFVF9NT0RFX1NJWkUgKG1vZGUpKTsKCSAgICAgIGVsc2UKCQlSVFhf RlJBTUVfUkVMQVRFRF9QIChYVkVDRVhQIChQQVRURVJOIChpbnNuKSwgMCwgMSkpID0gMTsKCSAg ICB9CgoJICByZWdubyA9IHJlZ25vMjsKCX0KICAgICAgZWxzZSBpZiAobW9kZSA9PSBWTngyRElt b2RlICYmIEJZVEVTX0JJR19FTkRJQU4pCgl7CgkgIGluc24gPSBlbWl0X2luc24gKGdlbl9hYXJj aDY0X3ByZWRfbW92IChtb2RlLCBtZW0sIHB0cnVlLCByZWcpKTsKCSAgbmVlZF9jZmFfbm90ZV9w ID0gdHJ1ZTsKCX0KICAgICAgZWxzZSBpZiAoYWFyY2g2NF9zdmVfbW9kZV9wIChtb2RlKSkKCWlu c24gPSBlbWl0X2luc24gKGdlbl9ydHhfU0VUIChtZW0sIHJlZykpOwogICAgICBlbHNlCglpbnNu ID0gZW1pdF9tb3ZlX2luc24gKG1lbSwgcmVnKTsKCiAgICAgIFJUWF9GUkFNRV9SRUxBVEVEX1Ag KGluc24pID0gZnJhbWVfcmVsYXRlZF9wOwogICAgICBpZiAoZnJhbWVfcmVsYXRlZF9wICYmIG5l ZWRfY2ZhX25vdGVfcCkKCWFhcmNoNjRfYWRkX2NmYV9leHByZXNzaW9uIChpbnNuLCByZWcsIHN0 YWNrX3BvaW50ZXJfcnR4LCBzcF9vZmZzZXQpOwogICAgfQp9CgovKiBFbWl0IGNvZGUgdG8gcmVz dG9yZSB0aGUgY2FsbGVlIHJlZ2lzdGVycyBmcm9tIHJlZ2lzdGVyIG51bWJlciBTVEFSVAogICB1 cCB0byBhbmQgaW5jbHVkaW5nIExJTUlULiAgUmVzdG9yZSBmcm9tIHRoZSBzdGFjayBvZmZzZXQg U1RBUlRfT0ZGU0VULAogICBza2lwcGluZyBhbnkgd3JpdGUtYmFjayBjYW5kaWRhdGVzIGlmIFNL SVBfV0IgaXMgdHJ1ZS4gIFdyaXRlIHRoZQogICBhcHByb3ByaWF0ZSBSRUdfQ0ZBX1JFU1RPUkUg bm90ZXMgaW50byBDRklfT1BTLiAgKi8KCnN0YXRpYyB2b2lkCmFhcmNoNjRfcmVzdG9yZV9jYWxs ZWVfc2F2ZXMgKHBvbHlfaW50NjQgc3RhcnRfb2Zmc2V0LCB1bnNpZ25lZCBzdGFydCwKCQkJICAg ICAgdW5zaWduZWQgbGltaXQsIGJvb2wgc2tpcF93YiwgcnR4ICpjZmlfb3BzKQp7CiAgdW5zaWdu ZWQgcmVnbm87CiAgdW5zaWduZWQgcmVnbm8yOwogIHBvbHlfaW50NjQgb2Zmc2V0OwogIHJ0eCBh bmNob3JfcmVnID0gTlVMTF9SVFgsIHB0cnVlID0gTlVMTF9SVFg7CgogIGZvciAocmVnbm8gPSBh YXJjaDY0X25leHRfY2FsbGVlX3NhdmUgKHN0YXJ0LCBsaW1pdCk7CiAgICAgICByZWdubyA8PSBs aW1pdDsKICAgICAgIHJlZ25vID0gYWFyY2g2NF9uZXh0X2NhbGxlZV9zYXZlIChyZWdubyArIDEs IGxpbWl0KSkKICAgIHsKICAgICAgYm9vbCBmcmFtZV9yZWxhdGVkX3AgPSBhYXJjaDY0X2VtaXRf Y2ZpX2Zvcl9yZWdfcCAocmVnbm8pOwogICAgICBpZiAoY2Z1bi0+bWFjaGluZS0+cmVnX2lzX3dy YXBwZWRfc2VwYXJhdGVseVtyZWdub10pCgljb250aW51ZTsKCiAgICAgIHJ0eCByZWcsIG1lbTsK CiAgICAgIGlmIChza2lwX3diCgkgICYmIChyZWdubyA9PSBjZnVuLT5tYWNoaW5lLT5mcmFtZS53 Yl9wb3BfY2FuZGlkYXRlMQoJICAgICAgfHwgcmVnbm8gPT0gY2Z1bi0+bWFjaGluZS0+ZnJhbWUu d2JfcG9wX2NhbmRpZGF0ZTIpKQoJY29udGludWU7CgogICAgICBtYWNoaW5lX21vZGUgbW9kZSA9 IGFhcmNoNjRfcmVnX3NhdmVfbW9kZSAocmVnbm8pOwogICAgICByZWcgPSBnZW5fcnR4X1JFRyAo bW9kZSwgcmVnbm8pOwogICAgICBvZmZzZXQgPSBzdGFydF9vZmZzZXQgKyBjZnVuLT5tYWNoaW5l LT5mcmFtZS5yZWdfb2Zmc2V0W3JlZ25vXTsKICAgICAgcnR4IGJhc2VfcnR4ID0gc3RhY2tfcG9p bnRlcl9ydHg7CiAgICAgIGlmIChtb2RlID09IFZOeDJESW1vZGUgJiYgQllURVNfQklHX0VORElB TikKCWFhcmNoNjRfYWRqdXN0X3N2ZV9jYWxsZWVfc2F2ZV9iYXNlIChtb2RlLCBiYXNlX3J0eCwg YW5jaG9yX3JlZywKCQkJCQkgICAgIG9mZnNldCwgcHRydWUpOwogICAgICBtZW0gPSBnZW5fZnJh bWVfbWVtIChtb2RlLCBwbHVzX2NvbnN0YW50IChQbW9kZSwgYmFzZV9ydHgsIG9mZnNldCkpOwoK ICAgICAgaWYgKCFhYXJjaDY0X3N2ZV9tb2RlX3AgKG1vZGUpCgkgICYmIChyZWdubzIgPSBhYXJj aDY0X25leHRfY2FsbGVlX3NhdmUgKHJlZ25vICsgMSwgbGltaXQpKSA8PSBsaW1pdAoJICAmJiAh Y2Z1bi0+bWFjaGluZS0+cmVnX2lzX3dyYXBwZWRfc2VwYXJhdGVseVtyZWdubzJdCgkgICYmIGtu b3duX2VxIChHRVRfTU9ERV9TSVpFIChtb2RlKSwKCQkgICAgICAgY2Z1bi0+bWFjaGluZS0+ZnJh bWUucmVnX29mZnNldFtyZWdubzJdCgkJICAgICAgIC0gY2Z1bi0+bWFjaGluZS0+ZnJhbWUucmVn X29mZnNldFtyZWdub10pKQoJewoJICBydHggcmVnMiA9IGdlbl9ydHhfUkVHIChtb2RlLCByZWdu bzIpOwoJICBydHggbWVtMjsKCgkgIG9mZnNldCArPSBHRVRfTU9ERV9TSVpFIChtb2RlKTsKCSAg bWVtMiA9IGdlbl9mcmFtZV9tZW0gKG1vZGUsIHBsdXNfY29uc3RhbnQgKFBtb2RlLCBiYXNlX3J0 eCwgb2Zmc2V0KSk7CgkgIGVtaXRfaW5zbiAoYWFyY2g2NF9nZW5fbG9hZF9wYWlyIChtb2RlLCBy ZWcsIG1lbSwgcmVnMiwgbWVtMikpOwoKCSAgKmNmaV9vcHMgPSBhbGxvY19yZWdfbm90ZSAoUkVH X0NGQV9SRVNUT1JFLCByZWcyLCAqY2ZpX29wcyk7CgkgIHJlZ25vID0gcmVnbm8yOwoJfQogICAg ICBlbHNlIGlmIChtb2RlID09IFZOeDJESW1vZGUgJiYgQllURVNfQklHX0VORElBTikKCWVtaXRf aW5zbiAoZ2VuX2FhcmNoNjRfcHJlZF9tb3YgKG1vZGUsIHJlZywgcHRydWUsIG1lbSkpOwogICAg ICBlbHNlIGlmIChhYXJjaDY0X3N2ZV9tb2RlX3AgKG1vZGUpKQoJZW1pdF9pbnNuIChnZW5fcnR4 X1NFVCAocmVnLCBtZW0pKTsKICAgICAgZWxzZQoJZW1pdF9tb3ZlX2luc24gKHJlZywgbWVtKTsK ICAgICAgaWYgKGZyYW1lX3JlbGF0ZWRfcCkKCSpjZmlfb3BzID0gYWxsb2NfcmVnX25vdGUgKFJF R19DRkFfUkVTVE9SRSwgcmVnLCAqY2ZpX29wcyk7CiAgICB9Cn0KCi8qIFJldHVybiB0cnVlIGlm IE9GRlNFVCBpcyBhIHNpZ25lZCA0LWJpdCB2YWx1ZSBtdWx0aXBsaWVkIGJ5IHRoZSBzaXplCiAg IG9mIE1PREUuICAqLwoKc3RhdGljIGlubGluZSBib29sCm9mZnNldF80Yml0X3NpZ25lZF9zY2Fs ZWRfcCAobWFjaGluZV9tb2RlIG1vZGUsIHBvbHlfaW50NjQgb2Zmc2V0KQp7CiAgSE9TVF9XSURF X0lOVCBtdWx0aXBsZTsKICByZXR1cm4gKGNvbnN0YW50X211bHRpcGxlX3AgKG9mZnNldCwgR0VU X01PREVfU0laRSAobW9kZSksICZtdWx0aXBsZSkKCSAgJiYgSU5fUkFOR0UgKG11bHRpcGxlLCAt OCwgNykpOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBPRkZTRVQgaXMgYSBzaWduZWQgNi1iaXQgdmFs dWUgbXVsdGlwbGllZCBieSB0aGUgc2l6ZQogICBvZiBNT0RFLiAgKi8KCnN0YXRpYyBpbmxpbmUg Ym9vbApvZmZzZXRfNmJpdF9zaWduZWRfc2NhbGVkX3AgKG1hY2hpbmVfbW9kZSBtb2RlLCBwb2x5 X2ludDY0IG9mZnNldCkKewogIEhPU1RfV0lERV9JTlQgbXVsdGlwbGU7CiAgcmV0dXJuIChjb25z dGFudF9tdWx0aXBsZV9wIChvZmZzZXQsIEdFVF9NT0RFX1NJWkUgKG1vZGUpLCAmbXVsdGlwbGUp CgkgICYmIElOX1JBTkdFIChtdWx0aXBsZSwgLTMyLCAzMSkpOwp9CgovKiBSZXR1cm4gdHJ1ZSBp ZiBPRkZTRVQgaXMgYW4gdW5zaWduZWQgNi1iaXQgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgc2l6 ZQogICBvZiBNT0RFLiAgKi8KCnN0YXRpYyBpbmxpbmUgYm9vbApvZmZzZXRfNmJpdF91bnNpZ25l ZF9zY2FsZWRfcCAobWFjaGluZV9tb2RlIG1vZGUsIHBvbHlfaW50NjQgb2Zmc2V0KQp7CiAgSE9T VF9XSURFX0lOVCBtdWx0aXBsZTsKICByZXR1cm4gKGNvbnN0YW50X211bHRpcGxlX3AgKG9mZnNl dCwgR0VUX01PREVfU0laRSAobW9kZSksICZtdWx0aXBsZSkKCSAgJiYgSU5fUkFOR0UgKG11bHRp cGxlLCAwLCA2MykpOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBPRkZTRVQgaXMgYSBzaWduZWQgNy1i aXQgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgc2l6ZQogICBvZiBNT0RFLiAgKi8KCmJvb2wKYWFy Y2g2NF9vZmZzZXRfN2JpdF9zaWduZWRfc2NhbGVkX3AgKG1hY2hpbmVfbW9kZSBtb2RlLCBwb2x5 X2ludDY0IG9mZnNldCkKewogIEhPU1RfV0lERV9JTlQgbXVsdGlwbGU7CiAgcmV0dXJuIChjb25z dGFudF9tdWx0aXBsZV9wIChvZmZzZXQsIEdFVF9NT0RFX1NJWkUgKG1vZGUpLCAmbXVsdGlwbGUp CgkgICYmIElOX1JBTkdFIChtdWx0aXBsZSwgLTY0LCA2MykpOwp9CgovKiBSZXR1cm4gdHJ1ZSBp ZiBPRkZTRVQgaXMgYSBzaWduZWQgOS1iaXQgdmFsdWUuICAqLwoKYm9vbAphYXJjaDY0X29mZnNl dF85Yml0X3NpZ25lZF91bnNjYWxlZF9wIChtYWNoaW5lX21vZGUgbW9kZSBBVFRSSUJVVEVfVU5V U0VELAoJCQkJICAgICAgIHBvbHlfaW50NjQgb2Zmc2V0KQp7CiAgSE9TVF9XSURFX0lOVCBjb25z dF9vZmZzZXQ7CiAgcmV0dXJuIChvZmZzZXQuaXNfY29uc3RhbnQgKCZjb25zdF9vZmZzZXQpCgkg ICYmIElOX1JBTkdFIChjb25zdF9vZmZzZXQsIC0yNTYsIDI1NSkpOwp9CgovKiBSZXR1cm4gdHJ1 ZSBpZiBPRkZTRVQgaXMgYSBzaWduZWQgOS1iaXQgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgc2l6 ZQogICBvZiBNT0RFLiAgKi8KCnN0YXRpYyBpbmxpbmUgYm9vbApvZmZzZXRfOWJpdF9zaWduZWRf c2NhbGVkX3AgKG1hY2hpbmVfbW9kZSBtb2RlLCBwb2x5X2ludDY0IG9mZnNldCkKewogIEhPU1Rf V0lERV9JTlQgbXVsdGlwbGU7CiAgcmV0dXJuIChjb25zdGFudF9tdWx0aXBsZV9wIChvZmZzZXQs IEdFVF9NT0RFX1NJWkUgKG1vZGUpLCAmbXVsdGlwbGUpCgkgICYmIElOX1JBTkdFIChtdWx0aXBs ZSwgLTI1NiwgMjU1KSk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIE9GRlNFVCBpcyBhbiB1bnNpZ25l ZCAxMi1iaXQgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgc2l6ZQogICBvZiBNT0RFLiAgKi8KCnN0 YXRpYyBpbmxpbmUgYm9vbApvZmZzZXRfMTJiaXRfdW5zaWduZWRfc2NhbGVkX3AgKG1hY2hpbmVf bW9kZSBtb2RlLCBwb2x5X2ludDY0IG9mZnNldCkKewogIEhPU1RfV0lERV9JTlQgbXVsdGlwbGU7 CiAgcmV0dXJuIChjb25zdGFudF9tdWx0aXBsZV9wIChvZmZzZXQsIEdFVF9NT0RFX1NJWkUgKG1v ZGUpLCAmbXVsdGlwbGUpCgkgICYmIElOX1JBTkdFIChtdWx0aXBsZSwgMCwgNDA5NSkpOwp9Cgov KiBJbXBsZW1lbnQgVEFSR0VUX1NIUklOS19XUkFQX0dFVF9TRVBBUkFURV9DT01QT05FTlRTLiAg Ki8KCnN0YXRpYyBzYml0bWFwCmFhcmNoNjRfZ2V0X3NlcGFyYXRlX2NvbXBvbmVudHMgKHZvaWQp CnsKICBzYml0bWFwIGNvbXBvbmVudHMgPSBzYml0bWFwX2FsbG9jIChMQVNUX1NBVkVEX1JFR05V TSArIDEpOwogIGJpdG1hcF9jbGVhciAoY29tcG9uZW50cyk7CgogIC8qIFRoZSByZWdpc3RlcnMg d2UgbmVlZCBzYXZlZCB0byB0aGUgZnJhbWUuICAqLwogIGZvciAodW5zaWduZWQgcmVnbm8gPSAw OyByZWdubyA8PSBMQVNUX1NBVkVEX1JFR05VTTsgcmVnbm8rKykKICAgIGlmIChhYXJjaDY0X3Jl Z2lzdGVyX3NhdmVkX29uX2VudHJ5IChyZWdubykpCiAgICAgIHsKCS8qIFB1bnQgb24gc2F2ZXMg YW5kIHJlc3RvcmVzIHRoYXQgdXNlIFNUMUQgYW5kIExEMUQuICBXZSBjb3VsZAoJICAgdHJ5IHRv IGJlIHNtYXJ0ZXIsIGJ1dCBpdCB3b3VsZCBpbnZvbHZlIG1ha2luZyBzdXJlIHRoYXQgdGhlCgkg ICBzcGFyZSBwcmVkaWNhdGUgcmVnaXN0ZXIgaXRzZWxmIGlzIHNhZmUgdG8gdXNlIGF0IHRoZSBz YXZlCgkgICBhbmQgcmVzdG9yZSBwb2ludHMuICBBbHNvLCB3aGVuIGEgZnJhbWUgcG9pbnRlciBp cyBiZWluZyB1c2VkLAoJICAgdGhlIHNsb3RzIGFyZSBvZnRlbiBvdXQgb2YgcmVhY2ggb2YgU1Qx RCBhbmQgTEQxRCBhbnl3YXkuICAqLwoJbWFjaGluZV9tb2RlIG1vZGUgPSBhYXJjaDY0X3JlZ19z YXZlX21vZGUgKHJlZ25vKTsKCWlmIChtb2RlID09IFZOeDJESW1vZGUgJiYgQllURVNfQklHX0VO RElBTikKCSAgY29udGludWU7CgoJcG9seV9pbnQ2NCBvZmZzZXQgPSBjZnVuLT5tYWNoaW5lLT5m cmFtZS5yZWdfb2Zmc2V0W3JlZ25vXTsKCgkvKiBJZiB0aGUgcmVnaXN0ZXIgaXMgc2F2ZWQgaW4g dGhlIGZpcnN0IFNWRSBzYXZlIHNsb3QsIHdlIHVzZQoJICAgaXQgYXMgYSBzdGFjayBwcm9iZSBm b3IgLWZzdGFjay1jbGFzaC1wcm90ZWN0aW9uLiAgKi8KCWlmIChmbGFnX3N0YWNrX2NsYXNoX3By b3RlY3Rpb24KCSAgICAmJiBtYXliZV9uZSAoY2Z1bi0+bWFjaGluZS0+ZnJhbWUuYmVsb3dfaGFy ZF9mcF9zYXZlZF9yZWdzX3NpemUsIDApCgkgICAgJiYga25vd25fZXEgKG9mZnNldCwgMCkpCgkg IGNvbnRpbnVlOwoKCS8qIEdldCB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSByZWdpc3RlciB3 ZSdsbCB1c2UuICAqLwoJaWYgKGZyYW1lX3BvaW50ZXJfbmVlZGVkKQoJICBvZmZzZXQgLT0gY2Z1 bi0+bWFjaGluZS0+ZnJhbWUuYmVsb3dfaGFyZF9mcF9zYXZlZF9yZWdzX3NpemU7CgllbHNlCgkg IG9mZnNldCArPSBjcnRsLT5vdXRnb2luZ19hcmdzX3NpemU7CgoJLyogQ2hlY2sgdGhhdCB3ZSBj YW4gYWNjZXNzIHRoZSBzdGFjayBzbG90IG9mIHRoZSByZWdpc3RlciB3aXRoIG9uZQoJICAgZGly ZWN0IGxvYWQgd2l0aCBubyBhZGp1c3RtZW50cyBuZWVkZWQuICAqLwoJaWYgKGFhcmNoNjRfc3Zl X21vZGVfcCAobW9kZSkKCSAgICA/IG9mZnNldF85Yml0X3NpZ25lZF9zY2FsZWRfcCAobW9kZSwg b2Zmc2V0KQoJICAgIDogb2Zmc2V0XzEyYml0X3Vuc2lnbmVkX3NjYWxlZF9wIChtb2RlLCBvZmZz ZXQpKQoJICBiaXRtYXBfc2V0X2JpdCAoY29tcG9uZW50cywgcmVnbm8pOwogICAgICB9CgogIC8q IERvbid0IG1lc3Mgd2l0aCB0aGUgaGFyZCBmcmFtZSBwb2ludGVyLiAgKi8KICBpZiAoZnJhbWVf cG9pbnRlcl9uZWVkZWQpCiAgICBiaXRtYXBfY2xlYXJfYml0IChjb21wb25lbnRzLCBIQVJEX0ZS QU1FX1BPSU5URVJfUkVHTlVNKTsKCiAgLyogSWYgdGhlIHNwYXJlIHByZWRpY2F0ZSByZWdpc3Rl ciB1c2VkIGJ5IGJpZy1lbmRpYW4gU1ZFIGNvZGUKICAgICBpcyBjYWxsLXByZXNlcnZlZCwgaXQg bXVzdCBiZSBzYXZlZCBpbiB0aGUgbWFpbiBwcm9sb2d1ZQogICAgIGJlZm9yZSBhbnkgc2F2ZXMg dGhhdCB1c2UgaXQuICAqLwogIGlmIChjZnVuLT5tYWNoaW5lLT5mcmFtZS5zcGFyZV9wcmVkX3Jl ZyAhPSBJTlZBTElEX1JFR05VTSkKICAgIGJpdG1hcF9jbGVhcl9iaXQgKGNvbXBvbmVudHMsIGNm dW4tPm1hY2hpbmUtPmZyYW1lLnNwYXJlX3ByZWRfcmVnKTsKCiAgdW5zaWduZWQgcmVnMSA9IGNm dW4tPm1hY2hpbmUtPmZyYW1lLndiX3B1c2hfY2FuZGlkYXRlMTsKICB1bnNpZ25lZCByZWcyID0g Y2Z1bi0+bWFjaGluZS0+ZnJhbWUud2JfcHVzaF9jYW5kaWRhdGUyOwogIC8qIElmIHJlZ2lzdGVy cyBoYXZlIGJlZW4gY2hvc2VuIHRvIGJlIHN0b3JlZC9yZXN0b3JlZCB3aXRoCiAgICAgd3JpdGVi YWNrIGRvbid0IGludGVyZmVyZSB3aXRoIHRoZW0gdG8gYXZvaWQgaGF2aW5nIHRvIG91dHB1dCBl eHBsaWNpdAogICAgIHN0YWNrIGFkanVzdG1lbnQgaW5zdHJ1Y3Rpb25zLiAgKi8KICBpZiAocmVn MiAhPSBJTlZBTElEX1JFR05VTSkKICAgIGJpdG1hcF9jbGVhcl9iaXQgKGNvbXBvbmVudHMsIHJl ZzIpOwogIGlmIChyZWcxICE9IElOVkFMSURfUkVHTlVNKQogICAgYml0bWFwX2NsZWFyX2JpdCAo Y29tcG9uZW50cywgcmVnMSk7CgogIGJpdG1hcF9jbGVhcl9iaXQgKGNvbXBvbmVudHMsIExSX1JF R05VTSk7CiAgYml0bWFwX2NsZWFyX2JpdCAoY29tcG9uZW50cywgU1BfUkVHTlVNKTsKCiAgcmV0 dXJuIGNvbXBvbmVudHM7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfU0hSSU5LX1dSQVBfQ09NUE9O RU5UU19GT1JfQkIuICAqLwoKc3RhdGljIHNiaXRtYXAKYWFyY2g2NF9jb21wb25lbnRzX2Zvcl9i YiAoYmFzaWNfYmxvY2sgYmIpCnsKICBiaXRtYXAgaW4gPSBERl9MSVZFX0lOIChiYik7CiAgYml0 bWFwIGdlbiA9ICZERl9MSVZFX0JCX0lORk8gKGJiKS0+Z2VuOwogIGJpdG1hcCBraWxsID0gJkRG X0xJVkVfQkJfSU5GTyAoYmIpLT5raWxsOwoKICBzYml0bWFwIGNvbXBvbmVudHMgPSBzYml0bWFw X2FsbG9jIChMQVNUX1NBVkVEX1JFR05VTSArIDEpOwogIGJpdG1hcF9jbGVhciAoY29tcG9uZW50 cyk7CgogIC8qIENsb2JiZXJlZCByZWdpc3RlcnMgZG9uJ3QgZ2VuZXJhdGUgdmFsdWVzIGluIGFu eSBtZWFuaW5nZnVsIHNlbnNlLAogICAgIHNpbmNlIG5vdGhpbmcgYWZ0ZXIgdGhlIGNsb2JiZXIg Y2FuIHJlbHkgb24gdGhlaXIgdmFsdWUuICBBbmQgd2UgY2FuJ3QKICAgICBzYXkgdGhhdCBwYXJ0 aWFsbHktY2xvYmJlcmVkIHJlZ2lzdGVycyBhcmUgdW5jb25kaXRpb25hbGx5IGtpbGxlZCwKICAg ICBiZWNhdXNlIHdoZXRoZXIgdGhleSdyZSBraWxsZWQgb3Igbm90IGRlcGVuZHMgb24gdGhlIG1v ZGUgb2YgdGhlCiAgICAgdmFsdWUgdGhleSdyZSBob2xkaW5nLiAgVGh1cyBwYXJ0aWFsbHkgY2Fs bC1jbG9iYmVyZWQgcmVnaXN0ZXJzCiAgICAgYXBwZWFyIGluIG5laXRoZXIgdGhlIGtpbGwgc2V0 IG5vciB0aGUgZ2VuIHNldC4KCiAgICAgQ2hlY2sgbWFudWFsbHkgZm9yIGFueSBjYWxscyB0aGF0 IGNsb2JiZXIgbW9yZSBvZiBhIHJlZ2lzdGVyIHRoYW4gdGhlCiAgICAgY3VycmVudCBmdW5jdGlv biBjYW4uICAqLwogIGZ1bmN0aW9uX2FiaV9hZ2dyZWdhdG9yIGNhbGxlZV9hYmlzOwogIHJ0eF9p bnNuICppbnNuOwogIEZPUl9CQl9JTlNOUyAoYmIsIGluc24pCiAgICBpZiAoQ0FMTF9QIChpbnNu KSkKICAgICAgY2FsbGVlX2FiaXMubm90ZV9jYWxsZWVfYWJpIChpbnNuX2NhbGxlZV9hYmkgKGlu c24pKTsKICBIQVJEX1JFR19TRVQgZXh0cmFfY2FsbGVyX3NhdmVzID0gY2FsbGVlX2FiaXMuY2Fs bGVyX3NhdmVfcmVncyAoKmNydGwtPmFiaSk7CgogIC8qIEdQUnMgYXJlIHVzZWQgaW4gYSBiYiBp ZiB0aGV5IGFyZSBpbiB0aGUgSU4sIEdFTiwgb3IgS0lMTCBzZXRzLiAgKi8KICBmb3IgKHVuc2ln bmVkIHJlZ25vID0gMDsgcmVnbm8gPD0gTEFTVF9TQVZFRF9SRUdOVU07IHJlZ25vKyspCiAgICBp ZiAoIWZpeGVkX3JlZ3NbcmVnbm9dCgkmJiAhY3J0bC0+YWJpLT5jbG9iYmVyc19mdWxsX3JlZ19w IChyZWdubykKCSYmIChURVNUX0hBUkRfUkVHX0JJVCAoZXh0cmFfY2FsbGVyX3NhdmVzLCByZWdu bykKCSAgICB8fCBiaXRtYXBfYml0X3AgKGluLCByZWdubykKCSAgICB8fCBiaXRtYXBfYml0X3Ag KGdlbiwgcmVnbm8pCgkgICAgfHwgYml0bWFwX2JpdF9wIChraWxsLCByZWdubykpKQogICAgICB7 CgliaXRtYXBfc2V0X2JpdCAoY29tcG9uZW50cywgcmVnbm8pOwoKCS8qIElmIHRoZXJlIGlzIGEg Y2FsbGVlLXNhdmUgYXQgYW4gYWRqYWNlbnQgb2Zmc2V0LCBhZGQgaXQgdG9vCgkgICB0byBpbmNy ZWFzZSB0aGUgdXNlIG9mIExEUC9TVFAuICAqLwoJcG9seV9pbnQ2NCBvZmZzZXQgPSBjZnVuLT5t YWNoaW5lLT5mcmFtZS5yZWdfb2Zmc2V0W3JlZ25vXTsKCXVuc2lnbmVkIHJlZ25vMiA9IG11bHRp cGxlX3AgKG9mZnNldCwgMTYpID8gcmVnbm8gKyAxIDogcmVnbm8gLSAxOwoKCWlmIChyZWdubzIg PD0gTEFTVF9TQVZFRF9SRUdOVU0pCgkgIHsKCSAgICBwb2x5X2ludDY0IG9mZnNldDIgPSBjZnVu LT5tYWNoaW5lLT5mcmFtZS5yZWdfb2Zmc2V0W3JlZ25vMl07CgkgICAgaWYgKHJlZ25vIDwgcmVn bm8yCgkJPyBrbm93bl9lcSAob2Zmc2V0ICsgOCwgb2Zmc2V0MikKCQk6IG11bHRpcGxlX3AgKG9m ZnNldDIsIDE2KSAmJiBrbm93bl9lcSAob2Zmc2V0MiArIDgsIG9mZnNldCkpCgkgICAgICBiaXRt YXBfc2V0X2JpdCAoY29tcG9uZW50cywgcmVnbm8yKTsKCSAgfQogICAgICB9CgogIHJldHVybiBj b21wb25lbnRzOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX1NIUklOS19XUkFQX0RJU1FVQUxJRllf Q09NUE9ORU5UUy4KICAgTm90aGluZyB0byBkbyBmb3IgYWFyY2g2NC4gICovCgpzdGF0aWMgdm9p ZAphYXJjaDY0X2Rpc3F1YWxpZnlfY29tcG9uZW50cyAoc2JpdG1hcCwgZWRnZSwgc2JpdG1hcCwg Ym9vbCkKewp9CgovKiBSZXR1cm4gdGhlIG5leHQgc2V0IGJpdCBpbiBCTVAgZnJvbSBTVEFSVCBv bndhcmRzLiAgUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIKICAgb2YgYml0cyBpbiBCTVAgaWYgbm8g c2V0IGJpdCBpcyBmb3VuZCBhdCBvciBhZnRlciBTVEFSVC4gICovCgpzdGF0aWMgdW5zaWduZWQg aW50CmFhcmNoNjRfZ2V0X25leHRfc2V0X2JpdCAoc2JpdG1hcCBibXAsIHVuc2lnbmVkIGludCBz dGFydCkKewogIHVuc2lnbmVkIGludCBuYml0cyA9IFNCSVRNQVBfU0laRSAoYm1wKTsKICBpZiAo c3RhcnQgPT0gbmJpdHMpCiAgICByZXR1cm4gc3RhcnQ7CgogIGdjY19hc3NlcnQgKHN0YXJ0IDwg bmJpdHMpOwogIGZvciAodW5zaWduZWQgaW50IGkgPSBzdGFydDsgaSA8IG5iaXRzOyBpKyspCiAg ICBpZiAoYml0bWFwX2JpdF9wIChibXAsIGkpKQogICAgICByZXR1cm4gaTsKCiAgcmV0dXJuIG5i aXRzOwp9CgovKiBEbyB0aGUgd29yayBmb3IgYWFyY2g2NF9lbWl0X3Byb2xvZ3VlX2NvbXBvbmVu dHMgYW5kCiAgIGFhcmNoNjRfZW1pdF9lcGlsb2d1ZV9jb21wb25lbnRzLiAgQ09NUE9ORU5UUyBp cyB0aGUgYml0bWFwIG9mIHJlZ2lzdGVycwogICB0byBzYXZlL3Jlc3RvcmUsIFBST0xPR1VFX1Ag aW5kaWNhdGVzIHdoZXRoZXIgdG8gZW1pdCB0aGUgcHJvbG9ndWUgc2VxdWVuY2UKICAgZm9yIHRo ZXNlIGNvbXBvbmVudHMgb3IgdGhlIGVwaWxvZ3VlIHNlcXVlbmNlLiAgVGhhdCBpcywgaXQgZGV0 ZXJtaW5lcwogICB3aGV0aGVyIHdlIHNob3VsZCBlbWl0IHN0b3JlcyBvciBsb2FkcyBhbmQgd2hh dCBraW5kIG9mIENGQSBub3RlcyB0byBhdHRhY2gKICAgdG8gdGhlIGluc25zLiAgT3RoZXJ3aXNl IHRoZSBsb2dpYyBmb3IgdGhlIHR3byBzZXF1ZW5jZXMgaXMgdmVyeQogICBzaW1pbGFyLiAgKi8K CnN0YXRpYyB2b2lkCmFhcmNoNjRfcHJvY2Vzc19jb21wb25lbnRzIChzYml0bWFwIGNvbXBvbmVu dHMsIGJvb2wgcHJvbG9ndWVfcCkKewogIHJ0eCBwdHJfcmVnID0gZ2VuX3J0eF9SRUcgKFBtb2Rl LCBmcmFtZV9wb2ludGVyX25lZWRlZAoJCQkgICAgID8gSEFSRF9GUkFNRV9QT0lOVEVSX1JFR05V TQoJCQkgICAgIDogU1RBQ0tfUE9JTlRFUl9SRUdOVU0pOwoKICB1bnNpZ25lZCBsYXN0X3JlZ25v ID0gU0JJVE1BUF9TSVpFIChjb21wb25lbnRzKTsKICB1bnNpZ25lZCByZWdubyA9IGFhcmNoNjRf Z2V0X25leHRfc2V0X2JpdCAoY29tcG9uZW50cywgUjBfUkVHTlVNKTsKICBydHhfaW5zbiAqaW5z biA9IE5VTEw7CgogIHdoaWxlIChyZWdubyAhPSBsYXN0X3JlZ25vKQogICAgewogICAgICBib29s IGZyYW1lX3JlbGF0ZWRfcCA9IGFhcmNoNjRfZW1pdF9jZmlfZm9yX3JlZ19wIChyZWdubyk7CiAg ICAgIG1hY2hpbmVfbW9kZSBtb2RlID0gYWFyY2g2NF9yZWdfc2F2ZV9tb2RlIChyZWdubyk7CiAg ICAgIAogICAgICBydHggcmVnID0gZ2VuX3J0eF9SRUcgKG1vZGUsIHJlZ25vKTsKICAgICAgcG9s eV9pbnQ2NCBvZmZzZXQgPSBjZnVuLT5tYWNoaW5lLT5mcmFtZS5yZWdfb2Zmc2V0W3JlZ25vXTsK ICAgICAgaWYgKGZyYW1lX3BvaW50ZXJfbmVlZGVkKQoJb2Zmc2V0IC09IGNmdW4tPm1hY2hpbmUt PmZyYW1lLmJlbG93X2hhcmRfZnBfc2F2ZWRfcmVnc19zaXplOwogICAgICBlbHNlCglvZmZzZXQg Kz0gY3J0bC0+b3V0Z29pbmdfYXJnc19zaXplOwoKICAgICAgcnR4IGFkZHIgPSBwbHVzX2NvbnN0 YW50IChQbW9kZSwgcHRyX3JlZywgb2Zmc2V0KTsKICAgICAgcnR4IG1lbSA9IGdlbl9mcmFtZV9t ZW0gKG1vZGUsIGFkZHIpOwoKICAgICAgcnR4IHNldCA9IHByb2xvZ3VlX3AgPyBnZW5fcnR4X1NF VCAobWVtLCByZWcpIDogZ2VuX3J0eF9TRVQgKHJlZywgbWVtKTsKICAgICAgdW5zaWduZWQgcmVn bm8yID0gYWFyY2g2NF9nZXRfbmV4dF9zZXRfYml0IChjb21wb25lbnRzLCByZWdubyArIDEpOwog ICAgICAvKiBObyBtb3JlIHJlZ2lzdGVycyB0byBoYW5kbGUgYWZ0ZXIgUkVHTk8uCgkgRW1pdCBh IHNpbmdsZSBzYXZlL3Jlc3RvcmUgYW5kIGV4aXQuICAqLwogICAgICBpZiAocmVnbm8yID09IGxh c3RfcmVnbm8pCgl7CgkgIGluc24gPSBlbWl0X2luc24gKHNldCk7CgkgIGlmIChmcmFtZV9yZWxh dGVkX3ApCgkgICAgewoJICAgICAgUlRYX0ZSQU1FX1JFTEFURURfUCAoaW5zbikgPSAxOwoJICAg ICAgaWYgKHByb2xvZ3VlX3ApCgkJYWRkX3JlZ19ub3RlIChpbnNuLCBSRUdfQ0ZBX09GRlNFVCwg Y29weV9ydHggKHNldCkpOwoJICAgICAgZWxzZQoJCWFkZF9yZWdfbm90ZSAoaW5zbiwgUkVHX0NG QV9SRVNUT1JFLCByZWcpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBwb2x5X2ludDY0IG9m ZnNldDIgPSBjZnVuLT5tYWNoaW5lLT5mcmFtZS5yZWdfb2Zmc2V0W3JlZ25vMl07CiAgICAgIC8q IFRoZSBuZXh0IHJlZ2lzdGVyIGlzIG5vdCBvZiB0aGUgc2FtZSBjbGFzcyBvciBpdHMgb2Zmc2V0 IGlzIG5vdAoJIG1lcmdlYWJsZSB3aXRoIHRoZSBjdXJyZW50IG9uZSBpbnRvIGEgcGFpci4gICov CiAgICAgIGlmIChhYXJjaDY0X3N2ZV9tb2RlX3AgKG1vZGUpCgkgIHx8ICFzYXRpc2ZpZXNfY29u c3RyYWludF9VbXAgKG1lbSkKCSAgfHwgR1BfUkVHTlVNX1AgKHJlZ25vKSAhPSBHUF9SRUdOVU1f UCAocmVnbm8yKQoJICB8fCAoY3J0bC0+YWJpLT5pZCAoKSA9PSBBUk1fUENTX1NJTUQgJiYgRlBf UkVHTlVNX1AgKHJlZ25vKSkKCSAgfHwgbWF5YmVfbmUgKChvZmZzZXQyIC0gY2Z1bi0+bWFjaGlu ZS0+ZnJhbWUucmVnX29mZnNldFtyZWdub10pLAoJCSAgICAgICBHRVRfTU9ERV9TSVpFIChtb2Rl KSkpCgl7CgkgIGluc24gPSBlbWl0X2luc24gKHNldCk7CgkgIGlmIChmcmFtZV9yZWxhdGVkX3Ap CgkgICAgewoJICAgICAgUlRYX0ZSQU1FX1JFTEFURURfUCAoaW5zbikgPSAxOwoJICAgICAgaWYg KHByb2xvZ3VlX3ApCgkJYWRkX3JlZ19ub3RlIChpbnNuLCBSRUdfQ0ZBX09GRlNFVCwgY29weV9y dHggKHNldCkpOwoJICAgICAgZWxzZQoJCWFkZF9yZWdfbm90ZSAoaW5zbiwgUkVHX0NGQV9SRVNU T1JFLCByZWcpOwoJICAgIH0KCgkgIHJlZ25vID0gcmVnbm8yOwoJICBjb250aW51ZTsKCX0KCiAg ICAgIGJvb2wgZnJhbWVfcmVsYXRlZDJfcCA9IGFhcmNoNjRfZW1pdF9jZmlfZm9yX3JlZ19wIChy ZWdubzIpOwoKICAgICAgLyogUkVHTk8yIGNhbiBiZSBzYXZlZC9yZXN0b3JlZCBpbiBhIHBhaXIg d2l0aCBSRUdOTy4gICovCiAgICAgIHJ0eCByZWcyID0gZ2VuX3J0eF9SRUcgKG1vZGUsIHJlZ25v Mik7CiAgICAgIGlmIChmcmFtZV9wb2ludGVyX25lZWRlZCkKCW9mZnNldDIgLT0gY2Z1bi0+bWFj aGluZS0+ZnJhbWUuYmVsb3dfaGFyZF9mcF9zYXZlZF9yZWdzX3NpemU7CiAgICAgIGVsc2UKCW9m ZnNldDIgKz0gY3J0bC0+b3V0Z29pbmdfYXJnc19zaXplOwogICAgICBydHggYWRkcjIgPSBwbHVz X2NvbnN0YW50IChQbW9kZSwgcHRyX3JlZywgb2Zmc2V0Mik7CiAgICAgIHJ0eCBtZW0yID0gZ2Vu X2ZyYW1lX21lbSAobW9kZSwgYWRkcjIpOwogICAgICBydHggc2V0MiA9IHByb2xvZ3VlX3AgPyBn ZW5fcnR4X1NFVCAobWVtMiwgcmVnMikKCQkJICAgICA6IGdlbl9ydHhfU0VUIChyZWcyLCBtZW0y KTsKCiAgICAgIGlmIChwcm9sb2d1ZV9wKQoJaW5zbiA9IGVtaXRfaW5zbiAoYWFyY2g2NF9nZW5f c3RvcmVfcGFpciAobW9kZSwgbWVtLCByZWcsIG1lbTIsIHJlZzIpKTsKICAgICAgZWxzZQoJaW5z biA9IGVtaXRfaW5zbiAoYWFyY2g2NF9nZW5fbG9hZF9wYWlyIChtb2RlLCByZWcsIG1lbSwgcmVn MiwgbWVtMikpOwoKICAgICAgaWYgKGZyYW1lX3JlbGF0ZWRfcCB8fCBmcmFtZV9yZWxhdGVkMl9w KQoJewoJICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSA9IDE7CgkgIGlmIChwcm9sb2d1ZV9w KQoJICAgIHsKCSAgICAgIGlmIChmcmFtZV9yZWxhdGVkX3ApCgkJYWRkX3JlZ19ub3RlIChpbnNu LCBSRUdfQ0ZBX09GRlNFVCwgc2V0KTsKCSAgICAgIGlmIChmcmFtZV9yZWxhdGVkMl9wKQoJCWFk ZF9yZWdfbm90ZSAoaW5zbiwgUkVHX0NGQV9PRkZTRVQsIHNldDIpOwoJICAgIH0KCSAgZWxzZQoJ ICAgIHsKCSAgICAgIGlmIChmcmFtZV9yZWxhdGVkX3ApCgkJYWRkX3JlZ19ub3RlIChpbnNuLCBS RUdfQ0ZBX1JFU1RPUkUsIHJlZyk7CgkgICAgICBpZiAoZnJhbWVfcmVsYXRlZDJfcCkKCQlhZGRf cmVnX25vdGUgKGluc24sIFJFR19DRkFfUkVTVE9SRSwgcmVnMik7CgkgICAgfQoJfQoKICAgICAg cmVnbm8gPSBhYXJjaDY0X2dldF9uZXh0X3NldF9iaXQgKGNvbXBvbmVudHMsIHJlZ25vMiArIDEp OwogICAgfQp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX1NIUklOS19XUkFQX0VNSVRfUFJPTE9HVUVf Q09NUE9ORU5UUy4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X2VtaXRfcHJvbG9ndWVfY29tcG9u ZW50cyAoc2JpdG1hcCBjb21wb25lbnRzKQp7CiAgYWFyY2g2NF9wcm9jZXNzX2NvbXBvbmVudHMg KGNvbXBvbmVudHMsIHRydWUpOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX1NIUklOS19XUkFQX0VN SVRfRVBJTE9HVUVfQ09NUE9ORU5UUy4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X2VtaXRfZXBp bG9ndWVfY29tcG9uZW50cyAoc2JpdG1hcCBjb21wb25lbnRzKQp7CiAgYWFyY2g2NF9wcm9jZXNz X2NvbXBvbmVudHMgKGNvbXBvbmVudHMsIGZhbHNlKTsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9T SFJJTktfV1JBUF9TRVRfSEFORExFRF9DT01QT05FTlRTLiAgKi8KCnN0YXRpYyB2b2lkCmFhcmNo NjRfc2V0X2hhbmRsZWRfY29tcG9uZW50cyAoc2JpdG1hcCBjb21wb25lbnRzKQp7CiAgZm9yICh1 bnNpZ25lZCByZWdubyA9IDA7IHJlZ25vIDw9IExBU1RfU0FWRURfUkVHTlVNOyByZWdubysrKQog ICAgaWYgKGJpdG1hcF9iaXRfcCAoY29tcG9uZW50cywgcmVnbm8pKQogICAgICBjZnVuLT5tYWNo aW5lLT5yZWdfaXNfd3JhcHBlZF9zZXBhcmF0ZWx5W3JlZ25vXSA9IHRydWU7Cn0KCi8qIE9uIEFB cmNoNjQgd2UgaGF2ZSBhbiBBQkkgZGVmaW5lZCBzYWZlIGJ1ZmZlci4gIFRoaXMgY29uc3RhbnQg aXMgdXNlZCB0bwogICBkZXRlcm1pbmluZyB0aGUgcHJvYmUgb2Zmc2V0IGZvciBhbGxvY2EuICAq LwoKc3RhdGljIEhPU1RfV0lERV9JTlQKYWFyY2g2NF9zdGFja19jbGFzaF9wcm90ZWN0aW9uX2Fs bG9jYV9wcm9iZV9yYW5nZSAodm9pZCkKewogIHJldHVybiBTVEFDS19DTEFTSF9DQUxMRVJfR1VB UkQ7Cn0KCgovKiBBbGxvY2F0ZSBQT0xZX1NJWkUgYnl0ZXMgb2Ygc3RhY2sgc3BhY2UgdXNpbmcg VEVNUDEgYW5kIFRFTVAyIGFzIHNjcmF0Y2gKICAgcmVnaXN0ZXJzLiAgSWYgUE9MWV9TSVpFIGlz IG5vdCBsYXJnZSBlbm91Z2ggdG8gcmVxdWlyZSBhIHByb2JlIHRoaXMgZnVuY3Rpb24KICAgd2ls bCBvbmx5IGFkanVzdCB0aGUgc3RhY2suICBXaGVuIGFsbG9jYXRpbmcgdGhlIHN0YWNrIHNwYWNl CiAgIEZSQU1FX1JFTEFURURfUCBpcyB0aGVuIHVzZWQgdG8gaW5kaWNhdGUgaWYgdGhlIGFsbG9j YXRpb24gaXMgZnJhbWUgcmVsYXRlZC4KICAgRklOQUxfQURKVVNUTUVOVF9QIGluZGljYXRlcyB3 aGV0aGVyIHdlIGFyZSBhbGxvY2F0aW5nIHRoZSBvdXRnb2luZwogICBhcmd1bWVudHMuICBJZiB3 ZSBhcmUgdGhlbiB3ZSBlbnN1cmUgdGhhdCBhbnkgYWxsb2NhdGlvbiBsYXJnZXIgdGhhbiB0aGUg QUJJCiAgIGRlZmluZWQgYnVmZmVyIG5lZWRzIGEgcHJvYmUgc28gdGhhdCB0aGUgaW52YXJpYW50 IG9mIGhhdmluZyBhIDFLQiBidWZmZXIgaXMKICAgbWFpbnRhaW5lZC4KCiAgIFdlIGVtaXQgYmFy cmllcnMgYWZ0ZXIgZWFjaCBzdGFjayBhZGp1c3RtZW50IHRvIHByZXZlbnQgb3B0aW1pemF0aW9u cyBmcm9tCiAgIGJyZWFraW5nIHRoZSBpbnZhcmlhbnQgdGhhdCB3ZSBuZXZlciBkcm9wIHRoZSBz dGFjayBtb3JlIHRoYW4gYSBwYWdlLiAgVGhpcwogICBpbnZhcmlhbnQgaXMgbmVlZGVkIHRvIG1h a2UgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBoYW5kbGUgYXN5bmNocm9ub3VzCiAgIGV2ZW50cywg ZS5nLiBpZiB3ZSB3ZXJlIHRvIGFsbG93IHRoZSBzdGFjayB0byBiZSBkcm9wcGVkIGJ5IG1vcmUg dGhhbiBhIHBhZ2UKICAgYW5kIHRoZW4gaGF2ZSBtdWx0aXBsZSBwcm9iZXMgdXAgYW5kIHdlIHRh a2UgYSBzaWduYWwgc29tZXdoZXJlIGluIGJldHdlZW4KICAgdGhlbiB0aGUgc2lnbmFsIGhhbmRs ZXIgZG9lc24ndCBrbm93IHRoZSBzdGF0ZSBvZiB0aGUgc3RhY2sgYW5kIGNhbiBtYWtlIG5vCiAg IGFzc3VtcHRpb25zIGFib3V0IHdoaWNoIHBhZ2VzIGhhdmUgYmVlbiBwcm9iZWQuICAqLwoKc3Rh dGljIHZvaWQKYWFyY2g2NF9hbGxvY2F0ZV9hbmRfcHJvYmVfc3RhY2tfc3BhY2UgKHJ0eCB0ZW1w MSwgcnR4IHRlbXAyLAoJCQkJCXBvbHlfaW50NjQgcG9seV9zaXplLAoJCQkJCWJvb2wgZnJhbWVf cmVsYXRlZF9wLAoJCQkJCWJvb2wgZmluYWxfYWRqdXN0bWVudF9wKQp7CiAgSE9TVF9XSURFX0lO VCBndWFyZF9zaXplCiAgICA9IDEgPDwgcGFyYW1fc3RhY2tfY2xhc2hfcHJvdGVjdGlvbl9ndWFy ZF9zaXplOwogIEhPU1RfV0lERV9JTlQgZ3VhcmRfdXNlZF9ieV9jYWxsZXIgPSBTVEFDS19DTEFT SF9DQUxMRVJfR1VBUkQ7CiAgSE9TVF9XSURFX0lOVCBtaW5fcHJvYmVfdGhyZXNob2xkCiAgICA9 IChmaW5hbF9hZGp1c3RtZW50X3AKICAgICAgID8gZ3VhcmRfdXNlZF9ieV9jYWxsZXIKICAgICAg IDogZ3VhcmRfc2l6ZSAtIGd1YXJkX3VzZWRfYnlfY2FsbGVyKTsKICAvKiBXaGVuIGRvaW5nIHRo ZSBmaW5hbCBhZGp1c3RtZW50IGZvciB0aGUgb3V0Z29pbmcgYXJndW1lbnRzLCB0YWtlIGludG8K ICAgICBhY2NvdW50IGFueSB1bnByb2JlZCBzcGFjZSB0aGVyZSBpcyBhYm92ZSB0aGUgY3VycmVu dCBTUC4gIFRoZXJlIGFyZQogICAgIHR3byBjYXNlczoKCiAgICAgLSBXaGVuIHNhdmluZyBTVkUg cmVnaXN0ZXJzIGJlbG93IHRoZSBoYXJkIGZyYW1lIHBvaW50ZXIsIHdlIGZvcmNlCiAgICAgICB0 aGUgbG93ZXN0IHNhdmUgdG8gdGFrZSBwbGFjZSBpbiB0aGUgcHJvbG9ndWUgYmVmb3JlIGRvaW5n IHRoZSBmaW5hbAogICAgICAgYWRqdXN0bWVudCAoaS5lLiB3ZSBkb24ndCBhbGxvdyB0aGUgc2F2 ZSB0byBiZSBzaHJpbmstd3JhcHBlZCkuCiAgICAgICBUaGlzIGFjdHMgYXMgYSBwcm9iZSBhdCBT UCwgc28gdGhlcmUgaXMgbm8gdW5wcm9iZWQgc3BhY2UuCgogICAgIC0gV2hlbiB0aGVyZSBhcmUg bm8gU1ZFIHJlZ2lzdGVyIHNhdmVzLCB3ZSB1c2UgdGhlIHN0b3JlIG9mIHRoZSBsaW5rCiAgICAg ICByZWdpc3RlciBhcyBhIHByb2JlLiAgV2UgY2FuJ3QgYXNzdW1lIHRoYXQgTFIgd2FzIHNhdmVk IGF0IHBvc2l0aW9uIDAKICAgICAgIHRob3VnaCwgc28gdHJlYXQgYW55IHNwYWNlIGJlbG93IGl0 IGFzIHVucHJvYmVkLiAgKi8KICBpZiAoZmluYWxfYWRqdXN0bWVudF9wCiAgICAgICYmIGtub3du X2VxIChjZnVuLT5tYWNoaW5lLT5mcmFtZS5iZWxvd19oYXJkX2ZwX3NhdmVkX3JlZ3Nfc2l6ZSwg MCkpCiAgICB7CiAgICAgIHBvbHlfaW50NjQgbHJfb2Zmc2V0ID0gY2Z1bi0+bWFjaGluZS0+ZnJh bWUucmVnX29mZnNldFtMUl9SRUdOVU1dOwogICAgICBpZiAoa25vd25fZ2UgKGxyX29mZnNldCwg MCkpCgltaW5fcHJvYmVfdGhyZXNob2xkIC09IGxyX29mZnNldC50b19jb25zdGFudCAoKTsKICAg ICAgZWxzZQoJZ2NjX2Fzc2VydCAoIWZsYWdfc3RhY2tfY2xhc2hfcHJvdGVjdGlvbiB8fCBrbm93 bl9lcSAocG9seV9zaXplLCAwKSk7CiAgICB9CgogIHBvbHlfaW50NjQgZnJhbWVfc2l6ZSA9IGNm dW4tPm1hY2hpbmUtPmZyYW1lLmZyYW1lX3NpemU7CgogIC8qIFdlIHNob3VsZCBhbHdheXMgaGF2 ZSBhIHBvc2l0aXZlIHByb2JlIHRocmVzaG9sZC4gICovCiAgZ2NjX2Fzc2VydCAobWluX3Byb2Jl X3RocmVzaG9sZCA+IDApOwoKICBpZiAoZmxhZ19zdGFja19jbGFzaF9wcm90ZWN0aW9uICYmICFm aW5hbF9hZGp1c3RtZW50X3ApCiAgICB7CiAgICAgIHBvbHlfaW50NjQgaW5pdGlhbF9hZGp1c3Qg PSBjZnVuLT5tYWNoaW5lLT5mcmFtZS5pbml0aWFsX2FkanVzdDsKICAgICAgcG9seV9pbnQ2NCBz dmVfY2FsbGVlX2FkanVzdCA9IGNmdW4tPm1hY2hpbmUtPmZyYW1lLnN2ZV9jYWxsZWVfYWRqdXN0 OwogICAgICBwb2x5X2ludDY0IGZpbmFsX2FkanVzdCA9IGNmdW4tPm1hY2hpbmUtPmZyYW1lLmZp bmFsX2FkanVzdDsKCiAgICAgIGlmIChrbm93bl9lcSAoZnJhbWVfc2l6ZSwgMCkpCgl7CgkgIGR1 bXBfc3RhY2tfY2xhc2hfZnJhbWVfaW5mbyAoTk9fUFJPQkVfTk9fRlJBTUUsIGZhbHNlKTsKCX0K ICAgICAgZWxzZSBpZiAoa25vd25fbHQgKGluaXRpYWxfYWRqdXN0ICsgc3ZlX2NhbGxlZV9hZGp1 c3QsCgkJCSBndWFyZF9zaXplIC0gZ3VhcmRfdXNlZF9ieV9jYWxsZXIpCgkgICAgICAgJiYga25v d25fbHQgKGZpbmFsX2FkanVzdCwgZ3VhcmRfdXNlZF9ieV9jYWxsZXIpKQoJewoJICBkdW1wX3N0 YWNrX2NsYXNoX2ZyYW1lX2luZm8gKE5PX1BST0JFX1NNQUxMX0ZSQU1FLCB0cnVlKTsKCX0KICAg IH0KCiAgLyogSWYgU0laRSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIHJlcXVpcmUgcHJvYmluZywg anVzdCBhZGp1c3QgdGhlIHN0YWNrIGFuZAogICAgIGV4aXQuICAqLwogIGlmIChrbm93bl9sdCAo cG9seV9zaXplLCBtaW5fcHJvYmVfdGhyZXNob2xkKQogICAgICB8fCAhZmxhZ19zdGFja19jbGFz aF9wcm90ZWN0aW9uKQogICAgewogICAgICBhYXJjaDY0X3N1Yl9zcCAodGVtcDEsIHRlbXAyLCBw b2x5X3NpemUsIGZyYW1lX3JlbGF0ZWRfcCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgSE9TVF9X SURFX0lOVCBzaXplOwogIC8qIEhhbmRsZSB0aGUgU1ZFIG5vbi1jb25zdGFudCBjYXNlIGZpcnN0 LiAgKi8KICBpZiAoIXBvbHlfc2l6ZS5pc19jb25zdGFudCAoJnNpemUpKQogICAgewogICAgIGlm IChkdW1wX2ZpbGUpCiAgICAgIHsKCWZwcmludGYgKGR1bXBfZmlsZSwgIlN0YWNrIGNsYXNoIFNW RSBwcm9sb2d1ZTogIik7CglwcmludF9kZWMgKHBvbHlfc2l6ZSwgZHVtcF9maWxlKTsKCWZwcmlu dGYgKGR1bXBfZmlsZSwgIiBieXRlcywgZHluYW1pYyBwcm9iaW5nIHdpbGwgYmUgcmVxdWlyZWQu XG4iKTsKICAgICAgfQoKICAgICAgLyogRmlyc3QgY2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgYnl0 ZXMgd2UncmUgYWN0dWFsbHkgc3BpbGxpbmcuICAqLwogICAgICBhYXJjaDY0X2FkZF9vZmZzZXQg KFBtb2RlLCB0ZW1wMSwgQ09OU1QwX1JUWCAoUG1vZGUpLAoJCQkgIHBvbHlfc2l6ZSwgdGVtcDEs IHRlbXAyLCBmYWxzZSwgdHJ1ZSk7CgogICAgICBydHhfaW5zbiAqaW5zbiA9IGdldF9sYXN0X2lu c24gKCk7CgogICAgICBpZiAoZnJhbWVfcmVsYXRlZF9wKQoJewoJICAvKiBUaGlzIGlzIGRvbmUg dG8gcHJvdmlkZSB1bndpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBzdGFjawoJICAgICBhZGp1 c3RtZW50cyB3ZSdyZSBhYm91dCB0byBkbywgaG93ZXZlciB0byBwcmV2ZW50IHRoZSBvcHRpbWl6 ZXJzCgkgICAgIGZyb20gcmVtb3ZpbmcgdGhlIFIxMSBtb3ZlIGFuZCBsZWF2aW5nIHRoZSBDRkEg bm90ZSAod2hpY2ggd291bGQgYmUKCSAgICAgdmVyeSB3cm9uZykgd2UgdGllIHRoZSBvbGQgYW5k IG5ldyBzdGFjayBwb2ludGVyIHRvZ2V0aGVyLgoJICAgICBUaGUgdGllIHdpbGwgZXhwYW5kIHRv IG5vdGhpbmcgYnV0IHRoZSBvcHRpbWl6ZXJzIHdpbGwgbm90IHRvdWNoCgkgICAgIHRoZSBpbnN0 cnVjdGlvbi4gICovCgkgIHJ0eCBzdGFja19wdHJfY29weSA9IGdlbl9ydHhfUkVHIChQbW9kZSwg U1RBQ0tfQ0xBU0hfU1ZFX0NGQV9SRUdOVU0pOwoJICBlbWl0X21vdmVfaW5zbiAoc3RhY2tfcHRy X2NvcHksIHN0YWNrX3BvaW50ZXJfcnR4KTsKCSAgZW1pdF9pbnNuIChnZW5fc3RhY2tfdGllIChz dGFja19wdHJfY29weSwgc3RhY2tfcG9pbnRlcl9ydHgpKTsKCgkgIC8qIFdlIHdhbnQgdGhlIENG QSBpbmRlcGVuZGVudCBvZiB0aGUgc3RhY2sgcG9pbnRlciBmb3IgdGhlCgkgICAgIGR1cmF0aW9u IG9mIHRoZSBsb29wLiAgKi8KCSAgYWRkX3JlZ19ub3RlIChpbnNuLCBSRUdfQ0ZBX0RFRl9DRkEs IHN0YWNrX3B0cl9jb3B5KTsKCSAgUlRYX0ZSQU1FX1JFTEFURURfUCAoaW5zbikgPSAxOwoJfQoK ICAgICAgcnR4IHByb2JlX2NvbnN0ID0gZ2VuX2ludF9tb2RlIChtaW5fcHJvYmVfdGhyZXNob2xk LCBQbW9kZSk7CiAgICAgIHJ0eCBndWFyZF9jb25zdCA9IGdlbl9pbnRfbW9kZSAoZ3VhcmRfc2l6 ZSwgUG1vZGUpOwoKICAgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3Byb2JlX3N2ZV9zdGFja19j bGFzaCAoUG1vZGUsIHN0YWNrX3BvaW50ZXJfcnR4LAoJCQkJCQkgICBzdGFja19wb2ludGVyX3J0 eCwgdGVtcDEsCgkJCQkJCSAgIHByb2JlX2NvbnN0LCBndWFyZF9jb25zdCkpOwoKICAgICAgLyog Tm93IHJlc2V0IHRoZSBDRkEgcmVnaXN0ZXIgaWYgbmVlZGVkLiAgKi8KICAgICAgaWYgKGZyYW1l X3JlbGF0ZWRfcCkKCXsKCSAgYWRkX3JlZ19ub3RlIChpbnNuLCBSRUdfQ0ZBX0RFRl9DRkEsCgkJ CWdlbl9ydHhfUExVUyAoUG1vZGUsIHN0YWNrX3BvaW50ZXJfcnR4LAoJCQkJICAgICAgZ2VuX2lu dF9tb2RlIChwb2x5X3NpemUsIFBtb2RlKSkpOwoJICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNu KSA9IDE7Cgl9CgogICAgICByZXR1cm47CiAgICB9CgogIGlmIChkdW1wX2ZpbGUpCiAgICBmcHJp bnRmIChkdW1wX2ZpbGUsCgkgICAgICJTdGFjayBjbGFzaCBBQXJjaDY0IHByb2xvZ3VlOiAiIEhP U1RfV0lERV9JTlRfUFJJTlRfREVDCgkgICAgICIgYnl0ZXMsIHByb2Jpbmcgd2lsbCBiZSByZXF1 aXJlZC5cbiIsIHNpemUpOwoKICAvKiBSb3VuZCBzaXplIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxl IG9mIGd1YXJkX3NpemUsIGFuZCBjYWxjdWxhdGUgdGhlCiAgICAgcmVzaWR1YWwgYXMgdGhlIGRp ZmZlcmVuY2UgYmV0d2VlbiB0aGUgb3JpZ2luYWwgc2l6ZSBhbmQgdGhlIHJvdW5kZWQKICAgICBz aXplLiAgKi8KICBIT1NUX1dJREVfSU5UIHJvdW5kZWRfc2l6ZSA9IFJPVU5EX0RPV04gKHNpemUs IGd1YXJkX3NpemUpOwogIEhPU1RfV0lERV9JTlQgcmVzaWR1YWwgPSBzaXplIC0gcm91bmRlZF9z aXplOwoKICAvKiBXZSBjYW4gaGFuZGxlIGEgc21hbGwgbnVtYmVyIG9mIGFsbG9jYXRpb25zL3By b2JlcyBpbmxpbmUuICBPdGhlcndpc2UKICAgICBwdW50IHRvIGEgbG9vcC4gICovCiAgaWYgKHJv dW5kZWRfc2l6ZSA8PSBTVEFDS19DTEFTSF9NQVhfVU5ST0xMX1BBR0VTICogZ3VhcmRfc2l6ZSkK ICAgIHsKICAgICAgZm9yIChIT1NUX1dJREVfSU5UIGkgPSAwOyBpIDwgcm91bmRlZF9zaXplOyBp ICs9IGd1YXJkX3NpemUpCgl7CgkgIGFhcmNoNjRfc3ViX3NwIChOVUxMLCB0ZW1wMiwgZ3VhcmRf c2l6ZSwgdHJ1ZSk7CgkgIGVtaXRfc3RhY2tfcHJvYmUgKHBsdXNfY29uc3RhbnQgKFBtb2RlLCBz dGFja19wb2ludGVyX3J0eCwKCQkJCQkgICBndWFyZF91c2VkX2J5X2NhbGxlcikpOwoJICBlbWl0 X2luc24gKGdlbl9ibG9ja2FnZSAoKSk7Cgl9CiAgICAgIGR1bXBfc3RhY2tfY2xhc2hfZnJhbWVf aW5mbyAoUFJPQkVfSU5MSU5FLCBzaXplICE9IHJvdW5kZWRfc2l6ZSk7CiAgICB9CiAgZWxzZQog ICAgewogICAgICAvKiBDb21wdXRlIHRoZSBlbmRpbmcgYWRkcmVzcy4gICovCiAgICAgIGFhcmNo NjRfYWRkX29mZnNldCAoUG1vZGUsIHRlbXAxLCBzdGFja19wb2ludGVyX3J0eCwgLXJvdW5kZWRf c2l6ZSwKCQkJICB0ZW1wMSwgTlVMTCwgZmFsc2UsIHRydWUpOwogICAgICBydHhfaW5zbiAqaW5z biA9IGdldF9sYXN0X2luc24gKCk7CgogICAgICAvKiBGb3IgdGhlIGluaXRpYWwgYWxsb2NhdGlv biwgd2UgZG9uJ3QgaGF2ZSBhIGZyYW1lIHBvaW50ZXIKCSBzZXQgdXAsIHNvIHdlIGFsd2F5cyBu ZWVkIENGSSBub3Rlcy4gIElmIHdlJ3JlIGRvaW5nIHRoZQoJIGZpbmFsIGFsbG9jYXRpb24sIHRo ZW4gd2UgbWF5IGhhdmUgYSBmcmFtZSBwb2ludGVyLCBpbiB3aGljaAoJIGNhc2UgaXQgaXMgdGhl IENGQSwgb3RoZXJ3aXNlIHdlIG5lZWQgQ0ZJIG5vdGVzLgoKCSBXZSBjYW4gZGV0ZXJtaW5lIHdo aWNoIGFsbG9jYXRpb24gd2UgYXJlIGRvaW5nIGJ5IGxvb2tpbmcgYXQKCSB0aGUgdmFsdWUgb2Yg RlJBTUVfUkVMQVRFRF9QIHNpbmNlIHRoZSBmaW5hbCBhbGxvY2F0aW9ucyBhcmUgbm90CgkgZnJh bWUgcmVsYXRlZC4gICovCiAgICAgIGlmIChmcmFtZV9yZWxhdGVkX3ApCgl7CgkgIC8qIFdlIHdh bnQgdGhlIENGQSBpbmRlcGVuZGVudCBvZiB0aGUgc3RhY2sgcG9pbnRlciBmb3IgdGhlCgkgICAg IGR1cmF0aW9uIG9mIHRoZSBsb29wLiAgKi8KCSAgYWRkX3JlZ19ub3RlIChpbnNuLCBSRUdfQ0ZB X0RFRl9DRkEsCgkJCXBsdXNfY29uc3RhbnQgKFBtb2RlLCB0ZW1wMSwgcm91bmRlZF9zaXplKSk7 CgkgIFJUWF9GUkFNRV9SRUxBVEVEX1AgKGluc24pID0gMTsKCX0KCiAgICAgIC8qIFRoaXMgYWxs b2NhdGVzIGFuZCBwcm9iZXMgdGhlIHN0YWNrLiAgTm90ZSB0aGF0IHRoaXMgcmUtdXNlcyBzb21l IG9mCgkgdGhlIGV4aXN0aW5nIEFkYSBzdGFjayBwcm90ZWN0aW9uIGNvZGUuICBIb3dldmVyIHdl IGFyZSBndWFyYW50ZWVkIG5vdAoJIHRvIGVudGVyIHRoZSBub24gbG9vcCBvciByZXNpZHVhbCBi cmFuY2hlcyBvZiB0aGF0IGNvZGUuCgoJIFRoZSBub24tbG9vcCBwYXJ0IHdvbid0IGJlIGVudGVy ZWQgYmVjYXVzZSBpZiBvdXIgYWxsb2NhdGlvbiBhbW91bnQKCSBkb2Vzbid0IHJlcXVpcmUgYSBs b29wLCB0aGUgY2FzZSBhYm92ZSB3b3VsZCBoYW5kbGUgaXQuCgoJIFRoZSByZXNpZHVhbCBhbW91 bnQgd29uJ3QgYmUgZW50ZXJlZCBiZWNhdXNlIFRFTVAxIGlzIGEgbXV0bGlwbGUgb2YKCSB0aGUg YWxsb2NhdGlvbiBzaXplLiAgVGhlIHJlc2lkdWFsIHdpbGwgYWx3YXlzIGJlIDAuICBBcyBzdWNo LCB0aGUgb25seQoJIHBhcnQgd2UgYXJlIGFjdHVhbGx5IHVzaW5nIGZyb20gdGhhdCBjb2RlIGlz IHRoZSBsb29wIHNldHVwLiAgVGhlCgkgYWN0dWFsIHByb2JpbmcgaXMgZG9uZSBpbiBhYXJjaDY0 X291dHB1dF9wcm9iZV9zdGFja19yYW5nZS4gICovCiAgICAgIGluc24gPSBlbWl0X2luc24gKGdl bl9wcm9iZV9zdGFja19yYW5nZSAoc3RhY2tfcG9pbnRlcl9ydHgsCgkJCQkJICAgICAgIHN0YWNr X3BvaW50ZXJfcnR4LCB0ZW1wMSkpOwoKICAgICAgLyogTm93IHJlc2V0IHRoZSBDRkEgcmVnaXN0 ZXIgaWYgbmVlZGVkLiAgKi8KICAgICAgaWYgKGZyYW1lX3JlbGF0ZWRfcCkKCXsKCSAgYWRkX3Jl Z19ub3RlIChpbnNuLCBSRUdfQ0ZBX0RFRl9DRkEsCgkJCXBsdXNfY29uc3RhbnQgKFBtb2RlLCBz dGFja19wb2ludGVyX3J0eCwgcm91bmRlZF9zaXplKSk7CgkgIFJUWF9GUkFNRV9SRUxBVEVEX1Ag KGluc24pID0gMTsKCX0KCiAgICAgIGVtaXRfaW5zbiAoZ2VuX2Jsb2NrYWdlICgpKTsKICAgICAg ZHVtcF9zdGFja19jbGFzaF9mcmFtZV9pbmZvIChQUk9CRV9MT09QLCBzaXplICE9IHJvdW5kZWRf c2l6ZSk7CiAgICB9CgogIC8qIEhhbmRsZSBhbnkgcmVzaWR1YWxzLiAgUmVzaWR1YWxzIG9mIGF0 IGxlYXN0IE1JTl9QUk9CRV9USFJFU0hPTEQgaGF2ZSB0bwogICAgIGJlIHByb2JlZC4gIFRoaXMg bWFpbnRhaW5zIHRoZSByZXF1aXJlbWVudCB0aGF0IGVhY2ggcGFnZSBpcyBwcm9iZWQgYXQKICAg ICBsZWFzdCBvbmNlLiAgRm9yIGluaXRpYWwgcHJvYmluZyB3ZSBwcm9iZSBvbmx5IGlmIHRoZSBh bGxvY2F0aW9uIGlzCiAgICAgbW9yZSB0aGFuIEdVQVJEX1NJWkUgLSBidWZmZXIsIGFuZCBmb3Ig dGhlIG91dGdvaW5nIGFyZ3VtZW50cyB3ZSBwcm9iZQogICAgIGlmIHRoZSBhbW91bnQgaXMgbGFy Z2VyIHRoYW4gYnVmZmVyLiAgR1VBUkRfU0laRSAtIGJ1ZmZlciArIGJ1ZmZlciA9PQogICAgIEdV QVJEX1NJWkUuICBUaGlzIHdvcmtzIHRoYXQgZm9yIGFueSBhbGxvY2F0aW9uIHRoYXQgaXMgbGFy Z2UgZW5vdWdoIHRvCiAgICAgdHJpZ2dlciBhIHByb2JlIGhlcmUsIHdlJ2xsIGhhdmUgYXQgbGVh c3Qgb25lLCBhbmQgaWYgdGhleSdyZSBub3QgbGFyZ2UKICAgICBlbm91Z2ggZm9yIHRoaXMgY29k ZSB0byBlbWl0IGFueXRoaW5nIGZvciB0aGVtLCBUaGUgcGFnZSB3b3VsZCBoYXZlIGJlZW4KICAg ICBwcm9iZWQgYnkgdGhlIHNhdmluZyBvZiBGUC9MUiBlaXRoZXIgYnkgdGhpcyBmdW5jdGlvbiBv ciBhbnkgY2FsbGVlcy4gIElmCiAgICAgd2UgZG9uJ3QgaGF2ZSBhbnkgY2FsbGVlcyB0aGVuIHdl IHdvbid0IGhhdmUgbW9yZSBzdGFjayBhZGp1c3RtZW50cyBhbmQgc28KICAgICBhcmUgc3RpbGwg c2FmZS4gICovCiAgaWYgKHJlc2lkdWFsKQogICAgewogICAgICBIT1NUX1dJREVfSU5UIHJlc2lk dWFsX3Byb2JlX29mZnNldCA9IGd1YXJkX3VzZWRfYnlfY2FsbGVyOwogICAgICAvKiBJZiB3ZSdy ZSBkb2luZyBmaW5hbCBhZGp1c3RtZW50cywgYW5kIHdlJ3ZlIGRvbmUgYW55IGZ1bGwgcGFnZQoJ IGFsbG9jYXRpb25zIHRoZW4gYW55IHJlc2lkdWFsIG5lZWRzIHRvIGJlIHByb2JlZC4gICovCiAg ICAgIGlmIChmaW5hbF9hZGp1c3RtZW50X3AgJiYgcm91bmRlZF9zaXplICE9IDApCgltaW5fcHJv YmVfdGhyZXNob2xkID0gMDsKICAgICAgLyogSWYgZG9pbmcgYSBzbWFsbCBmaW5hbCBhZGp1c3Rt ZW50LCB3ZSBhbHdheXMgcHJvYmUgYXQgb2Zmc2V0IDAuCgkgVGhpcyBpcyBkb25lIHRvIGF2b2lk IGlzc3VlcyB3aGVuIExSIGlzIG5vdCBhdCBwb3NpdGlvbiAwIG9yIHdoZW4KCSB0aGUgZmluYWwg YWRqdXN0bWVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHByb2Jpbmcgb2Zmc2V0LiAgKi8KICAgICAg ZWxzZSBpZiAoZmluYWxfYWRqdXN0bWVudF9wICYmIHJvdW5kZWRfc2l6ZSA9PSAwKQoJcmVzaWR1 YWxfcHJvYmVfb2Zmc2V0ID0gMDsKCiAgICAgIGFhcmNoNjRfc3ViX3NwICh0ZW1wMSwgdGVtcDIs IHJlc2lkdWFsLCBmcmFtZV9yZWxhdGVkX3ApOwogICAgICBpZiAocmVzaWR1YWwgPj0gbWluX3By b2JlX3RocmVzaG9sZCkKCXsKCSAgaWYgKGR1bXBfZmlsZSkKCSAgICBmcHJpbnRmIChkdW1wX2Zp bGUsCgkJICAgICAiU3RhY2sgY2xhc2ggQUFyY2g2NCBwcm9sb2d1ZSByZXNpZHVhbHM6ICIKCQkg ICAgIEhPU1RfV0lERV9JTlRfUFJJTlRfREVDICIgYnl0ZXMsIHByb2Jpbmcgd2lsbCBiZSByZXF1 aXJlZC4iCgkJICAgICAiXG4iLCByZXNpZHVhbCk7CgoJICAgIGVtaXRfc3RhY2tfcHJvYmUgKHBs dXNfY29uc3RhbnQgKFBtb2RlLCBzdGFja19wb2ludGVyX3J0eCwKCQkJCQkgICAgIHJlc2lkdWFs X3Byb2JlX29mZnNldCkpOwoJICBlbWl0X2luc24gKGdlbl9ibG9ja2FnZSAoKSk7Cgl9CiAgICB9 Cn0KCi8qIFJldHVybiAxIGlmIHRoZSByZWdpc3RlciBpcyB1c2VkIGJ5IHRoZSBlcGlsb2d1ZS4g IFdlIG5lZWQgdG8gc2F5IHRoZQogICByZXR1cm4gcmVnaXN0ZXIgaXMgdXNlZCwgYnV0IG9ubHkg YWZ0ZXIgZXBpbG9ndWUgZ2VuZXJhdGlvbiBpcyBjb21wbGV0ZS4KICAgTm90ZSB0aGF0IGluIHRo ZSBjYXNlIG9mIHNpYmNhbGxzLCB0aGUgdmFsdWVzICJ1c2VkIGJ5IHRoZSBlcGlsb2d1ZSIgYXJl CiAgIGNvbnNpZGVyZWQgbGl2ZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGNhbGxlZCBmdW5jdGlvbi4K CiAgIEZvciBTSU1EIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHJldHVybiAxIGZvciBGUCByZWdpc3Rl cnMgdGhhdCBhcmUgc2F2ZWQgYW5kCiAgIHJlc3RvcmVkIGJ5IGEgZnVuY3Rpb24gYnV0IGFyZSBu b3QgemVybyBpbiBjYWxsX3VzZWRfcmVncy4gIElmIHdlIGRvIG5vdCBkbyAKICAgdGhpcyBvcHRp bWl6YXRpb25zIG1heSByZW1vdmUgdGhlIHJlc3RvcmUgb2YgdGhlIHJlZ2lzdGVyLiAgKi8KCmlu dAphYXJjaDY0X2VwaWxvZ3VlX3VzZXMgKGludCByZWdubykKewogIGlmIChlcGlsb2d1ZV9jb21w bGV0ZWQpCiAgICB7CiAgICAgIGlmIChyZWdubyA9PSBMUl9SRUdOVU0pCglyZXR1cm4gMTsKICAg IH0KICByZXR1cm4gMDsKfQoKLyogQUFyY2g2NCBzdGFjayBmcmFtZXMgZ2VuZXJhdGVkIGJ5IHRo aXMgY29tcGlsZXIgbG9vayBsaWtlOgoKCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t KwoJfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cgl8ICBpbmNvbWluZyBzdGFjayBh cmd1bWVudHMgICAgIHwKCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoJKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgl8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgPC0tIGluY29taW5nIHN0YWNrIHBvaW50ZXIgKGFsaWduZWQpCgl8ICBjYWxsZWUtYWxs b2NhdGVkIHNhdmUgYXJlYSAgIHwKCXwgIGZvciByZWdpc3RlciB2YXJhcmdzICAgICAgICAgfAoJ fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSsKCXwgIGxvY2FsIHZhcmlhYmxlcyAgICAgICAgICAgICAgfCA8LS0gZnJhbWVf cG9pbnRlcl9ydHgKCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoJKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgl8ICBwYWRkaW5nICAgICAgICAgICAgICAgICAgICAg IHwgXAoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8Cgl8ICBjYWxsZWUtc2F2 ZWQgcmVnaXN0ZXJzICAgICAgIHwgIHwgZnJhbWUuc2F2ZWRfcmVnc19zaXplCgkrLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwKCXwgIExSJyAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgfAoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8Cgl8ICBGUCcgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIHwKCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKyAgfDwtIGhhcmRfZnJhbWVfcG9pbnRlcl9ydHggKGFsaWduZWQpCgl8ICBTVkUgdmVjdG9y IHJlZ2lzdGVycyAgICAgICAgIHwgIHwgXAoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0rICB8ICB8IGJlbG93X2hhcmRfZnBfc2F2ZWRfcmVnc19zaXplCgl8ICBTVkUgcHJlZGljYXRl IHJlZ2lzdGVycyAgICAgIHwgLyAgLwoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r Cgl8ICBkeW5hbWljIGFsbG9jYXRpb24gICAgICAgICAgIHwKCSstLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tKwoJfCAgcGFkZGluZyAgICAgICAgICAgICAgICAgICAgICB8CgkrLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCXwgIG91dGdvaW5nIHN0YWNrIGFyZ3VtZW50cyAg ICAgfCA8LS0gYXJnX3BvaW50ZXIKICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwKCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDwtLSBzdGFja19wb2ludGVyX3J0eCAoYWxpZ25lZCkKCiAgIER5 bmFtaWMgc3RhY2sgYWxsb2NhdGlvbnMgdmlhIGFsbG9jYSgpIGRlY3JlYXNlIHN0YWNrX3BvaW50 ZXJfcnR4CiAgIGJ1dCBsZWF2ZSBmcmFtZV9wb2ludGVyX3J0eCBhbmQgaGFyZF9mcmFtZV9wb2lu dGVyX3J0eAogICB1bmNoYW5nZWQuCgogICBCeSBkZWZhdWx0IGZvciBzdGFjay1jbGFzaCB3ZSBh c3N1bWUgdGhlIGd1YXJkIGlzIGF0IGxlYXN0IDY0S0IsIGJ1dCB0aGlzCiAgIHZhbHVlIGlzIGNv bmZpZ3VyYWJsZSB0byBlaXRoZXIgNEtCIG9yIDY0S0IuICBXZSBhbHNvIGZvcmNlIHRoZSBndWFy ZCBzaXplIHRvCiAgIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9iaW5nIGludGVydmFsIGFuZCBib3Ro IHZhbHVlcyBhcmUga2VwdCBpbiBzeW5jLgoKICAgV2l0aCB0aG9zZSBhc3N1bXB0aW9ucyB0aGUg Y2FsbGVlIGNhbiBhbGxvY2F0ZSB1cCB0byA2M0tCIChvciAzS0IgZGVwZW5kaW5nCiAgIG9uIHRo ZSBndWFyZCBzaXplKSBvZiBzdGFjayBzcGFjZSB3aXRob3V0IHByb2JpbmcuCgogICBXaGVuIHBy b2JpbmcgaXMgbmVlZGVkLCB3ZSBlbWl0IGEgcHJvYmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9s b2d1ZQogICBhbmQgZXZlcnkgUEFSQU1fU1RBQ0tfQ0xBU0hfUFJPVEVDVElPTl9HVUFSRF9TSVpF IGJ5dGVzIHRoZXJlYWZ0ZXIuCgogICBXZSBoYXZlIHRvIHRyYWNrIGhvdyBtdWNoIHNwYWNlIGhh cyBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlIG9ubHkgc3RvcmVzCiAgIHRvIHRoZSBzdGFjayB3ZSB0 cmFjayBhcyBpbXBsaWNpdCBwcm9iZXMgYXJlIHRoZSBGUC9MUiBzdG9yZXMuCgogICBGb3Igb3V0 Z29pbmcgYXJndW1lbnRzIHdlIHByb2JlIGlmIHRoZSBzaXplIGlzIGxhcmdlciB0aGFuIDFLQiwg c3VjaCB0aGF0CiAgIHRoZSBBQkkgc3BlY2lmaWVkIGJ1ZmZlciBpcyBtYWludGFpbmVkIGZvciB0 aGUgbmV4dCBjYWxsZWUuCgogICBUaGUgZm9sbG93aW5nIHJlZ2lzdGVycyBhcmUgcmVzZXJ2ZWQg ZHVyaW5nIGZyYW1lIGxheW91dCBhbmQgc2hvdWxkIG5vdCBiZQogICB1c2VkIGZvciBhbnkgb3Ro ZXIgcHVycG9zZToKCiAgIC0gcjExOiBVc2VkIGJ5IHN0YWNrIGNsYXNoIHByb3RlY3Rpb24gd2hl biBTVkUgaXMgZW5hYmxlZCwgYW5kIGFsc28KCSAgYXMgYW4gYW5jaG9yIHJlZ2lzdGVyIHdoZW4g c2F2aW5nIGFuZCByZXN0b3JpbmcgcmVnaXN0ZXJzCiAgIC0gcjEyKEVQMCkgYW5kIHIxMyhFUDEp OiBVc2VkIGFzIHRlbXBvcmFyaWVzIGZvciBzdGFjayBhZGp1c3RtZW50LgogICAtIHIxNCBhbmQg cjE1OiBVc2VkIGZvciBzcGVjdWxhdGlvbiB0cmFja2luZy4KICAgLSByMTYoSVAwKSwgcjE3KElQ MSk6IFVzZWQgYnkgaW5kaXJlY3QgdGFpbGNhbGxzLgogICAtIHIzMChMUiksIHIyOShGUCk6IFVz ZWQgYnkgc3RhbmRhcmQgZnJhbWUgbGF5b3V0LgoKICAgVGhlc2UgcmVnaXN0ZXJzIG11c3QgYmUg YXZvaWRlZCBpbiBmcmFtZSBsYXlvdXQgcmVsYXRlZCBjb2RlIHVubGVzcyB0aGUKICAgZXhwbGlj aXQgaW50ZW50aW9uIGlzIHRvIGludGVyYWN0IHdpdGggb25lIG9mIHRoZSBmZWF0dXJlcyBsaXN0 ZWQgYWJvdmUuICAqLwoKLyogR2VuZXJhdGUgdGhlIHByb2xvZ3VlIGluc3RydWN0aW9ucyBmb3Ig ZW50cnkgaW50byBhIGZ1bmN0aW9uLgogICBFc3RhYmxpc2ggdGhlIHN0YWNrIGZyYW1lIGJ5IGRl Y3JlYXNpbmcgdGhlIHN0YWNrIHBvaW50ZXIgd2l0aCBhCiAgIHByb3Blcmx5IGNhbGN1bGF0ZWQg c2l6ZSBhbmQsIGlmIG5lY2Vzc2FyeSwgY3JlYXRlIGEgZnJhbWUgcmVjb3JkCiAgIGZpbGxlZCB3 aXRoIHRoZSB2YWx1ZXMgb2YgTFIgYW5kIHByZXZpb3VzIGZyYW1lIHBvaW50ZXIuICBUaGUKICAg Y3VycmVudCBGUCBpcyBhbHNvIHNldCB1cCBpZiBpdCBpcyBpbiB1c2UuICAqLwoKdm9pZAphYXJj aDY0X2V4cGFuZF9wcm9sb2d1ZSAodm9pZCkKewogIHBvbHlfaW50NjQgZnJhbWVfc2l6ZSA9IGNm dW4tPm1hY2hpbmUtPmZyYW1lLmZyYW1lX3NpemU7CiAgcG9seV9pbnQ2NCBpbml0aWFsX2FkanVz dCA9IGNmdW4tPm1hY2hpbmUtPmZyYW1lLmluaXRpYWxfYWRqdXN0OwogIEhPU1RfV0lERV9JTlQg Y2FsbGVlX2FkanVzdCA9IGNmdW4tPm1hY2hpbmUtPmZyYW1lLmNhbGxlZV9hZGp1c3Q7CiAgcG9s eV9pbnQ2NCBmaW5hbF9hZGp1c3QgPSBjZnVuLT5tYWNoaW5lLT5mcmFtZS5maW5hbF9hZGp1c3Q7 CiAgcG9seV9pbnQ2NCBjYWxsZWVfb2Zmc2V0ID0gY2Z1bi0+bWFjaGluZS0+ZnJhbWUuY2FsbGVl X29mZnNldDsKICBwb2x5X2ludDY0IHN2ZV9jYWxsZWVfYWRqdXN0ID0gY2Z1bi0+bWFjaGluZS0+ ZnJhbWUuc3ZlX2NhbGxlZV9hZGp1c3Q7CiAgcG9seV9pbnQ2NCBiZWxvd19oYXJkX2ZwX3NhdmVk X3JlZ3Nfc2l6ZQogICAgPSBjZnVuLT5tYWNoaW5lLT5mcmFtZS5iZWxvd19oYXJkX2ZwX3NhdmVk X3JlZ3Nfc2l6ZTsKICB1bnNpZ25lZCByZWcxID0gY2Z1bi0+bWFjaGluZS0+ZnJhbWUud2JfcHVz aF9jYW5kaWRhdGUxOwogIHVuc2lnbmVkIHJlZzIgPSBjZnVuLT5tYWNoaW5lLT5mcmFtZS53Yl9w dXNoX2NhbmRpZGF0ZTI7CiAgYm9vbCBlbWl0X2ZyYW1lX2NoYWluID0gY2Z1bi0+bWFjaGluZS0+ ZnJhbWUuZW1pdF9mcmFtZV9jaGFpbjsKICBydHhfaW5zbiAqaW5zbjsKCiAgaWYgKGZsYWdfc3Rh Y2tfY2xhc2hfcHJvdGVjdGlvbiAmJiBrbm93bl9lcSAoY2FsbGVlX2FkanVzdCwgMCkpCiAgICB7 CiAgICAgIC8qIEZvbGQgdGhlIFNWRSBhbGxvY2F0aW9uIGludG8gdGhlIGluaXRpYWwgYWxsb2Nh dGlvbi4KCSBXZSBkb24ndCBkbyB0aGlzIGluIGFhcmNoNjRfbGF5b3V0X2FyZyB0byBhdm9pZCBw ZXNzaW1pemluZwoJIHRoZSBlcGlsb2d1ZSBjb2RlLiAgKi8KICAgICAgaW5pdGlhbF9hZGp1c3Qg Kz0gc3ZlX2NhbGxlZV9hZGp1c3Q7CiAgICAgIHN2ZV9jYWxsZWVfYWRqdXN0ID0gMDsKICAgIH0K CiAgLyogU2lnbiByZXR1cm4gYWRkcmVzcyBmb3IgZnVuY3Rpb25zLiAgKi8KICBpZiAoYWFyY2g2 NF9yZXR1cm5fYWRkcmVzc19zaWduaW5nX2VuYWJsZWQgKCkpCiAgICB7CiAgICAgIHN3aXRjaCAo YWFyY2hfcmFfc2lnbl9rZXkpCgl7CgkgIGNhc2UgQUFSQ0hfS0VZX0E6CgkgICAgaW5zbiA9IGVt aXRfaW5zbiAoZ2VuX3BhY2lhc3AgKCkpOwoJICAgIGJyZWFrOwoJICBjYXNlIEFBUkNIX0tFWV9C OgoJICAgIGluc24gPSBlbWl0X2luc24gKGdlbl9wYWNpYnNwICgpKTsKCSAgICBicmVhazsKCSAg ZGVmYXVsdDoKCSAgICBnY2NfdW5yZWFjaGFibGUgKCk7Cgl9CiAgICAgIGFkZF9yZWdfbm90ZSAo aW5zbiwgUkVHX0NGQV9UT0dHTEVfUkFfTUFOR0xFLCBjb25zdDBfcnR4KTsKICAgICAgUlRYX0ZS QU1FX1JFTEFURURfUCAoaW5zbikgPSAxOwogICAgfQoKICAvKiBQdXNoIHJldHVybiBhZGRyZXNz IHRvIHNoYWRvdyBjYWxsIHN0YWNrLiAgKi8KICBpZiAoY2Z1bi0+bWFjaGluZS0+ZnJhbWUuaXNf c2NzX2VuYWJsZWQpCiAgICBlbWl0X2luc24gKGdlbl9zY3NfcHVzaCAoKSk7CgogIGlmIChmbGFn X3N0YWNrX3VzYWdlX2luZm8pCiAgICBjdXJyZW50X2Z1bmN0aW9uX3N0YXRpY19zdGFja19zaXpl ID0gY29uc3RhbnRfbG93ZXJfYm91bmQgKGZyYW1lX3NpemUpOwoKICBpZiAoZmxhZ19zdGFja19j aGVjayA9PSBTVEFUSUNfQlVJTFRJTl9TVEFDS19DSEVDSykKICAgIHsKICAgICAgaWYgKGNydGwt PmlzX2xlYWYgJiYgIWNmdW4tPmNhbGxzX2FsbG9jYSkKCXsKCSAgaWYgKG1heWJlX2d0IChmcmFt ZV9zaXplLCBQUk9CRV9JTlRFUlZBTCkKCSAgICAgICYmIG1heWJlX2d0IChmcmFtZV9zaXplLCBn ZXRfc3RhY2tfY2hlY2tfcHJvdGVjdCAoKSkpCgkgICAgYWFyY2g2NF9lbWl0X3Byb2JlX3N0YWNr X3JhbmdlIChnZXRfc3RhY2tfY2hlY2tfcHJvdGVjdCAoKSwKCQkJCQkgICAgKGZyYW1lX3NpemUK CQkJCQkgICAgIC0gZ2V0X3N0YWNrX2NoZWNrX3Byb3RlY3QgKCkpKTsKCX0KICAgICAgZWxzZSBp ZiAobWF5YmVfZ3QgKGZyYW1lX3NpemUsIDApKQoJYWFyY2g2NF9lbWl0X3Byb2JlX3N0YWNrX3Jh bmdlIChnZXRfc3RhY2tfY2hlY2tfcHJvdGVjdCAoKSwgZnJhbWVfc2l6ZSk7CiAgICB9CgogIHJ0 eCB0bXAwX3J0eCA9IGdlbl9ydHhfUkVHIChQbW9kZSwgRVAwX1JFR05VTSk7CiAgcnR4IHRtcDFf cnR4ID0gZ2VuX3J0eF9SRUcgKFBtb2RlLCBFUDFfUkVHTlVNKTsKCiAgLyogSW4gdGhlb3J5IHdl IHNob3VsZCBuZXZlciBoYXZlIGJvdGggYW4gaW5pdGlhbCBhZGp1c3RtZW50CiAgICAgYW5kIGEg Y2FsbGVlIHNhdmUgYWRqdXN0bWVudC4gIFZlcmlmeSB0aGF0IGlzIHRoZSBjYXNlIHNpbmNlIHRo ZQogICAgIGNvZGUgYmVsb3cgZG9lcyBub3QgaGFuZGxlIGl0IGZvciAtZnN0YWNrLWNsYXNoLXBy b3RlY3Rpb24uICAqLwogIGdjY19hc3NlcnQgKGtub3duX2VxIChpbml0aWFsX2FkanVzdCwgMCkg fHwgY2FsbGVlX2FkanVzdCA9PSAwKTsKCiAgLyogV2lsbCBvbmx5IHByb2JlIGlmIHRoZSBpbml0 aWFsIGFkanVzdG1lbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGd1YXJkCiAgICAgbGVzcyB0aGUgYW1v dW50IG9mIHRoZSBndWFyZCByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBjYWxsZXIncwogICAgIG91 dGdvaW5nIGFyZ3MuICAqLwogIGFhcmNoNjRfYWxsb2NhdGVfYW5kX3Byb2JlX3N0YWNrX3NwYWNl ICh0bXAwX3J0eCwgdG1wMV9ydHgsIGluaXRpYWxfYWRqdXN0LAoJCQkJCSAgdHJ1ZSwgZmFsc2Up OwoKICBpZiAoY2FsbGVlX2FkanVzdCAhPSAwKQogICAgYWFyY2g2NF9wdXNoX3JlZ3MgKHJlZzEs IHJlZzIsIGNhbGxlZV9hZGp1c3QpOwoKICAvKiBUaGUgb2Zmc2V0IG9mIHRoZSBmcmFtZSBjaGFp biByZWNvcmQgKGlmIGFueSkgZnJvbSB0aGUgY3VycmVudCBTUC4gICovCiAgcG9seV9pbnQ2NCBj aGFpbl9vZmZzZXQgPSAoaW5pdGlhbF9hZGp1c3QgKyBjYWxsZWVfYWRqdXN0CgkJCSAgICAgLSBj ZnVuLT5tYWNoaW5lLT5mcmFtZS5oYXJkX2ZwX29mZnNldCk7CiAgZ2NjX2Fzc2VydCAoa25vd25f Z2UgKGNoYWluX29mZnNldCwgMCkpOwoKICAvKiBUaGUgb2Zmc2V0IG9mIHRoZSBib3R0b20gb2Yg dGhlIHNhdmUgYXJlYSBmcm9tIHRoZSBjdXJyZW50IFNQLiAgKi8KICBwb2x5X2ludDY0IHNhdmVk X3JlZ3Nfb2Zmc2V0ID0gY2hhaW5fb2Zmc2V0IC0gYmVsb3dfaGFyZF9mcF9zYXZlZF9yZWdzX3Np emU7CgogIGlmIChlbWl0X2ZyYW1lX2NoYWluKQogICAgewogICAgICBpZiAoY2FsbGVlX2FkanVz dCA9PSAwKQoJewoJICByZWcxID0gUjI5X1JFR05VTTsKCSAgcmVnMiA9IFIzMF9SRUdOVU07Cgkg IGFhcmNoNjRfc2F2ZV9jYWxsZWVfc2F2ZXMgKHNhdmVkX3JlZ3Nfb2Zmc2V0LCByZWcxLCByZWcy LAoJCQkJICAgICBmYWxzZSwgZmFsc2UpOwoJfQogICAgICBlbHNlCglnY2NfYXNzZXJ0IChrbm93 bl9lcSAoY2hhaW5fb2Zmc2V0LCAwKSk7CiAgICAgIGFhcmNoNjRfYWRkX29mZnNldCAoUG1vZGUs IGhhcmRfZnJhbWVfcG9pbnRlcl9ydHgsCgkJCSAgc3RhY2tfcG9pbnRlcl9ydHgsIGNoYWluX29m ZnNldCwKCQkJICB0bXAxX3J0eCwgdG1wMF9ydHgsIGZyYW1lX3BvaW50ZXJfbmVlZGVkKTsKICAg ICAgaWYgKGZyYW1lX3BvaW50ZXJfbmVlZGVkICYmICFmcmFtZV9zaXplLmlzX2NvbnN0YW50ICgp KQoJewoJICAvKiBWYXJpYWJsZS1zaXplZCBmcmFtZXMgbmVlZCB0byBkZXNjcmliZSB0aGUgc2F2 ZSBzbG90CgkgICAgIGFkZHJlc3MgdXNpbmcgRFdfQ0ZBX2V4cHJlc3Npb24gcmF0aGVyIHRoYW4g RFdfQ0ZBX29mZnNldC4KCSAgICAgVGhpcyBtZWFucyB0aGF0LCB3aXRob3V0IHRha2luZyBmdXJ0 aGVyIGFjdGlvbiwgdGhlCgkgICAgIGxvY2F0aW9ucyBvZiB0aGUgcmVnaXN0ZXJzIHRoYXQgd2Un dmUgYWxyZWFkeSBzYXZlZCB3b3VsZAoJICAgICByZW1haW4gYmFzZWQgb24gdGhlIHN0YWNrIHBv aW50ZXIgZXZlbiBhZnRlciB3ZSByZWRlZmluZQoJICAgICB0aGUgQ0ZBIGJhc2VkIG9uIHRoZSBm cmFtZSBwb2ludGVyLiAgV2UgdGhlcmVmb3JlIG5lZWQgbmV3CgkgICAgIERXX0NGQV9leHByZXNz aW9ucyB0byByZS1leHByZXNzIHRoZSBzYXZlIHNsb3RzIHdpdGggYWRkcmVzc2VzCgkgICAgIGJh c2VkIG9uIHRoZSBmcmFtZSBwb2ludGVyLiAgKi8KCSAgcnR4X2luc24gKmluc24gPSBnZXRfbGFz dF9pbnNuICgpOwoJICBnY2NfYXNzZXJ0IChSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSk7CgoJ ICAvKiBBZGQgYW4gZXhwbGljaXQgQ0ZBIGRlZmluaXRpb24gaWYgdGhpcyB3YXMgcHJldmlvdXNs eQoJICAgICBpbXBsaWNpdC4gICovCgkgIGlmICghZmluZF9yZWdfbm90ZSAoaW5zbiwgUkVHX0NG QV9BREpVU1RfQ0ZBLCBOVUxMX1JUWCkpCgkgICAgewoJICAgICAgcnR4IHNyYyA9IHBsdXNfY29u c3RhbnQgKFBtb2RlLCBzdGFja19wb2ludGVyX3J0eCwKCQkJCSAgICAgICBjYWxsZWVfb2Zmc2V0 KTsKCSAgICAgIGFkZF9yZWdfbm90ZSAoaW5zbiwgUkVHX0NGQV9BREpVU1RfQ0ZBLAoJCQkgICAg Z2VuX3J0eF9TRVQgKGhhcmRfZnJhbWVfcG9pbnRlcl9ydHgsIHNyYykpOwoJICAgIH0KCgkgIC8q IENoYW5nZSB0aGUgc2F2ZSBzbG90IGV4cHJlc3Npb25zIGZvciB0aGUgcmVnaXN0ZXJzIHRoYXQK CSAgICAgd2UndmUgYWxyZWFkeSBzYXZlZC4gICovCgkgIGFhcmNoNjRfYWRkX2NmYV9leHByZXNz aW9uIChpbnNuLCByZWdub19yZWdfcnR4W3JlZzJdLAoJCQkJICAgICAgaGFyZF9mcmFtZV9wb2lu dGVyX3J0eCwgVU5JVFNfUEVSX1dPUkQpOwoJICBhYXJjaDY0X2FkZF9jZmFfZXhwcmVzc2lvbiAo aW5zbiwgcmVnbm9fcmVnX3J0eFtyZWcxXSwKCQkJCSAgICAgIGhhcmRfZnJhbWVfcG9pbnRlcl9y dHgsIDApOwoJfQogICAgICBlbWl0X2luc24gKGdlbl9zdGFja190aWUgKHN0YWNrX3BvaW50ZXJf cnR4LCBoYXJkX2ZyYW1lX3BvaW50ZXJfcnR4KSk7CiAgICB9CgogIGFhcmNoNjRfc2F2ZV9jYWxs ZWVfc2F2ZXMgKHNhdmVkX3JlZ3Nfb2Zmc2V0LCBSMF9SRUdOVU0sIFIzMF9SRUdOVU0sCgkJCSAg ICAgY2FsbGVlX2FkanVzdCAhPSAwIHx8IGVtaXRfZnJhbWVfY2hhaW4sCgkJCSAgICAgZW1pdF9m cmFtZV9jaGFpbik7CiAgaWYgKG1heWJlX25lIChzdmVfY2FsbGVlX2FkanVzdCwgMCkpCiAgICB7 CiAgICAgIGdjY19hc3NlcnQgKCFmbGFnX3N0YWNrX2NsYXNoX3Byb3RlY3Rpb24KCQkgIHx8IGtu b3duX2VxIChpbml0aWFsX2FkanVzdCwgMCkpOwogICAgICBhYXJjaDY0X2FsbG9jYXRlX2FuZF9w cm9iZV9zdGFja19zcGFjZSAodG1wMV9ydHgsIHRtcDBfcnR4LAoJCQkJCSAgICAgIHN2ZV9jYWxs ZWVfYWRqdXN0LAoJCQkJCSAgICAgICFmcmFtZV9wb2ludGVyX25lZWRlZCwgZmFsc2UpOwogICAg ICBzYXZlZF9yZWdzX29mZnNldCArPSBzdmVfY2FsbGVlX2FkanVzdDsKICAgIH0KICBhYXJjaDY0 X3NhdmVfY2FsbGVlX3NhdmVzIChzYXZlZF9yZWdzX29mZnNldCwgUDBfUkVHTlVNLCBQMTVfUkVH TlVNLAoJCQkgICAgIGZhbHNlLCBlbWl0X2ZyYW1lX2NoYWluKTsKICBhYXJjaDY0X3NhdmVfY2Fs bGVlX3NhdmVzIChzYXZlZF9yZWdzX29mZnNldCwgVjBfUkVHTlVNLCBWMzFfUkVHTlVNLAoJCQkg ICAgIGNhbGxlZV9hZGp1c3QgIT0gMCB8fCBlbWl0X2ZyYW1lX2NoYWluLAoJCQkgICAgIGVtaXRf ZnJhbWVfY2hhaW4pOwoKICAvKiBXZSBtYXkgbmVlZCB0byBwcm9iZSB0aGUgZmluYWwgYWRqdXN0 bWVudCBpZiBpdCBpcyBsYXJnZXIgdGhhbiB0aGUgZ3VhcmQKICAgICB0aGF0IGlzIGFzc3VtZWQg YnkgdGhlIGNhbGxlZC4gICovCiAgYWFyY2g2NF9hbGxvY2F0ZV9hbmRfcHJvYmVfc3RhY2tfc3Bh Y2UgKHRtcDFfcnR4LCB0bXAwX3J0eCwgZmluYWxfYWRqdXN0LAoJCQkJCSAgIWZyYW1lX3BvaW50 ZXJfbmVlZGVkLCB0cnVlKTsKfQoKLyogUmV0dXJuIFRSVUUgaWYgd2UgY2FuIHVzZSBhIHNpbXBs ZV9yZXR1cm4gaW5zbi4KCiAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxl ZSBzYXZlZCBzdGFjayBpcyBlbXB0eSwgd2hpY2gKICAgbWVhbnMgbm8gcmVzdG9yZSBhY3Rpb25z IGFyZSBuZWVkLiBUaGUgcHJvX2FuZF9lcGlsb2d1ZSB3aWxsIHVzZQogICB0aGlzIHRvIGNoZWNr IHdoZXRoZXIgc2hyaW5rLXdyYXBwaW5nIG9wdCBpcyBmZWFzaWJsZS4gICovCgpib29sCmFhcmNo NjRfdXNlX3JldHVybl9pbnNuX3AgKHZvaWQpCnsKICBpZiAoIXJlbG9hZF9jb21wbGV0ZWQpCiAg ICByZXR1cm4gZmFsc2U7CgogIGlmIChjcnRsLT5wcm9maWxlKQogICAgcmV0dXJuIGZhbHNlOwoK ICByZXR1cm4ga25vd25fZXEgKGNmdW4tPm1hY2hpbmUtPmZyYW1lLmZyYW1lX3NpemUsIDApOwp9 CgovKiBHZW5lcmF0ZSB0aGUgZXBpbG9ndWUgaW5zdHJ1Y3Rpb25zIGZvciByZXR1cm5pbmcgZnJv bSBhIGZ1bmN0aW9uLgogICBUaGlzIGlzIGFsbW9zdCBleGFjdGx5IHRoZSByZXZlcnNlIG9mIHRo ZSBwcm9sb2cgc2VxdWVuY2UsIGV4Y2VwdAogICB0aGF0IHdlIG5lZWQgdG8gaW5zZXJ0IGJhcnJp ZXJzIHRvIGF2b2lkIHNjaGVkdWxpbmcgbG9hZHMgdGhhdCByZWFkCiAgIGZyb20gYSBkZWFsbG9j YXRlZCBzdGFjaywgYW5kIHdlIG9wdGltaXplIHRoZSB1bndpbmQgcmVjb3JkcyBieQogICBlbWl0 dGluZyB0aGVtIGFsbCB0b2dldGhlciBpZiBwb3NzaWJsZS4gICovCnZvaWQKYWFyY2g2NF9leHBh bmRfZXBpbG9ndWUgKGJvb2wgZm9yX3NpYmNhbGwpCnsKICBwb2x5X2ludDY0IGluaXRpYWxfYWRq dXN0ID0gY2Z1bi0+bWFjaGluZS0+ZnJhbWUuaW5pdGlhbF9hZGp1c3Q7CiAgSE9TVF9XSURFX0lO VCBjYWxsZWVfYWRqdXN0ID0gY2Z1bi0+bWFjaGluZS0+ZnJhbWUuY2FsbGVlX2FkanVzdDsKICBw b2x5X2ludDY0IGZpbmFsX2FkanVzdCA9IGNmdW4tPm1hY2hpbmUtPmZyYW1lLmZpbmFsX2FkanVz dDsKICBwb2x5X2ludDY0IGNhbGxlZV9vZmZzZXQgPSBjZnVuLT5tYWNoaW5lLT5mcmFtZS5jYWxs ZWVfb2Zmc2V0OwogIHBvbHlfaW50NjQgc3ZlX2NhbGxlZV9hZGp1c3QgPSBjZnVuLT5tYWNoaW5l LT5mcmFtZS5zdmVfY2FsbGVlX2FkanVzdDsKICBwb2x5X2ludDY0IGJlbG93X2hhcmRfZnBfc2F2 ZWRfcmVnc19zaXplCiAgICA9IGNmdW4tPm1hY2hpbmUtPmZyYW1lLmJlbG93X2hhcmRfZnBfc2F2 ZWRfcmVnc19zaXplOwogIHVuc2lnbmVkIHJlZzEgPSBjZnVuLT5tYWNoaW5lLT5mcmFtZS53Yl9w b3BfY2FuZGlkYXRlMTsKICB1bnNpZ25lZCByZWcyID0gY2Z1bi0+bWFjaGluZS0+ZnJhbWUud2Jf cG9wX2NhbmRpZGF0ZTI7CiAgdW5zaWduZWQgaW50IGxhc3RfZ3ByID0gKGNmdW4tPm1hY2hpbmUt PmZyYW1lLmlzX3Njc19lbmFibGVkCgkJCSAgID8gUjI5X1JFR05VTSA6IFIzMF9SRUdOVU0pOwog IHJ0eCBjZmlfb3BzID0gTlVMTDsKICBydHhfaW5zbiAqaW5zbjsKICAvKiBBIHN0YWNrIGNsYXNo IHByb3RlY3Rpb24gcHJvbG9ndWUgbWF5IG5vdCBoYXZlIGxlZnQgRVAwX1JFR05VTSBvcgogICAg IEVQMV9SRUdOVU0gaW4gYSB1c2FibGUgc3RhdGUuICBUaGUgc2FtZSBpcyB0cnVlIGZvciBhbGxv Y2F0aW9ucwogICAgIHdpdGggYW4gU1ZFIGNvbXBvbmVudCwgc2luY2Ugd2UgdGhlbiBuZWVkIGJv dGggdGVtcG9yYXJ5IHJlZ2lzdGVycwogICAgIGZvciBlYWNoIGFsbG9jYXRpb24uICBGb3Igc3Rh Y2sgY2xhc2ggd2UgYXJlIGluIGEgdXNhYmxlIHN0YXRlIGlmCiAgICAgdGhlIGFkanVzdG1lbnQg aXMgbGVzcyB0aGFuIEdVQVJEX1NJWkUgLSBHVUFSRF9VU0VEX0JZX0NBTExFUi4gICovCiAgSE9T VF9XSURFX0lOVCBndWFyZF9zaXplCiAgICA9IDEgPDwgcGFyYW1fc3RhY2tfY2xhc2hfcHJvdGVj dGlvbl9ndWFyZF9zaXplOwogIEhPU1RfV0lERV9JTlQgZ3VhcmRfdXNlZF9ieV9jYWxsZXIgPSBT VEFDS19DTEFTSF9DQUxMRVJfR1VBUkQ7CgogIC8qIFdlIGNhbiByZS11c2UgdGhlIHJlZ2lzdGVy cyB3aGVuOgoKICAgICAoYSkgdGhlIGRlYWxsb2NhdGlvbiBhbW91bnQgaXMgdGhlIHNhbWUgYXMg dGhlIGNvcnJlc3BvbmRpbmcKCSBhbGxvY2F0aW9uIGFtb3VudCAod2hpY2ggaXMgZmFsc2UgaWYg d2UgY29tYmluZSB0aGUgaW5pdGlhbAoJIGFuZCBTVkUgY2FsbGVlIHNhdmUgYWxsb2NhdGlvbnMg aW4gdGhlIHByb2xvZ3VlKTsgYW5kCgogICAgIChiKSB0aGUgYWxsb2NhdGlvbiBhbW91bnQgZG9l c24ndCBuZWVkIGEgcHJvYmUgKHdoaWNoIGlzIGZhbHNlCgkgaWYgdGhlIGFtb3VudCBpcyBndWFy ZF9zaXplIC0gZ3VhcmRfdXNlZF9ieV9jYWxsZXIgb3IgZ3JlYXRlcikuCgogICAgIEluIHN1Y2gg c2l0dWF0aW9ucyB0aGUgcmVnaXN0ZXIgc2hvdWxkIHJlbWFpbiBsaXZlIHdpdGggdGhlIGNvcnJl Y3QKICAgICB2YWx1ZS4gICovCiAgYm9vbCBjYW5faW5oZXJpdF9wID0gKGluaXRpYWxfYWRqdXN0 LmlzX2NvbnN0YW50ICgpCgkJCSYmIGZpbmFsX2FkanVzdC5pc19jb25zdGFudCAoKQoJCQkmJiAo IWZsYWdfc3RhY2tfY2xhc2hfcHJvdGVjdGlvbgoJCQkgICAgfHwgKGtub3duX2x0IChpbml0aWFs X2FkanVzdCwKCQkJCQkgIGd1YXJkX3NpemUgLSBndWFyZF91c2VkX2J5X2NhbGxlcikKCQkJCSYm IGtub3duX2VxIChzdmVfY2FsbGVlX2FkanVzdCwgMCkpKSk7CgogIC8qIFdlIG5lZWQgdG8gYWRk IG1lbW9yeSBiYXJyaWVyIHRvIHByZXZlbnQgcmVhZCBmcm9tIGRlYWxsb2NhdGVkIHN0YWNrLiAg Ki8KICBib29sIG5lZWRfYmFycmllcl9wCiAgICA9IG1heWJlX25lIChnZXRfZnJhbWVfc2l6ZSAo KQoJCSsgY2Z1bi0+bWFjaGluZS0+ZnJhbWUuc2F2ZWRfdmFyYXJnc19zaXplLCAwKTsKCiAgLyog RW1pdCBhIGJhcnJpZXIgdG8gcHJldmVudCBsb2FkcyBmcm9tIGEgZGVhbGxvY2F0ZWQgc3RhY2su ICAqLwogIGlmIChtYXliZV9ndCAoZmluYWxfYWRqdXN0LCBjcnRsLT5vdXRnb2luZ19hcmdzX3Np emUpCiAgICAgIHx8IGNmdW4tPmNhbGxzX2FsbG9jYQogICAgICB8fCBjcnRsLT5jYWxsc19laF9y ZXR1cm4pCiAgICB7CiAgICAgIGVtaXRfaW5zbiAoZ2VuX3N0YWNrX3RpZSAoc3RhY2tfcG9pbnRl cl9ydHgsIHN0YWNrX3BvaW50ZXJfcnR4KSk7CiAgICAgIG5lZWRfYmFycmllcl9wID0gZmFsc2U7 CiAgICB9CgogIC8qIFJlc3RvcmUgdGhlIHN0YWNrIHBvaW50ZXIgZnJvbSB0aGUgZnJhbWUgcG9p bnRlciBpZiBpdCBtYXkgbm90CiAgICAgYmUgdGhlIHNhbWUgYXMgdGhlIHN0YWNrIHBvaW50ZXIu ICAqLwogIHJ0eCB0bXAwX3J0eCA9IGdlbl9ydHhfUkVHIChQbW9kZSwgRVAwX1JFR05VTSk7CiAg cnR4IHRtcDFfcnR4ID0gZ2VuX3J0eF9SRUcgKFBtb2RlLCBFUDFfUkVHTlVNKTsKICBpZiAoZnJh bWVfcG9pbnRlcl9uZWVkZWQKICAgICAgJiYgKG1heWJlX25lIChmaW5hbF9hZGp1c3QsIDApIHx8 IGNmdW4tPmNhbGxzX2FsbG9jYSkpCiAgICAvKiBJZiB3cml0ZWJhY2sgaXMgdXNlZCB3aGVuIHJl c3RvcmluZyBjYWxsZWUtc2F2ZXMsIHRoZSBDRkEKICAgICAgIGlzIHJlc3RvcmVkIG9uIHRoZSBp bnN0cnVjdGlvbiBkb2luZyB0aGUgd3JpdGViYWNrLiAgKi8KICAgIGFhcmNoNjRfYWRkX29mZnNl dCAoUG1vZGUsIHN0YWNrX3BvaW50ZXJfcnR4LAoJCQloYXJkX2ZyYW1lX3BvaW50ZXJfcnR4LAoJ CQktY2FsbGVlX29mZnNldCAtIGJlbG93X2hhcmRfZnBfc2F2ZWRfcmVnc19zaXplLAoJCQl0bXAx X3J0eCwgdG1wMF9ydHgsIGNhbGxlZV9hZGp1c3QgPT0gMCk7CiAgZWxzZQogICAgIC8qIFRoZSBj YXNlIHdoZXJlIHdlIG5lZWQgdG8gcmUtdXNlIHRoZSByZWdpc3RlciBoZXJlIGlzIHZlcnkgcmFy ZSwgc28KCWF2b2lkIHRoZSBjb21wbGljYXRlZCBjb25kaXRpb24gYW5kIGp1c3QgYWx3YXlzIGVt aXQgYSBtb3ZlIGlmIHRoZQoJaW1tZWRpYXRlIGRvZXNuJ3QgZml0LiAgKi8KICAgICBhYXJjaDY0 X2FkZF9zcCAodG1wMV9ydHgsIHRtcDBfcnR4LCBmaW5hbF9hZGp1c3QsIHRydWUpOwoKICAvKiBS ZXN0b3JlIHRoZSB2ZWN0b3IgcmVnaXN0ZXJzIGJlZm9yZSB0aGUgcHJlZGljYXRlIHJlZ2lzdGVy cywKICAgICBzbyB0aGF0IHdlIGNhbiB1c2UgUDQgYXMgYSB0ZW1wb3JhcnkgZm9yIGJpZy1lbmRp YW4gU1ZFIGZyYW1lcy4gICovCiAgYWFyY2g2NF9yZXN0b3JlX2NhbGxlZV9zYXZlcyAoY2FsbGVl X29mZnNldCwgVjBfUkVHTlVNLCBWMzFfUkVHTlVNLAoJCQkJY2FsbGVlX2FkanVzdCAhPSAwLCAm Y2ZpX29wcyk7CiAgYWFyY2g2NF9yZXN0b3JlX2NhbGxlZV9zYXZlcyAoY2FsbGVlX29mZnNldCwg UDBfUkVHTlVNLCBQMTVfUkVHTlVNLAoJCQkJZmFsc2UsICZjZmlfb3BzKTsKICBpZiAobWF5YmVf bmUgKHN2ZV9jYWxsZWVfYWRqdXN0LCAwKSkKICAgIGFhcmNoNjRfYWRkX3NwIChOVUxMX1JUWCwg TlVMTF9SVFgsIHN2ZV9jYWxsZWVfYWRqdXN0LCB0cnVlKTsKCiAgLyogV2hlbiBzaGFkb3cgY2Fs bCBzdGFjayBpcyBlbmFibGVkLCB0aGUgc2NzX3BvcCBpbiB0aGUgZXBpbG9ndWUgd2lsbAogICAg IHJlc3RvcmUgeDMwLCB3ZSBkb24ndCBuZWVkIHRvIHJlc3RvcmUgeDMwIGFnYWluIGluIHRoZSB0 cmFkaXRpb25hbAogICAgIHdheS4gICovCiAgYWFyY2g2NF9yZXN0b3JlX2NhbGxlZV9zYXZlcyAo Y2FsbGVlX29mZnNldCAtIHN2ZV9jYWxsZWVfYWRqdXN0LAoJCQkJUjBfUkVHTlVNLCBsYXN0X2dw ciwKCQkJCWNhbGxlZV9hZGp1c3QgIT0gMCwgJmNmaV9vcHMpOwoKICBpZiAobmVlZF9iYXJyaWVy X3ApCiAgICBlbWl0X2luc24gKGdlbl9zdGFja190aWUgKHN0YWNrX3BvaW50ZXJfcnR4LCBzdGFj a19wb2ludGVyX3J0eCkpOwoKICBpZiAoY2FsbGVlX2FkanVzdCAhPSAwKQogICAgYWFyY2g2NF9w b3BfcmVncyAocmVnMSwgcmVnMiwgY2FsbGVlX2FkanVzdCwgJmNmaV9vcHMpOwoKICAvKiBJZiB3 ZSBoYXZlIG5vIHJlZ2lzdGVyIHJlc3RvcmUgaW5mb3JtYXRpb24sIHRoZSBDRkEgbXVzdCBoYXZl IGJlZW4KICAgICBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBzdGFjayBwb2ludGVyIHNpbmNlIHRo ZSBlbmQgb2YgdGhlIHByb2xvZ3VlLiAgKi8KICBnY2NfYXNzZXJ0IChjZmlfb3BzIHx8ICFmcmFt ZV9wb2ludGVyX25lZWRlZCk7CgogIGlmIChjZmlfb3BzICYmIChjYWxsZWVfYWRqdXN0ICE9IDAg fHwgbWF5YmVfZ3QgKGluaXRpYWxfYWRqdXN0LCA2NTUzNikpKQogICAgewogICAgICAvKiBFbWl0 IGRlbGF5ZWQgcmVzdG9yZXMgYW5kIHNldCB0aGUgQ0ZBIHRvIGJlIFNQICsgaW5pdGlhbF9hZGp1 c3QuICAqLwogICAgICBpbnNuID0gZ2V0X2xhc3RfaW5zbiAoKTsKICAgICAgcnR4IG5ld19jZmEg PSBwbHVzX2NvbnN0YW50IChQbW9kZSwgc3RhY2tfcG9pbnRlcl9ydHgsIGluaXRpYWxfYWRqdXN0 KTsKICAgICAgUkVHX05PVEVTIChpbnNuKSA9IGFsbG9jX3JlZ19ub3RlIChSRUdfQ0ZBX0RFRl9D RkEsIG5ld19jZmEsIGNmaV9vcHMpOwogICAgICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSA9 IDE7CiAgICAgIGNmaV9vcHMgPSBOVUxMOwogICAgfQoKICAvKiBMaXZlbmVzcyBvZiBFUDBfUkVH TlVNIGNhbiBub3QgYmUgdHJ1c3RlZCBhY3Jvc3MgZnVuY3Rpb24gY2FsbHMgZWl0aGVyLCBzbwog ICAgIGFkZCByZXN0cmljdGlvbiBvbiBlbWl0X21vdmUgb3B0aW1pemF0aW9uIHRvIGxlYWYgZnVu Y3Rpb25zLiAgKi8KICBhYXJjaDY0X2FkZF9zcCAodG1wMF9ydHgsIHRtcDFfcnR4LCBpbml0aWFs X2FkanVzdCwKCQkgICghY2FuX2luaGVyaXRfcCB8fCAhY3J0bC0+aXNfbGVhZgoJCSAgIHx8IGRm X3JlZ3NfZXZlcl9saXZlX3AgKEVQMF9SRUdOVU0pKSk7CgogIGlmIChjZmlfb3BzKQogICAgewog ICAgICAvKiBFbWl0IGRlbGF5ZWQgcmVzdG9yZXMgYW5kIHJlc2V0IHRoZSBDRkEgdG8gYmUgU1Au ICAqLwogICAgICBpbnNuID0gZ2V0X2xhc3RfaW5zbiAoKTsKICAgICAgY2ZpX29wcyA9IGFsbG9j X3JlZ19ub3RlIChSRUdfQ0ZBX0RFRl9DRkEsIHN0YWNrX3BvaW50ZXJfcnR4LCBjZmlfb3BzKTsK ICAgICAgUkVHX05PVEVTIChpbnNuKSA9IGNmaV9vcHM7CiAgICAgIFJUWF9GUkFNRV9SRUxBVEVE X1AgKGluc24pID0gMTsKICAgIH0KCiAgLyogUG9wIHJldHVybiBhZGRyZXNzIGZyb20gc2hhZG93 IGNhbGwgc3RhY2suICAqLwogIGlmIChjZnVuLT5tYWNoaW5lLT5mcmFtZS5pc19zY3NfZW5hYmxl ZCkKICAgIHsKICAgICAgbWFjaGluZV9tb2RlIG1vZGUgPSBhYXJjaDY0X3JlZ19zYXZlX21vZGUg KFIzMF9SRUdOVU0pOwogICAgICBydHggcmVnID0gZ2VuX3J0eF9SRUcgKG1vZGUsIFIzMF9SRUdO VU0pOwoKICAgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3Njc19wb3AgKCkpOwogICAgICBhZGRf cmVnX25vdGUgKGluc24sIFJFR19DRkFfUkVTVE9SRSwgcmVnKTsKICAgICAgUlRYX0ZSQU1FX1JF TEFURURfUCAoaW5zbikgPSAxOwogICAgfQoKICAvKiBXZSBwcmVmZXIgdG8gZW1pdCB0aGUgY29t YmluZWQgcmV0dXJuL2F1dGhlbnRpY2F0ZSBpbnN0cnVjdGlvbiBSRVRBQSwKICAgICBob3dldmVy IHRoZXJlIGFyZSB0aHJlZSBjYXNlcyBpbiB3aGljaCB3ZSBtdXN0IGluc3RlYWQgZW1pdCBhbiBl eHBsaWNpdAogICAgIGF1dGhlbnRpY2F0aW9uIGluc3RydWN0aW9uLgoKCTEpIFNpYmNhbGxzIGRv bid0IHJldHVybiBpbiBhIG5vcm1hbCB3YXksIHNvIGlmIHdlJ3JlIGFib3V0IHRvIGNhbGwgb25l CgkgICB3ZSBtdXN0IGF1dGhlbnRpY2F0ZS4KCgkyKSBUaGUgUkVUQUEgaW5zdHJ1Y3Rpb24gaXMg bm90IGF2YWlsYWJsZSBiZWZvcmUgQVJNdjguMy1BLCBzbyBpZiB3ZSBhcmUKCSAgIGdlbmVyYXRp bmcgY29kZSBmb3IgIVRBUkdFVF9BUk1WOF8zIHdlIGNhbid0IHVzZSBpdCBhbmQgbXVzdAoJICAg ZXhwbGljaXRseSBhdXRoZW50aWNhdGUuCiAgICAqLwogIGlmIChhYXJjaDY0X3JldHVybl9hZGRy ZXNzX3NpZ25pbmdfZW5hYmxlZCAoKQogICAgICAmJiAoZm9yX3NpYmNhbGwgfHwgIVRBUkdFVF9B Uk1WOF8zKSkKICAgIHsKICAgICAgc3dpdGNoIChhYXJjaF9yYV9zaWduX2tleSkKCXsKCSAgY2Fz ZSBBQVJDSF9LRVlfQToKCSAgICBpbnNuID0gZW1pdF9pbnNuIChnZW5fYXV0aWFzcCAoKSk7Cgkg ICAgYnJlYWs7CgkgIGNhc2UgQUFSQ0hfS0VZX0I6CgkgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2Vu X2F1dGlic3AgKCkpOwoJICAgIGJyZWFrOwoJICBkZWZhdWx0OgoJICAgIGdjY191bnJlYWNoYWJs ZSAoKTsKCX0KICAgICAgYWRkX3JlZ19ub3RlIChpbnNuLCBSRUdfQ0ZBX1RPR0dMRV9SQV9NQU5H TEUsIGNvbnN0MF9ydHgpOwogICAgICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSA9IDE7CiAg ICB9CgogIC8qIFN0YWNrIGFkanVzdG1lbnQgZm9yIGV4Y2VwdGlvbiBoYW5kbGVyLiAgKi8KICBp ZiAoY3J0bC0+Y2FsbHNfZWhfcmV0dXJuICYmICFmb3Jfc2liY2FsbCkKICAgIHsKICAgICAgLyog V2UgbmVlZCB0byB1bndpbmQgdGhlIHN0YWNrIGJ5IHRoZSBvZmZzZXQgY29tcHV0ZWQgYnkKCSBF SF9SRVRVUk5fU1RBQ0tBREpfUlRYLiAgV2UgaGF2ZSBhbHJlYWR5IHJlc2V0IHRoZSBDRkEKCSB0 byBiZSBTUDsgbGV0dGluZyB0aGUgQ0ZBIG1vdmUgZHVyaW5nIHRoaXMgYWRqdXN0bWVudAoJIGlz IGp1c3QgYXMgY29ycmVjdCBhcyByZXRhaW5pbmcgdGhlIENGQSBmcm9tIHRoZSBib2R5Cgkgb2Yg dGhlIGZ1bmN0aW9uLiAgVGhlcmVmb3JlLCBkbyBub3RoaW5nIHNwZWNpYWwuICAqLwogICAgICBl bWl0X2luc24gKGdlbl9hZGQyX2luc24gKHN0YWNrX3BvaW50ZXJfcnR4LCBFSF9SRVRVUk5fU1RB Q0tBREpfUlRYKSk7CiAgICB9CgogIGVtaXRfdXNlIChnZW5fcnR4X1JFRyAoREltb2RlLCBMUl9S RUdOVU0pKTsKICBpZiAoIWZvcl9zaWJjYWxsKQogICAgZW1pdF9qdW1wX2luc24gKHJldF9ydHgp Owp9CgovKiBJbXBsZW1lbnQgRUhfUkVUVVJOX0hBTkRMRVJfUlRYLiAgRUggcmV0dXJucyBuZWVk IHRvIGVpdGhlciByZXR1cm4KICAgbm9ybWFsbHkgb3IgcmV0dXJuIHRvIGEgcHJldmlvdXMgZnJh bWUgYWZ0ZXIgdW53aW5kaW5nLgoKICAgQW4gRUggcmV0dXJuIHVzZXMgYSBzaW5nbGUgc2hhcmVk IHJldHVybiBzZXF1ZW5jZS4gIFRoZSBlcGlsb2d1ZSBpcwogICBleGFjdGx5IGxpa2UgYSBub3Jt YWwgZXBpbG9ndWUgZXhjZXB0IHRoYXQgaXQgaGFzIGFuIGV4dHJhIGlucHV0CiAgIHJlZ2lzdGVy IChFSF9SRVRVUk5fU1RBQ0tBREpfUlRYKSB3aGljaCBjb250YWlucyB0aGUgc3RhY2sgYWRqdXN0 bWVudAogICB0aGF0IG11c3QgYmUgYXBwbGllZCBhZnRlciB0aGUgZnJhbWUgaGFzIGJlZW4gZGVz dHJveWVkLiAgQW4gZXh0cmEgbGFiZWwKICAgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBlcGlsb2d1 ZSB3aGljaCBpbml0aWFsaXplcyB0aGlzIHJlZ2lzdGVyIHRvIHplcm8sCiAgIGFuZCB0aGlzIGlz IHRoZSBlbnRyeSBwb2ludCBmb3IgYSBub3JtYWwgcmV0dXJuLgoKICAgQW4gYWN0dWFsIEVIIHJl dHVybiB1cGRhdGVzIHRoZSByZXR1cm4gYWRkcmVzcywgaW5pdGlhbGl6ZXMgdGhlIHN0YWNrCiAg IGFkanVzdG1lbnQgYW5kIGp1bXBzIGRpcmVjdGx5IGludG8gdGhlIGVwaWxvZ3VlIChieXBhc3Np bmcgdGhlIHplcm9pbmcKICAgb2YgdGhlIGFkanVzdG1lbnQpLiAgU2luY2UgdGhlIHJldHVybiBh ZGRyZXNzIGlzIHR5cGljYWxseSBzYXZlZCBvbiB0aGUKICAgc3RhY2sgd2hlbiBhIGZ1bmN0aW9u IG1ha2VzIGEgY2FsbCwgdGhlIHNhdmVkIExSIG11c3QgYmUgdXBkYXRlZCBvdXRzaWRlCiAgIHRo ZSBlcGlsb2d1ZS4KCiAgIFRoaXMgcG9zZXMgcHJvYmxlbXMgYXMgdGhlIHN0b3JlIGlzIGdlbmVy YXRlZCB3ZWxsIGJlZm9yZSB0aGUgZXBpbG9ndWUsCiAgIHNvIHRoZSBvZmZzZXQgb2YgTFIgaXMg bm90IGtub3duIHlldC4gIEFsc28gb3B0aW1pemF0aW9ucyB3aWxsIHJlbW92ZSB0aGUKICAgc3Rv cmUgYXMgaXQgYXBwZWFycyBkZWFkLCBldmVuIGFmdGVyIHRoZSBlcGlsb2d1ZSBpcyBnZW5lcmF0 ZWQgKGFzIHRoZQogICBiYXNlIG9yIG9mZnNldCBmb3IgbG9hZGluZyBMUiBpcyBkaWZmZXJlbnQg aW4gbWFueSBjYXNlcykuCgogICBUbyBhdm9pZCB0aGVzZSBwcm9ibGVtcyB0aGlzIGltcGxlbWVu dGF0aW9uIGZvcmNlcyB0aGUgZnJhbWUgcG9pbnRlcgogICBpbiBlaF9yZXR1cm4gZnVuY3Rpb25z IHNvIHRoYXQgdGhlIGxvY2F0aW9uIG9mIExSIGlzIGZpeGVkIGFuZCBrbm93biBlYXJseS4KICAg SXQgYWxzbyBtYXJrcyB0aGUgc3RvcmUgdm9sYXRpbGUsIHNvIG5vIG9wdGltaXphdGlvbiBpcyBw ZXJtaXR0ZWQgdG8KICAgcmVtb3ZlIHRoZSBzdG9yZS4gICovCnJ0eAphYXJjaDY0X2VoX3JldHVy bl9oYW5kbGVyX3J0eCAodm9pZCkKewogIHJ0eCB0bXAgPSBnZW5fZnJhbWVfbWVtIChQbW9kZSwK ICAgIHBsdXNfY29uc3RhbnQgKFBtb2RlLCBoYXJkX2ZyYW1lX3BvaW50ZXJfcnR4LCBVTklUU19Q RVJfV09SRCkpOwoKICAvKiBNYXJrIHRoZSBzdG9yZSB2b2xhdGlsZSwgc28gbm8gb3B0aW1pemF0 aW9uIGlzIHBlcm1pdHRlZCB0byByZW1vdmUgaXQuICAqLwogIE1FTV9WT0xBVElMRV9QICh0bXAp ID0gdHJ1ZTsKICByZXR1cm4gdG1wOwp9CgovKiBPdXRwdXQgY29kZSB0byBhZGQgREVMVEEgdG8g dGhlIGZpcnN0IGFyZ3VtZW50LCBhbmQgdGhlbiBqdW1wCiAgIHRvIEZVTkNUSU9OLiAgVXNlZCBm b3IgQysrIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgKi8Kc3RhdGljIHZvaWQKYWFyY2g2NF9vdXRw dXRfbWlfdGh1bmsgKEZJTEUgKmZpbGUsIHRyZWUgdGh1bmsgQVRUUklCVVRFX1VOVVNFRCwKCQkJ IEhPU1RfV0lERV9JTlQgZGVsdGEsCgkJCSBIT1NUX1dJREVfSU5UIHZjYWxsX29mZnNldCwKCQkJ IHRyZWUgZnVuY3Rpb24pCnsKICAvKiBUaGUgdGhpcyBwb2ludGVyIGlzIGFsd2F5cyBpbiB4MC4g IE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbQogICAgIEFybSB3aGVyZSB0aGUgdGhpcyBwb2lu dGVyIG1heWJlIGJ1bXBlZCB0byByMSBpZiByMCBpcyByZXF1aXJlZAogICAgIHRvIHJldHVybiBh IHBvaW50ZXIgdG8gYW4gYWdncmVnYXRlLiAgT24gQUFyY2g2NCBhIHJlc3VsdCB2YWx1ZQogICAg IHBvaW50ZXIgd2lsbCBiZSBpbiB4OC4gICovCiAgaW50IHRoaXNfcmVnbm8gPSBSMF9SRUdOVU07 CiAgcnR4IHRoaXNfcnR4LCB0ZW1wMCwgdGVtcDEsIGFkZHIsIGZ1bmV4cDsKICBydHhfaW5zbiAq aW5zbjsKICBjb25zdCBjaGFyICpmbm5hbWUgPSBJREVOVElGSUVSX1BPSU5URVIgKERFQ0xfQVNT RU1CTEVSX05BTUUgKHRodW5rKSk7CgogIGlmIChhYXJjaF9idGlfZW5hYmxlZCAoKSkKICAgIGVt aXRfaW5zbiAoZ2VuX2J0aV9jKCkpOwoKICByZWxvYWRfY29tcGxldGVkID0gMTsKICBlbWl0X25v dGUgKE5PVEVfSU5TTl9QUk9MT0dVRV9FTkQpOwoKICB0aGlzX3J0eCA9IGdlbl9ydHhfUkVHIChQ bW9kZSwgdGhpc19yZWdubyk7CiAgdGVtcDAgPSBnZW5fcnR4X1JFRyAoUG1vZGUsIEVQMF9SRUdO VU0pOwogIHRlbXAxID0gZ2VuX3J0eF9SRUcgKFBtb2RlLCBFUDFfUkVHTlVNKTsKCiAgaWYgKHZj YWxsX29mZnNldCA9PSAwKQogICAgYWFyY2g2NF9hZGRfb2Zmc2V0IChQbW9kZSwgdGhpc19ydHgs IHRoaXNfcnR4LCBkZWx0YSwgdGVtcDEsIHRlbXAwLCBmYWxzZSk7CiAgZWxzZQogICAgewogICAg ICBnY2NfYXNzZXJ0ICgodmNhbGxfb2Zmc2V0ICYgKFBPSU5URVJfQllURVMgLSAxKSkgPT0gMCk7 CgogICAgICBhZGRyID0gdGhpc19ydHg7CiAgICAgIGlmIChkZWx0YSAhPSAwKQoJewoJICBpZiAo ZGVsdGEgPj0gLTI1NiAmJiBkZWx0YSA8IDI1NikKCSAgICBhZGRyID0gZ2VuX3J0eF9QUkVfTU9E SUZZIChQbW9kZSwgdGhpc19ydHgsCgkJCQkgICAgICAgcGx1c19jb25zdGFudCAoUG1vZGUsIHRo aXNfcnR4LCBkZWx0YSkpOwoJICBlbHNlCgkgICAgYWFyY2g2NF9hZGRfb2Zmc2V0IChQbW9kZSwg dGhpc19ydHgsIHRoaXNfcnR4LCBkZWx0YSwKCQkJCXRlbXAxLCB0ZW1wMCwgZmFsc2UpOwoJfQoK ICAgICAgaWYgKFBtb2RlID09IHB0cl9tb2RlKQoJYWFyY2g2NF9lbWl0X21vdmUgKHRlbXAwLCBn ZW5fcnR4X01FTSAocHRyX21vZGUsIGFkZHIpKTsKICAgICAgZWxzZQoJYWFyY2g2NF9lbWl0X21v dmUgKHRlbXAwLAoJCQkgICBnZW5fcnR4X1pFUk9fRVhURU5EIChQbW9kZSwKCQkJCQkJZ2VuX3J0 eF9NRU0gKHB0cl9tb2RlLCBhZGRyKSkpOwoKICAgICAgaWYgKHZjYWxsX29mZnNldCA+PSAtMjU2 ICYmIHZjYWxsX29mZnNldCA8IDQwOTYgKiBQT0lOVEVSX0JZVEVTKQoJICBhZGRyID0gcGx1c19j b25zdGFudCAoUG1vZGUsIHRlbXAwLCB2Y2FsbF9vZmZzZXQpOwogICAgICBlbHNlCgl7CgkgIGFh cmNoNjRfaW50ZXJuYWxfbW92X2ltbWVkaWF0ZSAodGVtcDEsIEdFTl9JTlQgKHZjYWxsX29mZnNl dCksIHRydWUsCgkJCQkJICBQbW9kZSk7CgkgIGFkZHIgPSBnZW5fcnR4X1BMVVMgKFBtb2RlLCB0 ZW1wMCwgdGVtcDEpOwoJfQoKICAgICAgaWYgKFBtb2RlID09IHB0cl9tb2RlKQoJYWFyY2g2NF9l bWl0X21vdmUgKHRlbXAxLCBnZW5fcnR4X01FTSAocHRyX21vZGUsYWRkcikpOwogICAgICBlbHNl CglhYXJjaDY0X2VtaXRfbW92ZSAodGVtcDEsCgkJCSAgIGdlbl9ydHhfU0lHTl9FWFRFTkQgKFBt b2RlLAoJCQkJCQlnZW5fcnR4X01FTSAocHRyX21vZGUsIGFkZHIpKSk7CgogICAgICBlbWl0X2lu c24gKGdlbl9hZGQyX2luc24gKHRoaXNfcnR4LCB0ZW1wMSkpOwogICAgfQoKICAvKiBHZW5lcmF0 ZSBhIHRhaWwgY2FsbCB0byB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KICBpZiAoIVRSRUVfVVNF RCAoZnVuY3Rpb24pKQogICAgewogICAgICBhc3NlbWJsZV9leHRlcm5hbCAoZnVuY3Rpb24pOwog ICAgICBUUkVFX1VTRUQgKGZ1bmN0aW9uKSA9IDE7CiAgICB9CiAgZnVuZXhwID0gWEVYUCAoREVD TF9SVEwgKGZ1bmN0aW9uKSwgMCk7CiAgZnVuZXhwID0gZ2VuX3J0eF9NRU0gKEZVTkNUSU9OX01P REUsIGZ1bmV4cCk7CiAgcnR4IGNhbGxlZV9hYmkgPSBnZW5faW50X21vZGUgKGZuZGVjbF9hYmkg KGZ1bmN0aW9uKS5pZCAoKSwgREltb2RlKTsKICBpbnNuID0gZW1pdF9jYWxsX2luc24gKGdlbl9z aWJjYWxsIChmdW5leHAsIGNvbnN0MF9ydHgsIGNhbGxlZV9hYmkpKTsKICBTSUJMSU5HX0NBTExf UCAoaW5zbikgPSAxOwoKICBpbnNuID0gZ2V0X2luc25zICgpOwogIHNob3J0ZW5fYnJhbmNoZXMg KGluc24pOwoKICBhc3NlbWJsZV9zdGFydF9mdW5jdGlvbiAodGh1bmssIGZubmFtZSk7CiAgZmlu YWxfc3RhcnRfZnVuY3Rpb24gKGluc24sIGZpbGUsIDEpOwogIGZpbmFsIChpbnNuLCBmaWxlLCAx KTsKICBmaW5hbF9lbmRfZnVuY3Rpb24gKCk7CiAgYXNzZW1ibGVfZW5kX2Z1bmN0aW9uICh0aHVu aywgZm5uYW1lKTsKCiAgLyogU3RvcCBwcmV0ZW5kaW5nIHRvIGJlIGEgcG9zdC1yZWxvYWQgcGFz cy4gICovCiAgcmVsb2FkX2NvbXBsZXRlZCA9IDA7Cn0KCnN0YXRpYyBib29sCmFhcmNoNjRfdGxz X3JlZmVyZW5jZWRfcCAocnR4IHgpCnsKICBpZiAoIVRBUkdFVF9IQVZFX1RMUykKICAgIHJldHVy biBmYWxzZTsKICBzdWJydHhfaXRlcmF0b3I6OmFycmF5X3R5cGUgYXJyYXk7CiAgRk9SX0VBQ0hf U1VCUlRYIChpdGVyLCBhcnJheSwgeCwgQUxMKQogICAgewogICAgICBjb25zdF9ydHggeCA9ICpp dGVyOwogICAgICBpZiAoU1lNQk9MX1JFRl9QICh4KSAmJiBTWU1CT0xfUkVGX1RMU19NT0RFTCAo eCkgIT0gMCkKCXJldHVybiB0cnVlOwogICAgICAvKiBEb24ndCByZWN1cnNlIGludG8gVU5TUEVD X1RMUyBsb29raW5nIGZvciBUTFMgc3ltYm9sczsgdGhlc2UgYXJlCgkgVExTIG9mZnNldHMsIG5v dCByZWFsIHN5bWJvbCByZWZlcmVuY2VzLiAgKi8KICAgICAgaWYgKEdFVF9DT0RFICh4KSA9PSBV TlNQRUMgJiYgWElOVCAoeCwgMSkgPT0gVU5TUEVDX1RMUykKCWl0ZXIuc2tpcF9zdWJydHhlcyAo KTsKICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCgpzdGF0aWMgYm9vbAphYXJjaDY0X2Nhbm5vdF9m b3JjZV9jb25zdF9tZW0gKG1hY2hpbmVfbW9kZSBtb2RlIEFUVFJJQlVURV9VTlVTRUQsIHJ0eCB4 KQp7CiAgaWYgKEdFVF9DT0RFICh4KSA9PSBISUdIKQogICAgcmV0dXJuIHRydWU7CgogIC8qIFRo ZXJlJ3Mgbm8gd2F5IHRvIGNhbGN1bGF0ZSBWTC1iYXNlZCB2YWx1ZXMgdXNpbmcgcmVsb2NhdGlv bnMuICAqLwogIHN1YnJ0eF9pdGVyYXRvcjo6YXJyYXlfdHlwZSBhcnJheTsKICBGT1JfRUFDSF9T VUJSVFggKGl0ZXIsIGFycmF5LCB4LCBBTEwpCiAgICBpZiAoR0VUX0NPREUgKCppdGVyKSA9PSBD T05TVF9QT0xZX0lOVCkKICAgICAgcmV0dXJuIHRydWU7CgogIHBvbHlfaW50NjQgb2Zmc2V0Owog IHJ0eCBiYXNlID0gc3RyaXBfb2Zmc2V0X2FuZF9zYWx0ICh4LCAmb2Zmc2V0KTsKICBpZiAoU1lN Qk9MX1JFRl9QIChiYXNlKSB8fCBMQUJFTF9SRUZfUCAoYmFzZSkpCiAgICB7CiAgICAgIC8qIFdl IGNoZWNrZWQgZm9yIFBPTFlfSU5UX0NTVCBvZmZzZXRzIGFib3ZlLiAgKi8KICAgICAgaWYgKGFh cmNoNjRfY2xhc3NpZnlfc3ltYm9sIChiYXNlLCBvZmZzZXQudG9fY29uc3RhbnQgKCkpCgkgICE9 IFNZTUJPTF9GT1JDRV9UT19NRU0pCglyZXR1cm4gdHJ1ZTsKICAgICAgZWxzZQoJLyogQXZvaWQg Z2VuZXJhdGluZyBhIDY0LWJpdCByZWxvY2F0aW9uIGluIElMUDMyOyBsZWF2ZQoJICAgdG8gYWFy Y2g2NF9leHBhbmRfbW92X2ltbWVkaWF0ZSB0byBoYW5kbGUgaXQgcHJvcGVybHkuICAqLwoJcmV0 dXJuIG1vZGUgIT0gcHRyX21vZGU7CiAgICB9CgogIHJldHVybiBhYXJjaDY0X3Rsc19yZWZlcmVu Y2VkX3AgKHgpOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX0NBU0VfVkFMVUVTX1RIUkVTSE9MRC4K ICAgVGhlIGV4cGFuc2lvbiBmb3IgYSB0YWJsZSBzd2l0Y2ggaXMgcXVpdGUgZXhwZW5zaXZlIGR1 ZSB0byB0aGUgbnVtYmVyCiAgIG9mIGluc3RydWN0aW9ucywgdGhlIHRhYmxlIGxvb2t1cCBhbmQg aGFyZCB0byBwcmVkaWN0IGluZGlyZWN0IGp1bXAuCiAgIFdoZW4gb3B0aW1pemluZyBmb3Igc3Bl ZWQsIGFuZCAtTzMgZW5hYmxlZCwgdXNlIHRoZSBwZXItY29yZSB0dW5pbmcgaWYgCiAgIHNldCwg b3RoZXJ3aXNlIHVzZSB0YWJsZXMgZm9yID49IDExIGNhc2VzIGFzIGEgdHJhZGVvZmYgYmV0d2Vl biBzaXplIGFuZAogICBwZXJmb3JtYW5jZS4gIFdoZW4gb3B0aW1pemluZyBmb3Igc2l6ZSwgdXNl IDggZm9yIHNtYWxsZXN0IGNvZGVzaXplLiAgKi8KCnN0YXRpYyB1bnNpZ25lZCBpbnQKYWFyY2g2 NF9jYXNlX3ZhbHVlc190aHJlc2hvbGQgKHZvaWQpCnsKICAvKiBVc2UgdGhlIHNwZWNpZmllZCBs aW1pdCBmb3IgdGhlIG51bWJlciBvZiBjYXNlcyBiZWZvcmUgdXNpbmcganVtcAogICAgIHRhYmxl cyBhdCBoaWdoZXIgb3B0aW1pemF0aW9uIGxldmVscy4gICovCiAgaWYgKG9wdGltaXplID4gMgog ICAgICAmJiBhYXJjaDY0X3R1bmVfcGFyYW1zLm1heF9jYXNlX3ZhbHVlcyAhPSAwKQogICAgcmV0 dXJuIGFhcmNoNjRfdHVuZV9wYXJhbXMubWF4X2Nhc2VfdmFsdWVzOwogIGVsc2UKICAgIHJldHVy biBvcHRpbWl6ZV9zaXplID8gOCA6IDExOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiByZWdpc3RlciBS RUdOTyBpcyBhIHZhbGlkIGluZGV4IHJlZ2lzdGVyLgogICBTVFJJQ1RfUCBpcyB0cnVlIGlmIFJF R19PS19TVFJJQ1QgaXMgaW4gZWZmZWN0LiAgKi8KCmJvb2wKYWFyY2g2NF9yZWdub19va19mb3Jf aW5kZXhfcCAoaW50IHJlZ25vLCBib29sIHN0cmljdF9wKQp7CiAgaWYgKCFIQVJEX1JFR0lTVEVS X05VTV9QIChyZWdubykpCiAgICB7CiAgICAgIGlmICghc3RyaWN0X3ApCglyZXR1cm4gdHJ1ZTsK CiAgICAgIGlmICghcmVnX3JlbnVtYmVyKQoJcmV0dXJuIGZhbHNlOwoKICAgICAgcmVnbm8gPSBy ZWdfcmVudW1iZXJbcmVnbm9dOwogICAgfQogIHJldHVybiBHUF9SRUdOVU1fUCAocmVnbm8pOwp9 CgovKiBSZXR1cm4gdHJ1ZSBpZiByZWdpc3RlciBSRUdOTyBpcyBhIHZhbGlkIGJhc2UgcmVnaXN0 ZXIgZm9yIG1vZGUgTU9ERS4KICAgU1RSSUNUX1AgaXMgdHJ1ZSBpZiBSRUdfT0tfU1RSSUNUIGlz IGluIGVmZmVjdC4gICovCgpib29sCmFhcmNoNjRfcmVnbm9fb2tfZm9yX2Jhc2VfcCAoaW50IHJl Z25vLCBib29sIHN0cmljdF9wKQp7CiAgaWYgKCFIQVJEX1JFR0lTVEVSX05VTV9QIChyZWdubykp CiAgICB7CiAgICAgIGlmICghc3RyaWN0X3ApCglyZXR1cm4gdHJ1ZTsKCiAgICAgIGlmICghcmVn X3JlbnVtYmVyKQoJcmV0dXJuIGZhbHNlOwoKICAgICAgcmVnbm8gPSByZWdfcmVudW1iZXJbcmVn bm9dOwogICAgfQoKICAvKiBUaGUgZmFrZSByZWdpc3RlcnMgd2lsbCBiZSBlbGltaW5hdGVkIHRv IGVpdGhlciB0aGUgc3RhY2sgb3IKICAgICBoYXJkIGZyYW1lIHBvaW50ZXIsIGJvdGggb2Ygd2hp Y2ggYXJlIHVzdWFsbHkgdmFsaWQgYmFzZSByZWdpc3RlcnMuCiAgICAgUmVsb2FkIGRlYWxzIHdp dGggdGhlIGNhc2VzIHdoZXJlIHRoZSBlbGltaW5hdGVkIGZvcm0gaXNuJ3QgdmFsaWQuICAqLwog IHJldHVybiAoR1BfUkVHTlVNX1AgKHJlZ25vKQoJICB8fCByZWdubyA9PSBTUF9SRUdOVU0KCSAg fHwgcmVnbm8gPT0gRlJBTUVfUE9JTlRFUl9SRUdOVU0KCSAgfHwgcmVnbm8gPT0gQVJHX1BPSU5U RVJfUkVHTlVNKTsKfQoKLyogUmV0dXJuIHRydWUgaWYgWCBpcyBhIHZhbGlkIGJhc2UgcmVnaXN0 ZXIgZm9yIG1vZGUgTU9ERS4KICAgU1RSSUNUX1AgaXMgdHJ1ZSBpZiBSRUdfT0tfU1RSSUNUIGlz IGluIGVmZmVjdC4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X2Jhc2VfcmVnaXN0ZXJfcnR4X3Ag KHJ0eCB4LCBib29sIHN0cmljdF9wKQp7CiAgaWYgKCFzdHJpY3RfcAogICAgICAmJiBTVUJSRUdf UCAoeCkKICAgICAgJiYgY29udGFpbnNfcmVnX29mX21vZGVbR0VORVJBTF9SRUdTXVtHRVRfTU9E RSAoU1VCUkVHX1JFRyAoeCkpXSkKICAgIHggPSBTVUJSRUdfUkVHICh4KTsKCiAgcmV0dXJuIChS RUdfUCAoeCkgJiYgYWFyY2g2NF9yZWdub19va19mb3JfYmFzZV9wIChSRUdOTyAoeCksIHN0cmlj dF9wKSk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIGFkZHJlc3Mgb2Zmc2V0IGlzIGEgdmFsaWQgaW5k ZXguICBJZiBpdCBpcywgZmlsbCBpbiBJTkZPCiAgIGFwcHJvcHJpYXRlbHkuICBTVFJJQ1RfUCBp cyB0cnVlIGlmIFJFR19PS19TVFJJQ1QgaXMgaW4gZWZmZWN0LiAgKi8KCnN0YXRpYyBib29sCmFh cmNoNjRfY2xhc3NpZnlfaW5kZXggKHN0cnVjdCBhYXJjaDY0X2FkZHJlc3NfaW5mbyAqaW5mbywg cnR4IHgsCgkJCW1hY2hpbmVfbW9kZSBtb2RlLCBib29sIHN0cmljdF9wKQp7CiAgZW51bSBhYXJj aDY0X2FkZHJlc3NfdHlwZSB0eXBlOwogIHJ0eCBpbmRleDsKICBpbnQgc2hpZnQ7CgogIC8qIChy ZWc6UCkgKi8KICBpZiAoKFJFR19QICh4KSB8fCBTVUJSRUdfUCAoeCkpCiAgICAgICYmIEdFVF9N T0RFICh4KSA9PSBQbW9kZSkKICAgIHsKICAgICAgdHlwZSA9IEFERFJFU1NfUkVHX1JFRzsKICAg ICAgaW5kZXggPSB4OwogICAgICBzaGlmdCA9IDA7CiAgICB9CiAgLyogKHNpZ25fZXh0ZW5kOkRJ IChyZWc6U0kpKSAqLwogIGVsc2UgaWYgKChHRVRfQ09ERSAoeCkgPT0gU0lHTl9FWFRFTkQKCSAg ICB8fCBHRVRfQ09ERSAoeCkgPT0gWkVST19FWFRFTkQpCgkgICAmJiBHRVRfTU9ERSAoeCkgPT0g REltb2RlCgkgICAmJiBHRVRfTU9ERSAoWEVYUCAoeCwgMCkpID09IFNJbW9kZSkKICAgIHsKICAg ICAgdHlwZSA9IChHRVRfQ09ERSAoeCkgPT0gU0lHTl9FWFRFTkQpCgk/IEFERFJFU1NfUkVHX1NY VFcgOiBBRERSRVNTX1JFR19VWFRXOwogICAgICBpbmRleCA9IFhFWFAgKHgsIDApOwogICAgICBz aGlmdCA9IDA7CiAgICB9CiAgLyogKG11bHQ6REkgKHNpZ25fZXh0ZW5kOkRJIChyZWc6U0kpKSAo Y29uc3RfaW50IHNjYWxlKSkgKi8KICBlbHNlIGlmIChHRVRfQ09ERSAoeCkgPT0gTVVMVAoJICAg JiYgKEdFVF9DT0RFIChYRVhQICh4LCAwKSkgPT0gU0lHTl9FWFRFTkQKCSAgICAgICB8fCBHRVRf Q09ERSAoWEVYUCAoeCwgMCkpID09IFpFUk9fRVhURU5EKQoJICAgJiYgR0VUX01PREUgKFhFWFAg KHgsIDApKSA9PSBESW1vZGUKCSAgICYmIEdFVF9NT0RFIChYRVhQIChYRVhQICh4LCAwKSwgMCkp ID09IFNJbW9kZQoJICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKHgsIDEpKSkKICAgIHsKICAgICAg dHlwZSA9IChHRVRfQ09ERSAoWEVYUCAoeCwgMCkpID09IFNJR05fRVhURU5EKQoJPyBBRERSRVNT X1JFR19TWFRXIDogQUREUkVTU19SRUdfVVhUVzsKICAgICAgaW5kZXggPSBYRVhQIChYRVhQICh4 LCAwKSwgMCk7CiAgICAgIHNoaWZ0ID0gZXhhY3RfbG9nMiAoSU5UVkFMIChYRVhQICh4LCAxKSkp OwogICAgfQogIC8qIChhc2hpZnQ6REkgKHNpZ25fZXh0ZW5kOkRJIChyZWc6U0kpKSAoY29uc3Rf aW50IHNoaWZ0KSkgKi8KICBlbHNlIGlmIChHRVRfQ09ERSAoeCkgPT0gQVNISUZUCgkgICAmJiAo R0VUX0NPREUgKFhFWFAgKHgsIDApKSA9PSBTSUdOX0VYVEVORAoJICAgICAgIHx8IEdFVF9DT0RF IChYRVhQICh4LCAwKSkgPT0gWkVST19FWFRFTkQpCgkgICAmJiBHRVRfTU9ERSAoWEVYUCAoeCwg MCkpID09IERJbW9kZQoJICAgJiYgR0VUX01PREUgKFhFWFAgKFhFWFAgKHgsIDApLCAwKSkgPT0g U0ltb2RlCgkgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAoeCwgMSkpKQogICAgewogICAgICB0eXBl ID0gKEdFVF9DT0RFIChYRVhQICh4LCAwKSkgPT0gU0lHTl9FWFRFTkQpCgk/IEFERFJFU1NfUkVH X1NYVFcgOiBBRERSRVNTX1JFR19VWFRXOwogICAgICBpbmRleCA9IFhFWFAgKFhFWFAgKHgsIDAp LCAwKTsKICAgICAgc2hpZnQgPSBJTlRWQUwgKFhFWFAgKHgsIDEpKTsKICAgIH0KICAvKiAoYW5k OkRJIChtdWx0OkRJIChyZWc6REkpIChjb25zdF9pbnQgc2NhbGUpKQogICAgIChjb25zdF9pbnQg MHhmZmZmZmZmZjw8c2hpZnQpKSAqLwogIGVsc2UgaWYgKEdFVF9DT0RFICh4KSA9PSBBTkQKCSAg ICYmIEdFVF9NT0RFICh4KSA9PSBESW1vZGUKCSAgICYmIEdFVF9DT0RFIChYRVhQICh4LCAwKSkg PT0gTVVMVAoJICAgJiYgR0VUX01PREUgKFhFWFAgKFhFWFAgKHgsIDApLCAwKSkgPT0gREltb2Rl CgkgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAoWEVYUCAoeCwgMCksIDEpKQoJICAgJiYgQ09OU1Rf SU5UX1AgKFhFWFAgKHgsIDEpKSkKICAgIHsKICAgICAgdHlwZSA9IEFERFJFU1NfUkVHX1VYVFc7 CiAgICAgIGluZGV4ID0gWEVYUCAoWEVYUCAoeCwgMCksIDApOwogICAgICBzaGlmdCA9IGV4YWN0 X2xvZzIgKElOVFZBTCAoWEVYUCAoWEVYUCAoeCwgMCksIDEpKSk7CiAgICAgIGlmIChJTlRWQUwg KFhFWFAgKHgsIDEpKSAhPSAoSE9TVF9XSURFX0lOVCkweGZmZmZmZmZmIDw8IHNoaWZ0KQoJc2hp ZnQgPSAtMTsKICAgIH0KICAvKiAoYW5kOkRJIChhc2hpZnQ6REkgKHJlZzpESSkgKGNvbnN0X2lu dCBzaGlmdCkpCiAgICAgKGNvbnN0X2ludCAweGZmZmZmZmZmPDxzaGlmdCkpICovCiAgZWxzZSBp ZiAoR0VUX0NPREUgKHgpID09IEFORAoJICAgJiYgR0VUX01PREUgKHgpID09IERJbW9kZQoJICAg JiYgR0VUX0NPREUgKFhFWFAgKHgsIDApKSA9PSBBU0hJRlQKCSAgICYmIEdFVF9NT0RFIChYRVhQ IChYRVhQICh4LCAwKSwgMCkpID09IERJbW9kZQoJICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhF WFAgKHgsIDApLCAxKSkKCSAgICYmIENPTlNUX0lOVF9QIChYRVhQICh4LCAxKSkpCiAgICB7CiAg ICAgIHR5cGUgPSBBRERSRVNTX1JFR19VWFRXOwogICAgICBpbmRleCA9IFhFWFAgKFhFWFAgKHgs IDApLCAwKTsKICAgICAgc2hpZnQgPSBJTlRWQUwgKFhFWFAgKFhFWFAgKHgsIDApLCAxKSk7CiAg ICAgIGlmIChJTlRWQUwgKFhFWFAgKHgsIDEpKSAhPSAoSE9TVF9XSURFX0lOVCkweGZmZmZmZmZm IDw8IHNoaWZ0KQoJc2hpZnQgPSAtMTsKICAgIH0KICAvKiAobXVsdDpQIChyZWc6UCkgKGNvbnN0 X2ludCBzY2FsZSkpICovCiAgZWxzZSBpZiAoR0VUX0NPREUgKHgpID09IE1VTFQKCSAgICYmIEdF VF9NT0RFICh4KSA9PSBQbW9kZQoJICAgJiYgR0VUX01PREUgKFhFWFAgKHgsIDApKSA9PSBQbW9k ZQoJICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKHgsIDEpKSkKICAgIHsKICAgICAgdHlwZSA9IEFE RFJFU1NfUkVHX1JFRzsKICAgICAgaW5kZXggPSBYRVhQICh4LCAwKTsKICAgICAgc2hpZnQgPSBl eGFjdF9sb2cyIChJTlRWQUwgKFhFWFAgKHgsIDEpKSk7CiAgICB9CiAgLyogKGFzaGlmdDpQIChy ZWc6UCkgKGNvbnN0X2ludCBzaGlmdCkpICovCiAgZWxzZSBpZiAoR0VUX0NPREUgKHgpID09IEFT SElGVAoJICAgJiYgR0VUX01PREUgKHgpID09IFBtb2RlCgkgICAmJiBHRVRfTU9ERSAoWEVYUCAo eCwgMCkpID09IFBtb2RlCgkgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAoeCwgMSkpKQogICAgewog ICAgICB0eXBlID0gQUREUkVTU19SRUdfUkVHOwogICAgICBpbmRleCA9IFhFWFAgKHgsIDApOwog ICAgICBzaGlmdCA9IElOVFZBTCAoWEVYUCAoeCwgMSkpOwogICAgfQogIGVsc2UKICAgIHJldHVy biBmYWxzZTsKCiAgaWYgKCFzdHJpY3RfcAogICAgICAmJiBTVUJSRUdfUCAoaW5kZXgpCiAgICAg ICYmIGNvbnRhaW5zX3JlZ19vZl9tb2RlW0dFTkVSQUxfUkVHU11bR0VUX01PREUgKFNVQlJFR19S RUcgKGluZGV4KSldKQogICAgaW5kZXggPSBTVUJSRUdfUkVHIChpbmRleCk7CgogIGlmIChhYXJj aDY0X3N2ZV9kYXRhX21vZGVfcCAobW9kZSkpCiAgICB7CiAgICAgIGlmICh0eXBlICE9IEFERFJF U1NfUkVHX1JFRwoJICB8fCAoMSA8PCBzaGlmdCkgIT0gR0VUX01PREVfVU5JVF9TSVpFIChtb2Rl KSkKCXJldHVybiBmYWxzZTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGlmIChzaGlmdCAhPSAw CgkgICYmICEoSU5fUkFOR0UgKHNoaWZ0LCAxLCAzKQoJICAgICAgICYmIGtub3duX2VxICgxIDw8 IHNoaWZ0LCBHRVRfTU9ERV9TSVpFIChtb2RlKSkpKQoJcmV0dXJuIGZhbHNlOwogICAgfQoKICBp ZiAoUkVHX1AgKGluZGV4KQogICAgICAmJiBhYXJjaDY0X3JlZ25vX29rX2Zvcl9pbmRleF9wIChS RUdOTyAoaW5kZXgpLCBzdHJpY3RfcCkpCiAgICB7CiAgICAgIGluZm8tPnR5cGUgPSB0eXBlOwog ICAgICBpbmZvLT5vZmZzZXQgPSBpbmRleDsKICAgICAgaW5mby0+c2hpZnQgPSBzaGlmdDsKICAg ICAgcmV0dXJuIHRydWU7CiAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKLyogUmV0dXJuIHRydWUg aWYgTU9ERSBpcyBvbmUgb2YgdGhlIG1vZGVzIGZvciB3aGljaCB3ZQogICBzdXBwb3J0IExEUC9T VFAgb3BlcmF0aW9ucy4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X21vZGVfdmFsaWRfZm9yX3Nj aGVkX2Z1c2lvbl9wIChtYWNoaW5lX21vZGUgbW9kZSkKewogIHJldHVybiBtb2RlID09IFNJbW9k ZSB8fCBtb2RlID09IERJbW9kZQoJIHx8IG1vZGUgPT0gU0Ztb2RlIHx8IG1vZGUgPT0gREZtb2Rl CgkgfHwgbW9kZSA9PSBTRG1vZGUgfHwgbW9kZSA9PSBERG1vZGUKCSB8fCAoYWFyY2g2NF92ZWN0 b3JfbW9kZV9zdXBwb3J0ZWRfcCAobW9kZSkKCSAgICAgJiYgKGtub3duX2VxIChHRVRfTU9ERV9T SVpFIChtb2RlKSwgOCkKCQkgfHwgKGtub3duX2VxIChHRVRfTU9ERV9TSVpFIChtb2RlKSwgMTYp CgkJICAgICYmIChhYXJjaDY0X3R1bmVfcGFyYW1zLmV4dHJhX3R1bmluZ19mbGFncwoJCQkmIEFB UkNINjRfRVhUUkFfVFVORV9OT19MRFBfU1RQX1FSRUdTKSA9PSAwKSkpOwp9CgovKiBSZXR1cm4g dHJ1ZSBpZiBSRUdOTyBpcyBhIHZpcnR1YWwgcG9pbnRlciByZWdpc3Rlciwgb3IgYW4gZWxpbWlu YWJsZQogICAic29mdCIgZnJhbWUgcmVnaXN0ZXIuICBMaWtlIFJFR05PX1BUUl9GUkFNRV9QIGV4 Y2VwdCB0aGF0IHdlIGRvbid0CiAgIGluY2x1ZGUgc3RhY2tfcG9pbnRlciBvciBoYXJkX2ZyYW1l X3BvaW50ZXIuICAqLwpzdGF0aWMgYm9vbAp2aXJ0X29yX2VsaW1fcmVnbm9fcCAodW5zaWduZWQg cmVnbm8pCnsKICByZXR1cm4gKChyZWdubyA+PSBGSVJTVF9WSVJUVUFMX1JFR0lTVEVSCgkgICAm JiByZWdubyA8PSBMQVNUX1ZJUlRVQUxfUE9JTlRFUl9SRUdJU1RFUikKCSAgfHwgcmVnbm8gPT0g RlJBTUVfUE9JTlRFUl9SRUdOVU0KCSAgfHwgcmVnbm8gPT0gQVJHX1BPSU5URVJfUkVHTlVNKTsK fQoKLyogUmV0dXJuIHRydWUgaWYgWCBpcyBhIHZhbGlkIGFkZHJlc3Mgb2YgdHlwZSBUWVBFIGZv ciBtYWNoaW5lIG1vZGUgTU9ERS4KICAgSWYgaXQgaXMsIGZpbGwgaW4gSU5GTyBhcHByb3ByaWF0 ZWx5LiAgU1RSSUNUX1AgaXMgdHJ1ZSBpZgogICBSRUdfT0tfU1RSSUNUIGlzIGluIGVmZmVjdC4g ICovCgpib29sCmFhcmNoNjRfY2xhc3NpZnlfYWRkcmVzcyAoc3RydWN0IGFhcmNoNjRfYWRkcmVz c19pbmZvICppbmZvLAoJCQkgIHJ0eCB4LCBtYWNoaW5lX21vZGUgbW9kZSwgYm9vbCBzdHJpY3Rf cCwKCQkJICBhYXJjaDY0X2FkZHJfcXVlcnlfdHlwZSB0eXBlKQp7CiAgZW51bSBydHhfY29kZSBj b2RlID0gR0VUX0NPREUgKHgpOwogIHJ0eCBvcDAsIG9wMTsKICBwb2x5X2ludDY0IG9mZnNldDsK CiAgSE9TVF9XSURFX0lOVCBjb25zdF9zaXplOwoKICAvKiBXaGV0aGVyIGEgdmVjdG9yIG1vZGUg aXMgcGFydGlhbCBkb2Vzbid0IGFmZmVjdCBhZGRyZXNzIGxlZ2l0aW1hY3kuCiAgICAgUGFydGlh bCB2ZWN0b3JzIGxpa2UgVk54OFFJbW9kZSBhbGxvdyB0aGUgc2FtZSBpbmRleGVkIGFkZHJlc3Np bmcKICAgICBtb2RlIGFuZCBNVUwgVkwgYWRkcmVzc2luZyBtb2RlIGFzIGZ1bGwgdmVjdG9ycyBs aWtlIFZOeDE2UUltb2RlOwogICAgIGluIGJvdGggY2FzZXMsIE1VTCBWTCBjb3VudHMgbXVsdGlw bGVzIG9mIEdFVF9NT0RFX1NJWkUuICAqLwogIHVuc2lnbmVkIGludCB2ZWNfZmxhZ3MgPSBhYXJj aDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlIChtb2RlKTsKICB2ZWNfZmxhZ3MgJj0gflZFQ19QQVJU SUFMOwoKICAvKiBPbiBCRSwgd2UgdXNlIGxvYWQvc3RvcmUgcGFpciBmb3IgYWxsIGxhcmdlIGlu dCBtb2RlIGxvYWQvc3RvcmVzLgogICAgIFRJL1RGL1REbW9kZSBtYXkgYWxzbyB1c2UgYSBsb2Fk L3N0b3JlIHBhaXIuICAqLwogIGJvb2wgYWR2c2ltZF9zdHJ1Y3RfcCA9ICh2ZWNfZmxhZ3MgPT0g KFZFQ19BRFZTSU1EIHwgVkVDX1NUUlVDVCkpOwogIGJvb2wgbG9hZF9zdG9yZV9wYWlyX3AgPSAo dHlwZSA9PSBBRERSX1FVRVJZX0xEUF9TVFAKCQkJICAgIHx8IHR5cGUgPT0gQUREUl9RVUVSWV9M RFBfU1RQX04KCQkJICAgIHx8IG1vZGUgPT0gVEltb2RlCgkJCSAgICB8fCBtb2RlID09IFRGbW9k ZQoJCQkgICAgfHwgbW9kZSA9PSBURG1vZGUKCQkJICAgIHx8ICgoIVRBUkdFVF9TSU1EIHx8IEJZ VEVTX0JJR19FTkRJQU4pCgkJCQkmJiBhZHZzaW1kX3N0cnVjdF9wKSk7CiAgLyogSWYgd2UgYXJl IGRlYWxpbmcgd2l0aCBBRERSX1FVRVJZX0xEUF9TVFBfTiB0aGF0IG1lYW5zIHRoZSBpbmNvbWlu ZyBtb2RlCiAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBtZW1vcnkg YmVpbmcgbG9hZGVkL3N0b3JlZCBhbmQgdGhlCiAgICAgbW9kZSBvZiB0aGUgY29ycmVzcG9uZGlu ZyBhZGRyZXNzaW5nIG1vZGUgaXMgaGFsZiBvZiB0aGF0LiAgKi8KICBpZiAodHlwZSA9PSBBRERS X1FVRVJZX0xEUF9TVFBfTikKICAgIHsKICAgICAgaWYgKGtub3duX2VxIChHRVRfTU9ERV9TSVpF IChtb2RlKSwgMTYpKQoJbW9kZSA9IERGbW9kZTsKICAgICAgZWxzZSBpZiAoa25vd25fZXEgKEdF VF9NT0RFX1NJWkUgKG1vZGUpLCA4KSkKCW1vZGUgPSBTRm1vZGU7CiAgICAgIGVsc2UKCXJldHVy biBmYWxzZTsKICAgIH0KCiAgYm9vbCBhbGxvd19yZWdfaW5kZXhfcCA9ICghbG9hZF9zdG9yZV9w YWlyX3AKCQkJICAgICYmICgodmVjX2ZsYWdzID09IDAKCQkJCSAmJiBrbm93bl9sdCAoR0VUX01P REVfU0laRSAobW9kZSksIDE2KSkKCQkJCXx8IHZlY19mbGFncyA9PSBWRUNfQURWU0lNRAoJCQkJ fHwgdmVjX2ZsYWdzICYgVkVDX1NWRV9EQVRBKSk7CgogIC8qIEZvciBTVkUsIG9ubHkgYWNjZXB0 IFtSbl0sIFtSbiwgI29mZnNldCwgTVVMIFZMXSBhbmQgW1JuLCBSbSwgTFNMICNzaGlmdF0uCiAg ICAgVGhlIGxhdHRlciBpcyBub3QgdmFsaWQgZm9yIFNWRSBwcmVkaWNhdGVzLCBhbmQgdGhhdCdz IHJlamVjdGVkIHRocm91Z2gKICAgICBhbGxvd19yZWdfaW5kZXhfcCBhYm92ZS4gICovCiAgaWYg KCh2ZWNfZmxhZ3MgJiAoVkVDX1NWRV9EQVRBIHwgVkVDX1NWRV9QUkVEKSkgIT0gMAogICAgICAm JiAoY29kZSAhPSBSRUcgJiYgY29kZSAhPSBQTFVTKSkKICAgIHJldHVybiBmYWxzZTsKCiAgLyog T24gTEUsIGZvciBBZHZTSU1ELCBkb24ndCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gUE9T VF9JTkMgb3IKICAgICBSRUcgYWRkcmVzc2luZy4gICovCiAgaWYgKGFkdnNpbWRfc3RydWN0X3AK ICAgICAgJiYgVEFSR0VUX1NJTUQKICAgICAgJiYgIUJZVEVTX0JJR19FTkRJQU4KICAgICAgJiYg KGNvZGUgIT0gUE9TVF9JTkMgJiYgY29kZSAhPSBSRUcpKQogICAgcmV0dXJuIGZhbHNlOwoKICBn Y2NfY2hlY2tpbmdfYXNzZXJ0IChHRVRfTU9ERSAoeCkgPT0gVk9JRG1vZGUKCQkgICAgICAgfHwg U0NBTEFSX0lOVF9NT0RFX1AgKEdFVF9NT0RFICh4KSkpOwoKICBzd2l0Y2ggKGNvZGUpCiAgICB7 CiAgICBjYXNlIFJFRzoKICAgIGNhc2UgU1VCUkVHOgogICAgICBpbmZvLT50eXBlID0gQUREUkVT U19SRUdfSU1NOwogICAgICBpbmZvLT5iYXNlID0geDsKICAgICAgaW5mby0+b2Zmc2V0ID0gY29u c3QwX3J0eDsKICAgICAgaW5mby0+Y29uc3Rfb2Zmc2V0ID0gMDsKICAgICAgcmV0dXJuIGFhcmNo NjRfYmFzZV9yZWdpc3Rlcl9ydHhfcCAoeCwgc3RyaWN0X3ApOwoKICAgIGNhc2UgUExVUzoKICAg ICAgb3AwID0gWEVYUCAoeCwgMCk7CiAgICAgIG9wMSA9IFhFWFAgKHgsIDEpOwoKICAgICAgaWYg KCEgc3RyaWN0X3AKCSAgJiYgUkVHX1AgKG9wMCkKCSAgJiYgdmlydF9vcl9lbGltX3JlZ25vX3Ag KFJFR05PIChvcDApKQoJICAmJiBwb2x5X2ludF9ydHhfcCAob3AxLCAmb2Zmc2V0KSkKCXsKCSAg aW5mby0+dHlwZSA9IEFERFJFU1NfUkVHX0lNTTsKCSAgaW5mby0+YmFzZSA9IG9wMDsKCSAgaW5m by0+b2Zmc2V0ID0gb3AxOwoJICBpbmZvLT5jb25zdF9vZmZzZXQgPSBvZmZzZXQ7CgoJICByZXR1 cm4gdHJ1ZTsKCX0KCiAgICAgIGlmIChtYXliZV9uZSAoR0VUX01PREVfU0laRSAobW9kZSksIDAp CgkgICYmIGFhcmNoNjRfYmFzZV9yZWdpc3Rlcl9ydHhfcCAob3AwLCBzdHJpY3RfcCkKCSAgJiYg cG9seV9pbnRfcnR4X3AgKG9wMSwgJm9mZnNldCkpCgl7CgkgIGluZm8tPnR5cGUgPSBBRERSRVNT X1JFR19JTU07CgkgIGluZm8tPmJhc2UgPSBvcDA7CgkgIGluZm8tPm9mZnNldCA9IG9wMTsKCSAg aW5mby0+Y29uc3Rfb2Zmc2V0ID0gb2Zmc2V0OwoKCSAgLyogVEltb2RlLCBURm1vZGUgYW5kIFRE bW9kZSB2YWx1ZXMgYXJlIGFsbG93ZWQgaW4gYm90aCBwYWlycyBvZiBYCgkgICAgIHJlZ2lzdGVy cyBhbmQgaW5kaXZpZHVhbCBRIHJlZ2lzdGVycy4gIFRoZSBhdmFpbGFibGUKCSAgICAgYWRkcmVz cyBtb2RlcyBhcmU6CgkgICAgIFgsWDogNy1iaXQgc2lnbmVkIHNjYWxlZCBvZmZzZXQKCSAgICAg UTogICA5LWJpdCBzaWduZWQgb2Zmc2V0CgkgICAgIFdlIGNvbnNlcnZhdGl2ZWx5IHJlcXVpcmUg YW4gb2Zmc2V0IHJlcHJlc2VudGFibGUgaW4gZWl0aGVyIG1vZGUuCgkgICAgIFdoZW4gcGVyZm9y bWluZyB0aGUgY2hlY2sgZm9yIHBhaXJzIG9mIFggcmVnaXN0ZXJzIGkuZS4gIExEUC9TVFAKCSAg ICAgcGFzcyBkb3duIERJbW9kZSBzaW5jZSB0aGF0IGlzIHRoZSBuYXR1cmFsIHNpemUgb2YgdGhl IExEUC9TVFAKCSAgICAgaW5zdHJ1Y3Rpb24gbWVtb3J5IGFjY2Vzc2VzLiAgKi8KCSAgaWYgKG1v ZGUgPT0gVEltb2RlIHx8IG1vZGUgPT0gVEZtb2RlIHx8IG1vZGUgPT0gVERtb2RlKQoJICAgIHJl dHVybiAoYWFyY2g2NF9vZmZzZXRfN2JpdF9zaWduZWRfc2NhbGVkX3AgKERJbW9kZSwgb2Zmc2V0 KQoJCSAgICAmJiAoYWFyY2g2NF9vZmZzZXRfOWJpdF9zaWduZWRfdW5zY2FsZWRfcCAobW9kZSwg b2Zmc2V0KQoJCQl8fCBvZmZzZXRfMTJiaXRfdW5zaWduZWRfc2NhbGVkX3AgKG1vZGUsIG9mZnNl dCkpKTsKCgkgIGlmIChtb2RlID09IFY4REltb2RlKQoJICAgIHJldHVybiAoYWFyY2g2NF9vZmZz ZXRfN2JpdF9zaWduZWRfc2NhbGVkX3AgKERJbW9kZSwgb2Zmc2V0KQoJICAgICAgICAgICAgJiYg YWFyY2g2NF9vZmZzZXRfN2JpdF9zaWduZWRfc2NhbGVkX3AgKERJbW9kZSwgb2Zmc2V0ICsgNDgp KTsKCgkgIC8qIEEgN2JpdCBvZmZzZXQgY2hlY2sgYmVjYXVzZSBPSW1vZGUgd2lsbCBlbWl0IGEg bGRwL3N0cAoJICAgICBpbnN0cnVjdGlvbiAob25seSAhVEFSR0VUX1NJTUQgb3IgYmlnIGVuZGlh biB3aWxsIGdldCBoZXJlKS4KCSAgICAgRm9yIGxkcC9zdHAgaW5zdHJ1Y3Rpb25zLCB0aGUgb2Zm c2V0IGlzIHNjYWxlZCBmb3IgdGhlIHNpemUgb2YgYQoJICAgICBzaW5nbGUgZWxlbWVudCBvZiB0 aGUgcGFpci4gICovCgkgIGlmIChhYXJjaDY0X2FkdnNpbWRfcGFydGlhbF9zdHJ1Y3RfbW9kZV9w IChtb2RlKQoJICAgICAgJiYga25vd25fZXEgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCAxNikpCgkg ICAgcmV0dXJuIGFhcmNoNjRfb2Zmc2V0XzdiaXRfc2lnbmVkX3NjYWxlZF9wIChESW1vZGUsIG9m ZnNldCk7CgkgIGlmIChhYXJjaDY0X2FkdnNpbWRfZnVsbF9zdHJ1Y3RfbW9kZV9wIChtb2RlKQoJ ICAgICAgJiYga25vd25fZXEgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCAzMikpCgkgICAgcmV0dXJu IGFhcmNoNjRfb2Zmc2V0XzdiaXRfc2lnbmVkX3NjYWxlZF9wIChUSW1vZGUsIG9mZnNldCk7CgoJ ICAvKiBUaHJlZSA5LzEyIGJpdCBvZmZzZXRzIGNoZWNrcyBiZWNhdXNlIENJbW9kZSB3aWxsIGVt aXQgdGhyZWUKCSAgICAgbGRyL3N0ciBpbnN0cnVjdGlvbnMgKG9ubHkgIVRBUkdFVF9TSU1EIG9y IGJpZyBlbmRpYW4gd2lsbAoJICAgICBnZXQgaGVyZSkuICAqLwoJICBpZiAoYWFyY2g2NF9hZHZz aW1kX3BhcnRpYWxfc3RydWN0X21vZGVfcCAobW9kZSkKCSAgICAgICYmIGtub3duX2VxIChHRVRf TU9ERV9TSVpFIChtb2RlKSwgMjQpKQoJICAgIHJldHVybiAoYWFyY2g2NF9vZmZzZXRfN2JpdF9z aWduZWRfc2NhbGVkX3AgKERJbW9kZSwgb2Zmc2V0KQoJCSAgICAmJiAoYWFyY2g2NF9vZmZzZXRf OWJpdF9zaWduZWRfdW5zY2FsZWRfcCAoREltb2RlLAoJCQkJCQkJICAgICAgIG9mZnNldCArIDE2 KQoJCQl8fCBvZmZzZXRfMTJiaXRfdW5zaWduZWRfc2NhbGVkX3AgKERJbW9kZSwKCQkJCQkJCSAg IG9mZnNldCArIDE2KSkpOwoJICBpZiAoYWFyY2g2NF9hZHZzaW1kX2Z1bGxfc3RydWN0X21vZGVf cCAobW9kZSkKCSAgICAgICYmIGtub3duX2VxIChHRVRfTU9ERV9TSVpFIChtb2RlKSwgNDgpKQoJ ICAgIHJldHVybiAoYWFyY2g2NF9vZmZzZXRfN2JpdF9zaWduZWRfc2NhbGVkX3AgKFRJbW9kZSwg b2Zmc2V0KQoJCSAgICAmJiAoYWFyY2g2NF9vZmZzZXRfOWJpdF9zaWduZWRfdW5zY2FsZWRfcCAo VEltb2RlLAoJCQkJCQkJICAgICAgIG9mZnNldCArIDMyKQoJCQl8fCBvZmZzZXRfMTJiaXRfdW5z aWduZWRfc2NhbGVkX3AgKFRJbW9kZSwKCQkJCQkJCSAgIG9mZnNldCArIDMyKSkpOwoKCSAgLyog VHdvIDdiaXQgb2Zmc2V0cyBjaGVja3MgYmVjYXVzZSBYSW1vZGUgd2lsbCBlbWl0IHR3byBsZHAv c3RwCgkgICAgIGluc3RydWN0aW9ucyAob25seSBiaWcgZW5kaWFuIHdpbGwgZ2V0IGhlcmUpLiAg Ki8KCSAgaWYgKGFhcmNoNjRfYWR2c2ltZF9wYXJ0aWFsX3N0cnVjdF9tb2RlX3AgKG1vZGUpCgkg ICAgICAmJiBrbm93bl9lcSAoR0VUX01PREVfU0laRSAobW9kZSksIDMyKSkKCSAgICByZXR1cm4g KGFhcmNoNjRfb2Zmc2V0XzdiaXRfc2lnbmVkX3NjYWxlZF9wIChESW1vZGUsIG9mZnNldCkKCQkg ICAgJiYgYWFyY2g2NF9vZmZzZXRfN2JpdF9zaWduZWRfc2NhbGVkX3AgKERJbW9kZSwKCQkJCQkJ CSAgICBvZmZzZXQgKyAxNikpOwoJICBpZiAoYWFyY2g2NF9hZHZzaW1kX2Z1bGxfc3RydWN0X21v ZGVfcCAobW9kZSkKCSAgICAgICYmIGtub3duX2VxIChHRVRfTU9ERV9TSVpFIChtb2RlKSwgNjQp KQoJICAgIHJldHVybiAoYWFyY2g2NF9vZmZzZXRfN2JpdF9zaWduZWRfc2NhbGVkX3AgKFRJbW9k ZSwgb2Zmc2V0KQoJCSAgICAmJiBhYXJjaDY0X29mZnNldF83Yml0X3NpZ25lZF9zY2FsZWRfcCAo VEltb2RlLAoJCQkJCQkJICAgIG9mZnNldCArIDMyKSk7CgoJICAvKiBNYWtlICJtIiB1c2UgdGhl IExEMSBvZmZzZXQgcmFuZ2UgZm9yIFNWRSBkYXRhIG1vZGVzLCBzbwoJICAgICB0aGF0IHByZS1S VEwgb3B0aW1pemVycyBsaWtlIGl2b3B0cyB3aWxsIHdvcmsgdG8gdGhhdAoJICAgICBpbnN0ZWFk IG9mIHRoZSB3aWRlciBMRFIvU1RSIHJhbmdlLiAgKi8KCSAgaWYgKHZlY19mbGFncyA9PSBWRUNf U1ZFX0RBVEEpCgkgICAgcmV0dXJuICh0eXBlID09IEFERFJfUVVFUllfTQoJCSAgICA/IG9mZnNl dF80Yml0X3NpZ25lZF9zY2FsZWRfcCAobW9kZSwgb2Zmc2V0KQoJCSAgICA6IG9mZnNldF85Yml0 X3NpZ25lZF9zY2FsZWRfcCAobW9kZSwgb2Zmc2V0KSk7CgoJICBpZiAodmVjX2ZsYWdzID09IChW RUNfU1ZFX0RBVEEgfCBWRUNfU1RSVUNUKSkKCSAgICB7CgkgICAgICBwb2x5X2ludDY0IGVuZF9v ZmZzZXQgPSAob2Zmc2V0CgkJCQkgICAgICAgKyBHRVRfTU9ERV9TSVpFIChtb2RlKQoJCQkJICAg ICAgIC0gQllURVNfUEVSX1NWRV9WRUNUT1IpOwoJICAgICAgcmV0dXJuICh0eXBlID09IEFERFJf UVVFUllfTQoJCSAgICAgID8gb2Zmc2V0XzRiaXRfc2lnbmVkX3NjYWxlZF9wIChtb2RlLCBvZmZz ZXQpCgkJICAgICAgOiAob2Zmc2V0XzliaXRfc2lnbmVkX3NjYWxlZF9wIChTVkVfQllURV9NT0RF LCBvZmZzZXQpCgkJCSAmJiBvZmZzZXRfOWJpdF9zaWduZWRfc2NhbGVkX3AgKFNWRV9CWVRFX01P REUsCgkJCQkJCQkgZW5kX29mZnNldCkpKTsKCSAgICB9CgoJICBpZiAodmVjX2ZsYWdzID09IFZF Q19TVkVfUFJFRCkKCSAgICByZXR1cm4gb2Zmc2V0XzliaXRfc2lnbmVkX3NjYWxlZF9wIChtb2Rl LCBvZmZzZXQpOwoKCSAgaWYgKGxvYWRfc3RvcmVfcGFpcl9wKQoJICAgIHJldHVybiAoKGtub3du X2VxIChHRVRfTU9ERV9TSVpFIChtb2RlKSwgNCkKCQkgICAgIHx8IGtub3duX2VxIChHRVRfTU9E RV9TSVpFIChtb2RlKSwgOCkKCQkgICAgIHx8IGtub3duX2VxIChHRVRfTU9ERV9TSVpFIChtb2Rl KSwgMTYpKQoJCSAgICAmJiBhYXJjaDY0X29mZnNldF83Yml0X3NpZ25lZF9zY2FsZWRfcCAobW9k ZSwgb2Zmc2V0KSk7CgkgIGVsc2UKCSAgICByZXR1cm4gKGFhcmNoNjRfb2Zmc2V0XzliaXRfc2ln bmVkX3Vuc2NhbGVkX3AgKG1vZGUsIG9mZnNldCkKCQkgICAgfHwgb2Zmc2V0XzEyYml0X3Vuc2ln bmVkX3NjYWxlZF9wIChtb2RlLCBvZmZzZXQpKTsKCX0KCiAgICAgIGlmIChhbGxvd19yZWdfaW5k ZXhfcCkKCXsKCSAgLyogTG9vayBmb3IgYmFzZSArIChzY2FsZWQvZXh0ZW5kZWQpIGluZGV4IHJl Z2lzdGVyLiAgKi8KCSAgaWYgKGFhcmNoNjRfYmFzZV9yZWdpc3Rlcl9ydHhfcCAob3AwLCBzdHJp Y3RfcCkKCSAgICAgICYmIGFhcmNoNjRfY2xhc3NpZnlfaW5kZXggKGluZm8sIG9wMSwgbW9kZSwg c3RyaWN0X3ApKQoJICAgIHsKCSAgICAgIGluZm8tPmJhc2UgPSBvcDA7CgkgICAgICByZXR1cm4g dHJ1ZTsKCSAgICB9CgkgIGlmIChhYXJjaDY0X2Jhc2VfcmVnaXN0ZXJfcnR4X3AgKG9wMSwgc3Ry aWN0X3ApCgkgICAgICAmJiBhYXJjaDY0X2NsYXNzaWZ5X2luZGV4IChpbmZvLCBvcDAsIG1vZGUs IHN0cmljdF9wKSkKCSAgICB7CgkgICAgICBpbmZvLT5iYXNlID0gb3AxOwoJICAgICAgcmV0dXJu IHRydWU7CgkgICAgfQoJfQoKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhc2UgUE9TVF9JTkM6 CiAgICBjYXNlIFBPU1RfREVDOgogICAgY2FzZSBQUkVfSU5DOgogICAgY2FzZSBQUkVfREVDOgog ICAgICBpbmZvLT50eXBlID0gQUREUkVTU19SRUdfV0I7CiAgICAgIGluZm8tPmJhc2UgPSBYRVhQ ICh4LCAwKTsKICAgICAgaW5mby0+b2Zmc2V0ID0gTlVMTF9SVFg7CiAgICAgIHJldHVybiBhYXJj aDY0X2Jhc2VfcmVnaXN0ZXJfcnR4X3AgKGluZm8tPmJhc2UsIHN0cmljdF9wKTsKCiAgICBjYXNl IFBPU1RfTU9ESUZZOgogICAgY2FzZSBQUkVfTU9ESUZZOgogICAgICBpbmZvLT50eXBlID0gQURE UkVTU19SRUdfV0I7CiAgICAgIGluZm8tPmJhc2UgPSBYRVhQICh4LCAwKTsKICAgICAgaWYgKEdF VF9DT0RFIChYRVhQICh4LCAxKSkgPT0gUExVUwoJICAmJiBwb2x5X2ludF9ydHhfcCAoWEVYUCAo WEVYUCAoeCwgMSksIDEpLCAmb2Zmc2V0KQoJICAmJiBydHhfZXF1YWxfcCAoWEVYUCAoWEVYUCAo eCwgMSksIDApLCBpbmZvLT5iYXNlKQoJICAmJiBhYXJjaDY0X2Jhc2VfcmVnaXN0ZXJfcnR4X3Ag KGluZm8tPmJhc2UsIHN0cmljdF9wKSkKCXsKCSAgaW5mby0+b2Zmc2V0ID0gWEVYUCAoWEVYUCAo eCwgMSksIDEpOwoJICBpbmZvLT5jb25zdF9vZmZzZXQgPSBvZmZzZXQ7CgoJICAvKiBUSW1vZGUs IFRGbW9kZSBhbmQgVERtb2RlIHZhbHVlcyBhcmUgYWxsb3dlZCBpbiBib3RoIHBhaXJzIG9mIFgK CSAgICAgcmVnaXN0ZXJzIGFuZCBpbmRpdmlkdWFsIFEgcmVnaXN0ZXJzLiAgVGhlIGF2YWlsYWJs ZQoJICAgICBhZGRyZXNzIG1vZGVzIGFyZToKCSAgICAgWCxYOiA3LWJpdCBzaWduZWQgc2NhbGVk IG9mZnNldAoJICAgICBROiAgIDktYml0IHNpZ25lZCBvZmZzZXQKCSAgICAgV2UgY29uc2VydmF0 aXZlbHkgcmVxdWlyZSBhbiBvZmZzZXQgcmVwcmVzZW50YWJsZSBpbiBlaXRoZXIgbW9kZS4KCSAg ICovCgkgIGlmIChtb2RlID09IFRJbW9kZSB8fCBtb2RlID09IFRGbW9kZSB8fCBtb2RlID09IFRE bW9kZSkKCSAgICByZXR1cm4gKGFhcmNoNjRfb2Zmc2V0XzdiaXRfc2lnbmVkX3NjYWxlZF9wICht b2RlLCBvZmZzZXQpCgkJICAgICYmIGFhcmNoNjRfb2Zmc2V0XzliaXRfc2lnbmVkX3Vuc2NhbGVk X3AgKG1vZGUsIG9mZnNldCkpOwoKCSAgaWYgKGxvYWRfc3RvcmVfcGFpcl9wKQoJICAgIHJldHVy biAoKGtub3duX2VxIChHRVRfTU9ERV9TSVpFIChtb2RlKSwgNCkKCQkgICAgIHx8IGtub3duX2Vx IChHRVRfTU9ERV9TSVpFIChtb2RlKSwgOCkKCQkgICAgIHx8IGtub3duX2VxIChHRVRfTU9ERV9T SVpFIChtb2RlKSwgMTYpKQoJCSAgICAmJiBhYXJjaDY0X29mZnNldF83Yml0X3NpZ25lZF9zY2Fs ZWRfcCAobW9kZSwgb2Zmc2V0KSk7CgkgIGVsc2UKCSAgICByZXR1cm4gYWFyY2g2NF9vZmZzZXRf OWJpdF9zaWduZWRfdW5zY2FsZWRfcCAobW9kZSwgb2Zmc2V0KTsKCX0KICAgICAgcmV0dXJuIGZh bHNlOwoKICAgIGNhc2UgQ09OU1Q6CiAgICBjYXNlIFNZTUJPTF9SRUY6CiAgICBjYXNlIExBQkVM X1JFRjoKICAgICAgLyogbG9hZCBsaXRlcmFsOiBwYy1yZWxhdGl2ZSBjb25zdGFudCBwb29sIGVu dHJ5LiAgT25seSBzdXBwb3J0ZWQKICAgICAgICAgZm9yIFNJIG1vZGUgb3IgbGFyZ2VyLiAgKi8K ICAgICAgaW5mby0+dHlwZSA9IEFERFJFU1NfU1lNQk9MSUM7CgogICAgICBpZiAoIWxvYWRfc3Rv cmVfcGFpcl9wCgkgICYmIEdFVF9NT0RFX1NJWkUgKG1vZGUpLmlzX2NvbnN0YW50ICgmY29uc3Rf c2l6ZSkKCSAgJiYgY29uc3Rfc2l6ZSA+PSA0KQoJewoJICBwb2x5X2ludDY0IG9mZnNldDsKCSAg cnR4IHN5bSA9IHN0cmlwX29mZnNldF9hbmRfc2FsdCAoeCwgJm9mZnNldCk7CgkgIHJldHVybiAo KExBQkVMX1JFRl9QIChzeW0pCgkJICAgfHwgKFNZTUJPTF9SRUZfUCAoc3ltKQoJCSAgICAgICAm JiBDT05TVEFOVF9QT09MX0FERFJFU1NfUCAoc3ltKQoJCSAgICAgICAmJiBhYXJjaDY0X3BjcmVs YXRpdmVfbGl0ZXJhbF9sb2FkcykpKTsKCX0KICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhc2Ug TE9fU1VNOgogICAgICBpbmZvLT50eXBlID0gQUREUkVTU19MT19TVU07CiAgICAgIGluZm8tPmJh c2UgPSBYRVhQICh4LCAwKTsKICAgICAgaW5mby0+b2Zmc2V0ID0gWEVYUCAoeCwgMSk7CiAgICAg IGlmIChhbGxvd19yZWdfaW5kZXhfcAoJICAmJiBhYXJjaDY0X2Jhc2VfcmVnaXN0ZXJfcnR4X3Ag KGluZm8tPmJhc2UsIHN0cmljdF9wKSkKCXsKCSAgcG9seV9pbnQ2NCBvZmZzZXQ7CgkgIEhPU1Rf V0lERV9JTlQgY29uc3Rfb2Zmc2V0OwoJICBydHggc3ltID0gc3RyaXBfb2Zmc2V0X2FuZF9zYWx0 IChpbmZvLT5vZmZzZXQsICZvZmZzZXQpOwoJICBpZiAoU1lNQk9MX1JFRl9QIChzeW0pCgkgICAg ICAmJiBvZmZzZXQuaXNfY29uc3RhbnQgKCZjb25zdF9vZmZzZXQpCgkgICAgICAmJiAoYWFyY2g2 NF9jbGFzc2lmeV9zeW1ib2wgKHN5bSwgY29uc3Rfb2Zmc2V0KQoJCSAgPT0gU1lNQk9MX1NNQUxM X0FCU09MVVRFKSkKCSAgICB7CgkgICAgICAvKiBUaGUgc3ltYm9sIGFuZCBvZmZzZXQgbXVzdCBi ZSBhbGlnbmVkIHRvIHRoZSBhY2Nlc3Mgc2l6ZS4gICovCgkgICAgICB1bnNpZ25lZCBpbnQgYWxp Z247CgoJICAgICAgaWYgKENPTlNUQU5UX1BPT0xfQUREUkVTU19QIChzeW0pKQoJCWFsaWduID0g R0VUX01PREVfQUxJR05NRU5UIChnZXRfcG9vbF9tb2RlIChzeW0pKTsKCSAgICAgIGVsc2UgaWYg KFRSRUVfQ09OU1RBTlRfUE9PTF9BRERSRVNTX1AgKHN5bSkpCgkJewoJCSAgdHJlZSBleHAgPSBT WU1CT0xfUkVGX0RFQ0wgKHN5bSk7CgkJICBhbGlnbiA9IFRZUEVfQUxJR04gKFRSRUVfVFlQRSAo ZXhwKSk7CgkJICBhbGlnbiA9IGFhcmNoNjRfY29uc3RhbnRfYWxpZ25tZW50IChleHAsIGFsaWdu KTsKCQl9CgkgICAgICBlbHNlIGlmIChTWU1CT0xfUkVGX0RFQ0wgKHN5bSkpCgkJYWxpZ24gPSBE RUNMX0FMSUdOIChTWU1CT0xfUkVGX0RFQ0wgKHN5bSkpOwoJICAgICAgZWxzZSBpZiAoU1lNQk9M X1JFRl9IQVNfQkxPQ0tfSU5GT19QIChzeW0pCgkJICAgICAgICYmIFNZTUJPTF9SRUZfQkxPQ0sg KHN5bSkgIT0gTlVMTCkKCQlhbGlnbiA9IFNZTUJPTF9SRUZfQkxPQ0sgKHN5bSktPmFsaWdubWVu dDsKCSAgICAgIGVsc2UKCQlhbGlnbiA9IEJJVFNfUEVSX1VOSVQ7CgoJICAgICAgcG9seV9pbnQ2 NCByZWZfc2l6ZSA9IEdFVF9NT0RFX1NJWkUgKG1vZGUpOwoJICAgICAgaWYgKGtub3duX2VxIChy ZWZfc2l6ZSwgMCkpCgkJcmVmX3NpemUgPSBHRVRfTU9ERV9TSVpFIChESW1vZGUpOwoKCSAgICAg IHJldHVybiAobXVsdGlwbGVfcCAoY29uc3Rfb2Zmc2V0LCByZWZfc2l6ZSkKCQkgICAgICAmJiBt dWx0aXBsZV9wIChhbGlnbiAvIEJJVFNfUEVSX1VOSVQsIHJlZl9zaXplKSk7CgkgICAgfQoJfQog ICAgICByZXR1cm4gZmFsc2U7CgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAg fQp9CgovKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzcyBYIGlzIHZhbGlkIGZvciBhIFBSRk0g aW5zdHJ1Y3Rpb24uCiAgIFNUUklDVF9QIGlzIHRydWUgaWYgd2Ugc2hvdWxkIGRvIHN0cmljdCBj aGVja2luZyB3aXRoCiAgIGFhcmNoNjRfY2xhc3NpZnlfYWRkcmVzcy4gICovCgpib29sCmFhcmNo NjRfYWRkcmVzc192YWxpZF9mb3JfcHJlZmV0Y2hfcCAocnR4IHgsIGJvb2wgc3RyaWN0X3ApCnsK ICBzdHJ1Y3QgYWFyY2g2NF9hZGRyZXNzX2luZm8gYWRkcjsKCiAgLyogUFJGTSBhY2NlcHRzIHRo ZSBzYW1lIGFkZHJlc3NlcyBhcyBESW1vZGUuLi4gICovCiAgYm9vbCByZXMgPSBhYXJjaDY0X2Ns YXNzaWZ5X2FkZHJlc3MgKCZhZGRyLCB4LCBESW1vZGUsIHN0cmljdF9wKTsKICBpZiAoIXJlcykK ICAgIHJldHVybiBmYWxzZTsKCiAgLyogLi4uIGV4Y2VwdCB3cml0ZWJhY2sgZm9ybXMuICAqLwog IHJldHVybiBhZGRyLnR5cGUgIT0gQUREUkVTU19SRUdfV0I7Cn0KCmJvb2wKYWFyY2g2NF9zeW1i b2xpY19hZGRyZXNzX3AgKHJ0eCB4KQp7CiAgcG9seV9pbnQ2NCBvZmZzZXQ7CiAgeCA9IHN0cmlw X29mZnNldF9hbmRfc2FsdCAoeCwgJm9mZnNldCk7CiAgcmV0dXJuIFNZTUJPTF9SRUZfUCAoeCkg fHwgTEFCRUxfUkVGX1AgKHgpOwp9CgovKiBDbGFzc2lmeSB0aGUgYmFzZSBvZiBzeW1ib2xpYyBl eHByZXNzaW9uIFguICAqLwoKZW51bSBhYXJjaDY0X3N5bWJvbF90eXBlCmFhcmNoNjRfY2xhc3Np Znlfc3ltYm9saWNfZXhwcmVzc2lvbiAocnR4IHgpCnsKICBydHggb2Zmc2V0OwoKICBzcGxpdF9j b25zdCAoeCwgJngsICZvZmZzZXQpOwogIHJldHVybiBhYXJjaDY0X2NsYXNzaWZ5X3N5bWJvbCAo eCwgSU5UVkFMIChvZmZzZXQpKTsKfQoKCi8qIFJldHVybiBUUlVFIGlmIFggaXMgYSBsZWdpdGlt YXRlIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyBtZW1vcnkgaW4KICAgbW9kZSBNT0RFLiAgKi8Kc3Rh dGljIGJvb2wKYWFyY2g2NF9sZWdpdGltYXRlX2FkZHJlc3NfaG9va19wIChtYWNoaW5lX21vZGUg bW9kZSwgcnR4IHgsIGJvb2wgc3RyaWN0X3ApCnsKICBzdHJ1Y3QgYWFyY2g2NF9hZGRyZXNzX2lu Zm8gYWRkcjsKCiAgcmV0dXJuIGFhcmNoNjRfY2xhc3NpZnlfYWRkcmVzcyAoJmFkZHIsIHgsIG1v ZGUsIHN0cmljdF9wKTsKfQoKLyogUmV0dXJuIFRSVUUgaWYgWCBpcyBhIGxlZ2l0aW1hdGUgYWRk cmVzcyBvZiB0eXBlIFRZUEUgZm9yIGFjY2Vzc2luZwogICBtZW1vcnkgaW4gbW9kZSBNT0RFLiAg U1RSSUNUX1AgaXMgdHJ1ZSBpZiBSRUdfT0tfU1RSSUNUIGlzIGluIGVmZmVjdC4gICovCmJvb2wK YWFyY2g2NF9sZWdpdGltYXRlX2FkZHJlc3NfcCAobWFjaGluZV9tb2RlIG1vZGUsIHJ0eCB4LCBi b29sIHN0cmljdF9wLAoJCQkgICAgICBhYXJjaDY0X2FkZHJfcXVlcnlfdHlwZSB0eXBlKQp7CiAg c3RydWN0IGFhcmNoNjRfYWRkcmVzc19pbmZvIGFkZHI7CgogIHJldHVybiBhYXJjaDY0X2NsYXNz aWZ5X2FkZHJlc3MgKCZhZGRyLCB4LCBtb2RlLCBzdHJpY3RfcCwgdHlwZSk7Cn0KCi8qIEltcGxl bWVudCBUQVJHRVRfTEVHSVRJTUlaRV9BRERSRVNTX0RJU1BMQUNFTUVOVC4gICovCgpzdGF0aWMg Ym9vbAphYXJjaDY0X2xlZ2l0aW1pemVfYWRkcmVzc19kaXNwbGFjZW1lbnQgKHJ0eCAqb2Zmc2V0 MSwgcnR4ICpvZmZzZXQyLAoJCQkJCSBwb2x5X2ludDY0IG9yaWdfb2Zmc2V0LAoJCQkJCSBtYWNo aW5lX21vZGUgbW9kZSkKewogIEhPU1RfV0lERV9JTlQgc2l6ZTsKICBpZiAoR0VUX01PREVfU0la RSAobW9kZSkuaXNfY29uc3RhbnQgKCZzaXplKSkKICAgIHsKICAgICAgSE9TVF9XSURFX0lOVCBj b25zdF9vZmZzZXQsIHNlY29uZF9vZmZzZXQ7CgogICAgICAvKiBBIGdlbmVyYWwgU1ZFIG9mZnNl dCBpcyBBICogVlEgKyBCLiAgUmVtb3ZlIHRoZSBBIGNvbXBvbmVudCBmcm9tCgkgY29lZmZpY2ll bnQgMCBpbiBvcmRlciB0byBnZXQgdGhlIGNvbnN0YW50IEIuICAqLwogICAgICBjb25zdF9vZmZz ZXQgPSBvcmlnX29mZnNldC5jb2VmZnNbMF0gLSBvcmlnX29mZnNldC5jb2VmZnNbMV07CgogICAg ICAvKiBTcGxpdCBhbiBvdXQtb2YtcmFuZ2UgYWRkcmVzcyBkaXNwbGFjZW1lbnQgaW50byBhIGJh c2UgYW5kCgkgb2Zmc2V0LiAgVXNlIDRLQiByYW5nZSBmb3IgMS0gYW5kIDItYnl0ZSBhY2Nlc3Nl cyBhbmQgYSAxNktCCgkgcmFuZ2Ugb3RoZXJ3aXNlIHRvIGluY3JlYXNlIG9wcG9ydHVuaXRpZXMg Zm9yIHNoYXJpbmcgdGhlIGJhc2UKCSBhZGRyZXNzIG9mIGRpZmZlcmVudCBzaXplcy4gIFVuYWxp Z25lZCBhY2Nlc3NlcyB1c2UgdGhlIHNpZ25lZAoJIDktYml0IHJhbmdlLCBUSW1vZGUvVEZtb2Rl L1REbW9kZSB1c2UgdGhlIGludGVyc2VjdGlvbiBvZiBzaWduZWQKCSBzY2FsZWQgNy1iaXQgYW5k IHNpZ25lZCA5LWJpdCBvZmZzZXQuICAqLwogICAgICBpZiAobW9kZSA9PSBUSW1vZGUgfHwgbW9k ZSA9PSBURm1vZGUgfHwgbW9kZSA9PSBURG1vZGUpCglzZWNvbmRfb2Zmc2V0ID0gKChjb25zdF9v ZmZzZXQgKyAweDEwMCkgJiAweDFmOCkgLSAweDEwMDsKICAgICAgZWxzZSBpZiAoKGNvbnN0X29m ZnNldCAmIChzaXplIC0gMSkpICE9IDApCglzZWNvbmRfb2Zmc2V0ID0gKChjb25zdF9vZmZzZXQg KyAweDEwMCkgJiAweDFmZikgLSAweDEwMDsKICAgICAgZWxzZQoJc2Vjb25kX29mZnNldCA9IGNv bnN0X29mZnNldCAmIChzaXplIDwgNCA/IDB4ZmZmIDogMHgzZmZjKTsKCiAgICAgIGlmIChzZWNv bmRfb2Zmc2V0ID09IDAgfHwga25vd25fZXEgKG9yaWdfb2Zmc2V0LCBzZWNvbmRfb2Zmc2V0KSkK CXJldHVybiBmYWxzZTsKCiAgICAgIC8qIFNwbGl0IHRoZSBvZmZzZXQgaW50byBzZWNvbmRfb2Zm c2V0IGFuZCB0aGUgcmVzdC4gICovCiAgICAgICpvZmZzZXQxID0gZ2VuX2ludF9tb2RlIChvcmln X29mZnNldCAtIHNlY29uZF9vZmZzZXQsIFBtb2RlKTsKICAgICAgKm9mZnNldDIgPSBnZW5faW50 X21vZGUgKHNlY29uZF9vZmZzZXQsIFBtb2RlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAg ZWxzZQogICAgewogICAgICAvKiBHZXQgdGhlIG1vZGUgd2Ugc2hvdWxkIHVzZSBhcyB0aGUgYmFz aXMgb2YgdGhlIHJhbmdlLiAgRm9yIHN0cnVjdHVyZQoJIG1vZGVzIHRoaXMgaXMgdGhlIG1vZGUg b2Ygb25lIHZlY3Rvci4gICovCiAgICAgIHVuc2lnbmVkIGludCB2ZWNfZmxhZ3MgPSBhYXJjaDY0 X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlIChtb2RlKTsKICAgICAgbWFjaGluZV9tb2RlIHN0ZXBfbW9k ZQoJPSAodmVjX2ZsYWdzICYgVkVDX1NUUlVDVCkgIT0gMCA/IFNWRV9CWVRFX01PREUgOiBtb2Rl OwoKICAgICAgLyogR2V0IHRoZSAibXVsIHZsIiBtdWx0aXBsaWVyIHdlJ2QgbGlrZSB0byB1c2Uu ICAqLwogICAgICBIT1NUX1dJREVfSU5UIGZhY3RvciA9IEdFVF9NT0RFX1NJWkUgKHN0ZXBfbW9k ZSkuY29lZmZzWzFdOwogICAgICBIT1NUX1dJREVfSU5UIHZudW0gPSBvcmlnX29mZnNldC5jb2Vm ZnNbMV0gLyBmYWN0b3I7CiAgICAgIGlmICh2ZWNfZmxhZ3MgJiBWRUNfU1ZFX0RBVEEpCgkvKiBM RFIgc3VwcG9ydHMgYSA5LWJpdCByYW5nZSwgYnV0IHRoZSBtb3ZlIHBhdHRlcm5zIGZvcgoJICAg c3RydWN0dXJlIG1vZGVzIHJlcXVpcmUgYWxsIHZlY3RvcnMgdG8gYmUgaW4gcmFuZ2Ugb2YgdGhl CgkgICBzYW1lIGJhc2UuICBUaGUgc2ltcGxlc3Qgd2F5IG9mIGFjY29tb2RhdGluZyB0aGF0IHdo aWxlIHN0aWxsCgkgICBwcm9tb3RpbmcgcmV1c2Ugb2YgYW5jaG9yIHBvaW50cyBiZXR3ZWVuIGRp ZmZlcmVudCBtb2RlcyBpcwoJICAgdG8gdXNlIGFuIDgtYml0IHJhbmdlIHVuY29uZGl0aW9uYWxs eS4gICovCgl2bnVtID0gKCh2bnVtICsgMTI4KSAmIDI1NSkgLSAxMjg7CiAgICAgIGVsc2UKCS8q IFByZWRpY2F0ZXMgYXJlIG9ubHkgaGFuZGxlZCBzaW5nbHksIHNvIHdlIG1pZ2h0IGFzIHdlbGwg dXNlCgkgICB0aGUgZnVsbCByYW5nZS4gICovCgl2bnVtID0gKCh2bnVtICsgMjU2KSAmIDUxMSkg LSAyNTY7CiAgICAgIGlmICh2bnVtID09IDApCglyZXR1cm4gZmFsc2U7CgogICAgICAvKiBDb252 ZXJ0IHRoZSAibXVsIHZsIiBtdWx0aXBsaWVyIGludG8gYSBieXRlIG9mZnNldC4gICovCiAgICAg IHBvbHlfaW50NjQgc2Vjb25kX29mZnNldCA9IEdFVF9NT0RFX1NJWkUgKHN0ZXBfbW9kZSkgKiB2 bnVtOwogICAgICBpZiAoa25vd25fZXEgKHNlY29uZF9vZmZzZXQsIG9yaWdfb2Zmc2V0KSkKCXJl dHVybiBmYWxzZTsKCiAgICAgIC8qIFNwbGl0IHRoZSBvZmZzZXQgaW50byBzZWNvbmRfb2Zmc2V0 IGFuZCB0aGUgcmVzdC4gICovCiAgICAgICpvZmZzZXQxID0gZ2VuX2ludF9tb2RlIChvcmlnX29m ZnNldCAtIHNlY29uZF9vZmZzZXQsIFBtb2RlKTsKICAgICAgKm9mZnNldDIgPSBnZW5faW50X21v ZGUgKHNlY29uZF9vZmZzZXQsIFBtb2RlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KCi8q IFJldHVybiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGZsb2F0aW5nIHBvaW50IGNvbnN0 YW50IFZBTFVFIGluIElOVFZBTC4KICAgSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQs IHJldHVybiBmYWxzZSB3aXRob3V0IHNldHRpbmcgSU5UVkFMLgogICBUaGUgY29udmVyc2lvbiBp cyBkb25lIGluIHRoZSBnaXZlbiBNT0RFLiAgKi8KYm9vbAphYXJjaDY0X3JlaW50ZXJwcmV0X2Zs b2F0X2FzX2ludCAocnR4IHZhbHVlLCB1bnNpZ25lZCBIT1NUX1dJREVfSU5UICppbnR2YWwpCnsK CiAgLyogV2UgbWFrZSBhIGdlbmVyYWwgZXhjZXB0aW9uIGZvciAwLiAgKi8KICBpZiAoYWFyY2g2 NF9mbG9hdF9jb25zdF96ZXJvX3J0eF9wICh2YWx1ZSkpCiAgICB7CiAgICAgICppbnR2YWwgPSAw OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgc2NhbGFyX2Zsb2F0X21vZGUgbW9kZTsKICBp ZiAoIUNPTlNUX0RPVUJMRV9QICh2YWx1ZSkKICAgICAgfHwgIWlzX2EgPHNjYWxhcl9mbG9hdF9t b2RlPiAoR0VUX01PREUgKHZhbHVlKSwgJm1vZGUpCiAgICAgIHx8IEdFVF9NT0RFX0JJVFNJWkUg KG1vZGUpID4gSE9TVF9CSVRTX1BFUl9XSURFX0lOVAogICAgICAvKiBPbmx5IHN1cHBvcnQgdXAg dG8gREYgbW9kZS4gICovCiAgICAgIHx8IEdFVF9NT0RFX0JJVFNJWkUgKG1vZGUpID4gR0VUX01P REVfQklUU0laRSAoREZtb2RlKSkKICAgIHJldHVybiBmYWxzZTsKCiAgdW5zaWduZWQgSE9TVF9X SURFX0lOVCBpdmFsID0gMDsKCiAgbG9uZyByZXNbMl07CiAgcmVhbF90b190YXJnZXQgKHJlcywK CQkgIENPTlNUX0RPVUJMRV9SRUFMX1ZBTFVFICh2YWx1ZSksCgkJICBSRUFMX01PREVfRk9STUFU IChtb2RlKSk7CgogIGlmIChtb2RlID09IERGbW9kZSB8fCBtb2RlID09IEREbW9kZSkKICAgIHsK ICAgICAgaW50IG9yZGVyID0gQllURVNfQklHX0VORElBTiA/IDEgOiAwOwogICAgICBpdmFsID0g emV4dF9od2kgKHJlc1tvcmRlcl0sIDMyKTsKICAgICAgaXZhbCB8PSAoemV4dF9od2kgKHJlc1sx IC0gb3JkZXJdLCAzMikgPDwgMzIpOwogICAgfQogIGVsc2UKICAgICAgaXZhbCA9IHpleHRfaHdp IChyZXNbMF0sIDMyKTsKCiAgKmludHZhbCA9IGl2YWw7CiAgcmV0dXJuIHRydWU7Cn0KCi8qIFJl dHVybiBUUlVFIGlmIHJ0eCBYIGlzIGFuIGltbWVkaWF0ZSBjb25zdGFudCB0aGF0IGNhbiBiZSBt b3ZlZCB1c2luZyBhCiAgIHNpbmdsZSBNT1YoK01PVkspIGZvbGxvd2VkIGJ5IGFuIEZNT1YuICAq Lwpib29sCmFhcmNoNjRfZmxvYXRfY29uc3RfcnR4X3AgKHJ0eCB4KQp7CiAgbWFjaGluZV9tb2Rl IG1vZGUgPSBHRVRfTU9ERSAoeCk7CiAgaWYgKG1vZGUgPT0gVk9JRG1vZGUpCiAgICByZXR1cm4g ZmFsc2U7CgogIC8qIERldGVybWluZSB3aGV0aGVyIGl0J3MgY2hlYXBlciB0byB3cml0ZSBmbG9h dCBjb25zdGFudHMgYXMKICAgICBtb3YvbW92ayBwYWlycyBvdmVyIGxkci9hZHJwIHBhaXJzLiAg Ki8KICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGl2YWw7CgogIGlmIChDT05TVF9ET1VCTEVfUCAo eCkKICAgICAgJiYgU0NBTEFSX0ZMT0FUX01PREVfUCAobW9kZSkKICAgICAgJiYgYWFyY2g2NF9y ZWludGVycHJldF9mbG9hdF9hc19pbnQgKHgsICZpdmFsKSkKICAgIHsKICAgICAgbWFjaGluZV9t b2RlIGltb2RlID0ga25vd25fZXEgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCA4KSA/IERJbW9kZSA6 IFNJbW9kZTsKICAgICAgaW50IG51bV9pbnN0ciA9IGFhcmNoNjRfaW50ZXJuYWxfbW92X2ltbWVk aWF0ZQoJCQkoTlVMTF9SVFgsIGdlbl9pbnRfbW9kZSAoaXZhbCwgaW1vZGUpLCBmYWxzZSwgaW1v ZGUpOwogICAgICByZXR1cm4gbnVtX2luc3RyIDwgMzsKICAgIH0KCiAgcmV0dXJuIGZhbHNlOwp9 CgovKiBSZXR1cm4gVFJVRSBpZiBydHggWCBpcyBpbW1lZGlhdGUgY29uc3RhbnQgMC4wIChidXQg bm90IGluIERlY2ltYWwKICAgRmxvYXRpbmcgUG9pbnQpLiAgKi8KYm9vbAphYXJjaDY0X2Zsb2F0 X2NvbnN0X3plcm9fcnR4X3AgKHJ0eCB4KQp7CiAgLyogMC4wIGluIERlY2ltYWwgRmxvYXRpbmcg UG9pbnQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5ICMwIG9yCiAgICAgenIgYXMgb3VyIGNhbGxl cnMgZXhwZWN0LCBzbyBubyBuZWVkIHRvIGNoZWNrIHRoZSBhY3R1YWwKICAgICB2YWx1ZSBpZiBY IGlzIG9mIERlY2ltYWwgRmxvYXRpbmcgUG9pbnQgdHlwZS4gICovCiAgaWYgKEdFVF9NT0RFX0NM QVNTIChHRVRfTU9ERSAoeCkpID09IE1PREVfREVDSU1BTF9GTE9BVCkKICAgIHJldHVybiBmYWxz ZTsKCiAgaWYgKFJFQUxfVkFMVUVfTUlOVVNfWkVSTyAoKkNPTlNUX0RPVUJMRV9SRUFMX1ZBTFVF ICh4KSkpCiAgICByZXR1cm4gIUhPTk9SX1NJR05FRF9aRVJPUyAoR0VUX01PREUgKHgpKTsKICBy ZXR1cm4gcmVhbF9lcXVhbCAoQ09OU1RfRE9VQkxFX1JFQUxfVkFMVUUgKHgpLCAmZGNvbnN0MCk7 Cn0KCi8qIFJldHVybiBUUlVFIGlmIHJ0eCBYIGlzIGltbWVkaWF0ZSBjb25zdGFudCB0aGF0IGZp dHMgaW4gYSBzaW5nbGUKICAgTU9WSSBpbW1lZGlhdGUgb3BlcmF0aW9uLiAgKi8KYm9vbAphYXJj aDY0X2Nhbl9jb25zdF9tb3ZpX3J0eF9wIChydHggeCwgbWFjaGluZV9tb2RlIG1vZGUpCnsKICBp ZiAoIVRBUkdFVF9TSU1EKQogICAgIHJldHVybiBmYWxzZTsKCiAgbWFjaGluZV9tb2RlIHZtb2Rl OwogIHNjYWxhcl9pbnRfbW9kZSBpbW9kZTsKICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGl2YWw7 CgogIGlmIChDT05TVF9ET1VCTEVfUCAoeCkKICAgICAgJiYgU0NBTEFSX0ZMT0FUX01PREVfUCAo bW9kZSkpCiAgICB7CiAgICAgIGlmICghYWFyY2g2NF9yZWludGVycHJldF9mbG9hdF9hc19pbnQg KHgsICZpdmFsKSkKCXJldHVybiBmYWxzZTsKCiAgICAgIC8qIFdlIG1ha2UgYSBnZW5lcmFsIGV4 Y2VwdGlvbiBmb3IgMC4gICovCiAgICAgIGlmIChhYXJjaDY0X2Zsb2F0X2NvbnN0X3plcm9fcnR4 X3AgKHgpKQoJcmV0dXJuIHRydWU7CgogICAgICBpbW9kZSA9IGludF9tb2RlX2Zvcl9tb2RlICht b2RlKS5yZXF1aXJlICgpOwogICAgfQogIGVsc2UgaWYgKENPTlNUX0lOVF9QICh4KQoJICAgJiYg aXNfYSA8c2NhbGFyX2ludF9tb2RlPiAobW9kZSwgJmltb2RlKSkKICAgIGl2YWwgPSBJTlRWQUwg KHgpOwogIGVsc2UKICAgIHJldHVybiBmYWxzZTsKCiAgIC8qIHVzZSBhIDY0IGJpdCBtb2RlIGZv ciBldmVyeXRoaW5nIGV4Y2VwdCBmb3IgREkvREYvREQgbW9kZSwgd2hlcmUgd2UgdXNlCiAgICAg YSAxMjggYml0IHZlY3RvciBtb2RlLiAgKi8KICBpbnQgd2lkdGggPSBHRVRfTU9ERV9CSVRTSVpF IChpbW9kZSkgPT0gNjQgPyAxMjggOiA2NDsKCiAgdm1vZGUgPSBhYXJjaDY0X3NpbWRfY29udGFp bmVyX21vZGUgKGltb2RlLCB3aWR0aCk7CiAgcnR4IHZfb3AgPSBhYXJjaDY0X3NpbWRfZ2VuX2Nv bnN0X3ZlY3Rvcl9kdXAgKHZtb2RlLCBpdmFsKTsKCiAgcmV0dXJuIGFhcmNoNjRfc2ltZF92YWxp ZF9pbW1lZGlhdGUgKHZfb3AsIE5VTEwpOwp9CgoKLyogUmV0dXJuIHRoZSBmaXhlZCByZWdpc3Rl cnMgdXNlZCBmb3IgY29uZGl0aW9uIGNvZGVzLiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfZml4 ZWRfY29uZGl0aW9uX2NvZGVfcmVncyAodW5zaWduZWQgaW50ICpwMSwgdW5zaWduZWQgaW50ICpw MikKewogICpwMSA9IENDX1JFR05VTTsKICAqcDIgPSBJTlZBTElEX1JFR05VTTsKICByZXR1cm4g dHJ1ZTsKfQoKLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBjYWxsIGV4cGFuZGVycyBv ZiB0aGUgbWFjaGluZSBkZXNjcmlwdGlvbi4KICAgUkVTVUxUIGlzIHRoZSByZWdpc3RlciBpbiB3 aGljaCB0aGUgcmVzdWx0IGlzIHJldHVybmVkLiAgSXQncyBOVUxMIGZvcgogICAiY2FsbCIgYW5k ICJzaWJjYWxsIi4KICAgTUVNIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZnVuY3Rpb24gY2FsbC4K ICAgQ0FMTEVFX0FCSSBpcyBhIGNvbnN0X2ludCB0aGF0IGdpdmVzIHRoZSBhcm1fcGNzIG9mIHRo ZSBjYWxsZWUuCiAgIFNJQkNBTEwgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBjYWxs IGlzIG5vcm1hbCBjYWxsIG9yIHNpYmxpbmcgY2FsbC4KICAgSXQgd2lsbCBnZW5lcmF0ZSBkaWZm ZXJlbnQgcGF0dGVybiBhY2NvcmRpbmdseS4gICovCgp2b2lkCmFhcmNoNjRfZXhwYW5kX2NhbGwg KHJ0eCByZXN1bHQsIHJ0eCBtZW0sIHJ0eCBjYWxsZWVfYWJpLCBib29sIHNpYmNhbGwpCnsKICBy dHggY2FsbCwgY2FsbGVlLCB0bXA7CiAgcnR2ZWMgdmVjOwogIG1hY2hpbmVfbW9kZSBtb2RlOwoK ICBnY2NfYXNzZXJ0IChNRU1fUCAobWVtKSk7CiAgY2FsbGVlID0gWEVYUCAobWVtLCAwKTsKICBt b2RlID0gR0VUX01PREUgKGNhbGxlZSk7CiAgZ2NjX2Fzc2VydCAobW9kZSA9PSBQbW9kZSk7Cgog IC8qIERlY2lkZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgaW5kaXJlY3QgY2FsbHMgYnkgbG9hZGlu ZyB0aGUKICAgICBhZGRyZXNzIG9mIHRoZSBjYWxsZWUgaW50byBhIHJlZ2lzdGVyIGJlZm9yZSBw ZXJmb3JtaW5nCiAgICAgdGhlIGJyYW5jaC1hbmQtbGluay4gICovCiAgaWYgKFNZTUJPTF9SRUZf UCAoY2FsbGVlKQogICAgICA/IChhYXJjaDY0X2lzX2xvbmdfY2FsbF9wIChjYWxsZWUpCgkgfHwg YWFyY2g2NF9pc19ub3BsdF9jYWxsX3AgKGNhbGxlZSkpCiAgICAgIDogIVJFR19QIChjYWxsZWUp KQogICAgWEVYUCAobWVtLCAwKSA9IGZvcmNlX3JlZyAobW9kZSwgY2FsbGVlKTsKCiAgY2FsbCA9 IGdlbl9ydHhfQ0FMTCAoVk9JRG1vZGUsIG1lbSwgY29uc3QwX3J0eCk7CgogIGlmIChyZXN1bHQg IT0gTlVMTF9SVFgpCiAgICBjYWxsID0gZ2VuX3J0eF9TRVQgKHJlc3VsdCwgY2FsbCk7CgogIGlm IChzaWJjYWxsKQogICAgdG1wID0gcmV0X3J0eDsKICBlbHNlCiAgICB0bXAgPSBnZW5fcnR4X0NM T0JCRVIgKFZPSURtb2RlLCBnZW5fcnR4X1JFRyAoUG1vZGUsIExSX1JFR05VTSkpOwoKICBnY2Nf YXNzZXJ0IChDT05TVF9JTlRfUCAoY2FsbGVlX2FiaSkpOwogIGNhbGxlZV9hYmkgPSBnZW5fcnR4 X1VOU1BFQyAoREltb2RlLCBnZW5fcnR2ZWMgKDEsIGNhbGxlZV9hYmkpLAoJCQkgICAgICAgVU5T UEVDX0NBTExFRV9BQkkpOwoKICB2ZWMgPSBnZW5fcnR2ZWMgKDMsIGNhbGwsIGNhbGxlZV9hYmks IHRtcCk7CiAgY2FsbCA9IGdlbl9ydHhfUEFSQUxMRUwgKFZPSURtb2RlLCB2ZWMpOwoKICBhYXJj aDY0X2VtaXRfY2FsbF9pbnNuIChjYWxsKTsKfQoKLyogRW1pdCBjYWxsIGluc24gd2l0aCBQQVQg YW5kIGRvIGFhcmNoNjQtc3BlY2lmaWMgaGFuZGxpbmcuICAqLwoKdm9pZAphYXJjaDY0X2VtaXRf Y2FsbF9pbnNuIChydHggcGF0KQp7CiAgcnR4IGluc24gPSBlbWl0X2NhbGxfaW5zbiAocGF0KTsK CiAgcnR4ICpmdXNhZ2UgPSAmQ0FMTF9JTlNOX0ZVTkNUSU9OX1VTQUdFIChpbnNuKTsKICBjbG9i YmVyX3JlZyAoZnVzYWdlLCBnZW5fcnR4X1JFRyAod29yZF9tb2RlLCBJUDBfUkVHTlVNKSk7CiAg Y2xvYmJlcl9yZWcgKGZ1c2FnZSwgZ2VuX3J0eF9SRUcgKHdvcmRfbW9kZSwgSVAxX1JFR05VTSkp Owp9CgptYWNoaW5lX21vZGUKYWFyY2g2NF9zZWxlY3RfY2NfbW9kZSAoUlRYX0NPREUgY29kZSwg cnR4IHgsIHJ0eCB5KQp7CiAgbWFjaGluZV9tb2RlIG1vZGVfeCA9IEdFVF9NT0RFICh4KTsKICBy dHhfY29kZSBjb2RlX3ggPSBHRVRfQ09ERSAoeCk7CgogIC8qIEFsbCBmbG9hdGluZyBwb2ludCBj b21wYXJlcyByZXR1cm4gQ0NGUCBpZiBpdCBpcyBhbiBlcXVhbGl0eQogICAgIGNvbXBhcmlzb24s IGFuZCBDQ0ZQRSBvdGhlcndpc2UuICAqLwogIGlmIChHRVRfTU9ERV9DTEFTUyAobW9kZV94KSA9 PSBNT0RFX0ZMT0FUKQogICAgewogICAgICBzd2l0Y2ggKGNvZGUpCgl7CgljYXNlIEVROgoJY2Fz ZSBORToKCWNhc2UgVU5PUkRFUkVEOgoJY2FzZSBPUkRFUkVEOgoJY2FzZSBVTkxUOgoJY2FzZSBV TkxFOgoJY2FzZSBVTkdUOgoJY2FzZSBVTkdFOgoJY2FzZSBVTkVROgoJICByZXR1cm4gQ0NGUG1v ZGU7CgoJY2FzZSBMVDoKCWNhc2UgTEU6CgljYXNlIEdUOgoJY2FzZSBHRToKCWNhc2UgTFRHVDoK CSAgcmV0dXJuIENDRlBFbW9kZTsKCglkZWZhdWx0OgoJICBnY2NfdW5yZWFjaGFibGUgKCk7Cgl9 CiAgICB9CgogIC8qIEVxdWFsaXR5IGNvbXBhcmlzb25zIG9mIHNob3J0IG1vZGVzIGFnYWluc3Qg emVybyBjYW4gYmUgcGVyZm9ybWVkCiAgICAgdXNpbmcgdGhlIFRTVCBpbnN0cnVjdGlvbiB3aXRo IHRoZSBhcHByb3ByaWF0ZSBiaXRtYXNrLiAgKi8KICBpZiAoeSA9PSBjb25zdDBfcnR4ICYmIChS RUdfUCAoeCkgfHwgU1VCUkVHX1AgKHgpKQogICAgICAmJiAoY29kZSA9PSBFUSB8fCBjb2RlID09 IE5FKQogICAgICAmJiAobW9kZV94ID09IEhJbW9kZSB8fCBtb2RlX3ggPT0gUUltb2RlKSkKICAg IHJldHVybiBDQ19abW9kZTsKCiAgLyogU2ltaWxhcmx5LCBjb21wYXJpc29ucyBvZiB6ZXJvX2V4 dGVuZHMgZnJvbSBzaG9ydGVyIG1vZGVzIGNhbgogICAgIGJlIHBlcmZvcm1lZCB1c2luZyBhbiBB TkRTIHdpdGggYW4gaW1tZWRpYXRlIG1hc2suICAqLwogIGlmICh5ID09IGNvbnN0MF9ydHggJiYg Y29kZV94ID09IFpFUk9fRVhURU5ECiAgICAgICYmIChtb2RlX3ggPT0gU0ltb2RlIHx8IG1vZGVf eCA9PSBESW1vZGUpCiAgICAgICYmIChHRVRfTU9ERSAoWEVYUCAoeCwgMCkpID09IEhJbW9kZSB8 fCBHRVRfTU9ERSAoWEVYUCAoeCwgMCkpID09IFFJbW9kZSkKICAgICAgJiYgKGNvZGUgPT0gRVEg fHwgY29kZSA9PSBORSkpCiAgICByZXR1cm4gQ0NfWm1vZGU7CgogIC8qIFplcm8gZXh0cmFjdHMg c3VwcG9ydCBlcXVhbGl0eSBjb21wYXJpc29ucy4gICovCiAgaWYgKChtb2RlX3ggPT0gU0ltb2Rl IHx8IG1vZGVfeCA9PSBESW1vZGUpCiAgICAgICYmIHkgPT0gY29uc3QwX3J0eAogICAgICAmJiAo Y29kZV94ID09IFpFUk9fRVhUUkFDVCAmJiBDT05TVF9JTlRfUCAoWEVYUCAoeCwgMSkpCgkgICYm IENPTlNUX0lOVF9QIChYRVhQICh4LCAyKSkpCiAgICAgICYmIChjb2RlID09IEVRIHx8IGNvZGUg PT0gTkUpKQogICAgcmV0dXJuIENDX1ptb2RlOwoKICAvKiBBTkRTL0JJQ1MvVFNUIHN1cHBvcnQg ZXF1YWxpdHkgYW5kIGFsbCBzaWduZWQgY29tcGFyaXNvbnMuICAqLwogIGlmICgobW9kZV94ID09 IFNJbW9kZSB8fCBtb2RlX3ggPT0gREltb2RlKQogICAgICAmJiB5ID09IGNvbnN0MF9ydHgKICAg ICAgJiYgKGNvZGVfeCA9PSBBTkQpCiAgICAgICYmIChjb2RlID09IEVRIHx8IGNvZGUgPT0gTkUg fHwgY29kZSA9PSBMVCB8fCBjb2RlID09IEdFCgkgIHx8IGNvZGUgPT0gR1QgfHwgY29kZSA9PSBM RSkpCiAgICByZXR1cm4gQ0NfTlpWbW9kZTsKCiAgLyogQUREUy9TVUJTIGNvcnJlY3RseSBzZXQg TiBhbmQgWiBmbGFncy4gICovCiAgaWYgKChtb2RlX3ggPT0gU0ltb2RlIHx8IG1vZGVfeCA9PSBE SW1vZGUpCiAgICAgICYmIHkgPT0gY29uc3QwX3J0eAogICAgICAmJiAoY29kZSA9PSBFUSB8fCBj b2RlID09IE5FIHx8IGNvZGUgPT0gTFQgfHwgY29kZSA9PSBHRSkKICAgICAgJiYgKGNvZGVfeCA9 PSBQTFVTIHx8IGNvZGVfeCA9PSBNSU5VUyB8fCBjb2RlX3ggPT0gTkVHKSkKICAgIHJldHVybiBD Q19OWm1vZGU7CgogIC8qIEEgY29tcGFyZSB3aXRoIGEgc2hpZnRlZCBvcGVyYW5kLiAgQmVjYXVz ZSBvZiBjYW5vbmljYWxpemF0aW9uLAogICAgIHRoZSBjb21wYXJpc29uIHdpbGwgaGF2ZSB0byBi ZSBzd2FwcGVkIHdoZW4gd2UgZW1pdCB0aGUgYXNzZW1ibHkKICAgICBjb2RlLiAgKi8KICBpZiAo KG1vZGVfeCA9PSBTSW1vZGUgfHwgbW9kZV94ID09IERJbW9kZSkKICAgICAgJiYgKFJFR19QICh5 KSB8fCBTVUJSRUdfUCAoeSkgfHwgeSA9PSBjb25zdDBfcnR4KQogICAgICAmJiAoY29kZV94ID09 IEFTSElGVCB8fCBjb2RlX3ggPT0gQVNISUZUUlQKCSAgfHwgY29kZV94ID09IExTSElGVFJUCgkg IHx8IGNvZGVfeCA9PSBaRVJPX0VYVEVORCB8fCBjb2RlX3ggPT0gU0lHTl9FWFRFTkQpKQogICAg cmV0dXJuIENDX1NXUG1vZGU7CgogIC8qIFNpbWlsYXJseSBmb3IgYSBuZWdhdGVkIG9wZXJhbmQs IGJ1dCB3ZSBjYW4gb25seSBkbyB0aGlzIGZvcgogICAgIGVxdWFsaXRpZXMuICAqLwogIGlmICgo bW9kZV94ID09IFNJbW9kZSB8fCBtb2RlX3ggPT0gREltb2RlKQogICAgICAmJiAoUkVHX1AgKHkp IHx8IFNVQlJFR19QICh5KSkKICAgICAgJiYgKGNvZGUgPT0gRVEgfHwgY29kZSA9PSBORSkKICAg ICAgJiYgY29kZV94ID09IE5FRykKICAgIHJldHVybiBDQ19abW9kZTsKCiAgLyogQSB0ZXN0IGZv ciB1bnNpZ25lZCBvdmVyZmxvdyBmcm9tIGFuIGFkZGl0aW9uLiAgKi8KICBpZiAoKG1vZGVfeCA9 PSBESW1vZGUgfHwgbW9kZV94ID09IFRJbW9kZSkKICAgICAgJiYgKGNvZGUgPT0gTFRVIHx8IGNv ZGUgPT0gR0VVKQogICAgICAmJiBjb2RlX3ggPT0gUExVUwogICAgICAmJiBydHhfZXF1YWxfcCAo WEVYUCAoeCwgMCksIHkpKQogICAgcmV0dXJuIENDX0Ntb2RlOwoKICAvKiBBIHRlc3QgZm9yIHVu c2lnbmVkIG92ZXJmbG93IGZyb20gYW4gYWRkIHdpdGggY2FycnkuICAqLwogIGlmICgobW9kZV94 ID09IERJbW9kZSB8fCBtb2RlX3ggPT0gVEltb2RlKQogICAgICAmJiAoY29kZSA9PSBMVFUgfHwg Y29kZSA9PSBHRVUpCiAgICAgICYmIGNvZGVfeCA9PSBQTFVTCiAgICAgICYmIENPTlNUX1NDQUxB Ul9JTlRfUCAoeSkKICAgICAgJiYgKHJ0eF9tb2RlX3QgKHksIG1vZGVfeCkKCSAgPT0gKHdpOjpz aHdpICgxLCBtb2RlX3gpCgkgICAgICA8PCAoR0VUX01PREVfQklUU0laRSAobW9kZV94KS50b19j b25zdGFudCAoKSAvIDIpKSkpCiAgICByZXR1cm4gQ0NfQURDbW9kZTsKCiAgLyogQSB0ZXN0IGZv ciBzaWduZWQgb3ZlcmZsb3cuICAqLwogIGlmICgobW9kZV94ID09IERJbW9kZSB8fCBtb2RlX3gg PT0gVEltb2RlKQogICAgICAmJiBjb2RlID09IE5FCiAgICAgICYmIGNvZGVfeCA9PSBQTFVTCiAg ICAgICYmIEdFVF9DT0RFICh5KSA9PSBTSUdOX0VYVEVORCkKICAgIHJldHVybiBDQ19WbW9kZTsK CiAgLyogRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgcmV0dXJuIENDbW9kZS4gICovCiAgcmV0dXJuIEND bW9kZTsKfQoKc3RhdGljIGludAphYXJjaDY0X2dldF9jb25kaXRpb25fY29kZV8xIChtYWNoaW5l X21vZGUsIGVudW0gcnR4X2NvZGUpOwoKaW50CmFhcmNoNjRfZ2V0X2NvbmRpdGlvbl9jb2RlIChy dHggeCkKewogIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKFhFWFAgKHgsIDApKTsKICBl bnVtIHJ0eF9jb2RlIGNvbXBfY29kZSA9IEdFVF9DT0RFICh4KTsKCiAgaWYgKEdFVF9NT0RFX0NM QVNTIChtb2RlKSAhPSBNT0RFX0NDKQogICAgbW9kZSA9IFNFTEVDVF9DQ19NT0RFIChjb21wX2Nv ZGUsIFhFWFAgKHgsIDApLCBYRVhQICh4LCAxKSk7CiAgcmV0dXJuIGFhcmNoNjRfZ2V0X2NvbmRp dGlvbl9jb2RlXzEgKG1vZGUsIGNvbXBfY29kZSk7Cn0KCnN0YXRpYyBpbnQKYWFyY2g2NF9nZXRf Y29uZGl0aW9uX2NvZGVfMSAobWFjaGluZV9tb2RlIG1vZGUsIGVudW0gcnR4X2NvZGUgY29tcF9j b2RlKQp7CiAgc3dpdGNoIChtb2RlKQogICAgewogICAgY2FzZSBFX0NDRlBtb2RlOgogICAgY2Fz ZSBFX0NDRlBFbW9kZToKICAgICAgc3dpdGNoIChjb21wX2NvZGUpCgl7CgljYXNlIEdFOiByZXR1 cm4gQUFSQ0g2NF9HRTsKCWNhc2UgR1Q6IHJldHVybiBBQVJDSDY0X0dUOwoJY2FzZSBMRTogcmV0 dXJuIEFBUkNINjRfTFM7CgljYXNlIExUOiByZXR1cm4gQUFSQ0g2NF9NSTsKCWNhc2UgTkU6IHJl dHVybiBBQVJDSDY0X05FOwoJY2FzZSBFUTogcmV0dXJuIEFBUkNINjRfRVE7CgljYXNlIE9SREVS RUQ6IHJldHVybiBBQVJDSDY0X1ZDOwoJY2FzZSBVTk9SREVSRUQ6IHJldHVybiBBQVJDSDY0X1ZT OwoJY2FzZSBVTkxUOiByZXR1cm4gQUFSQ0g2NF9MVDsKCWNhc2UgVU5MRTogcmV0dXJuIEFBUkNI NjRfTEU7CgljYXNlIFVOR1Q6IHJldHVybiBBQVJDSDY0X0hJOwoJY2FzZSBVTkdFOiByZXR1cm4g QUFSQ0g2NF9QTDsKCWRlZmF1bHQ6IHJldHVybiAtMTsKCX0KICAgICAgYnJlYWs7CgogICAgY2Fz ZSBFX0NDbW9kZToKICAgICAgc3dpdGNoIChjb21wX2NvZGUpCgl7CgljYXNlIE5FOiByZXR1cm4g QUFSQ0g2NF9ORTsKCWNhc2UgRVE6IHJldHVybiBBQVJDSDY0X0VROwoJY2FzZSBHRTogcmV0dXJu IEFBUkNINjRfR0U7CgljYXNlIEdUOiByZXR1cm4gQUFSQ0g2NF9HVDsKCWNhc2UgTEU6IHJldHVy biBBQVJDSDY0X0xFOwoJY2FzZSBMVDogcmV0dXJuIEFBUkNINjRfTFQ7CgljYXNlIEdFVTogcmV0 dXJuIEFBUkNINjRfQ1M7CgljYXNlIEdUVTogcmV0dXJuIEFBUkNINjRfSEk7CgljYXNlIExFVTog cmV0dXJuIEFBUkNINjRfTFM7CgljYXNlIExUVTogcmV0dXJuIEFBUkNINjRfQ0M7CglkZWZhdWx0 OiByZXR1cm4gLTE7Cgl9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgRV9DQ19TV1Btb2RlOgogICAg ICBzd2l0Y2ggKGNvbXBfY29kZSkKCXsKCWNhc2UgTkU6IHJldHVybiBBQVJDSDY0X05FOwoJY2Fz ZSBFUTogcmV0dXJuIEFBUkNINjRfRVE7CgljYXNlIEdFOiByZXR1cm4gQUFSQ0g2NF9MRTsKCWNh c2UgR1Q6IHJldHVybiBBQVJDSDY0X0xUOwoJY2FzZSBMRTogcmV0dXJuIEFBUkNINjRfR0U7Cglj YXNlIExUOiByZXR1cm4gQUFSQ0g2NF9HVDsKCWNhc2UgR0VVOiByZXR1cm4gQUFSQ0g2NF9MUzsK CWNhc2UgR1RVOiByZXR1cm4gQUFSQ0g2NF9DQzsKCWNhc2UgTEVVOiByZXR1cm4gQUFSQ0g2NF9D UzsKCWNhc2UgTFRVOiByZXR1cm4gQUFSQ0g2NF9ISTsKCWRlZmF1bHQ6IHJldHVybiAtMTsKCX0K ICAgICAgYnJlYWs7CgogICAgY2FzZSBFX0NDX05aQ21vZGU6CiAgICAgIHN3aXRjaCAoY29tcF9j b2RlKQoJewoJY2FzZSBORTogcmV0dXJuIEFBUkNINjRfTkU7IC8qID0gYW55ICovCgljYXNlIEVR OiByZXR1cm4gQUFSQ0g2NF9FUTsgLyogPSBub25lICovCgljYXNlIEdFOiByZXR1cm4gQUFSQ0g2 NF9QTDsgLyogPSBuZnJzdCAqLwoJY2FzZSBMVDogcmV0dXJuIEFBUkNINjRfTUk7IC8qID0gZmly c3QgKi8KCWNhc2UgR0VVOiByZXR1cm4gQUFSQ0g2NF9DUzsgLyogPSBubGFzdCAqLwoJY2FzZSBH VFU6IHJldHVybiBBQVJDSDY0X0hJOyAvKiA9IHBtb3JlICovCgljYXNlIExFVTogcmV0dXJuIEFB UkNINjRfTFM7IC8qID0gcGxhc3QgKi8KCWNhc2UgTFRVOiByZXR1cm4gQUFSQ0g2NF9DQzsgLyog PSBsYXN0ICovCglkZWZhdWx0OiByZXR1cm4gLTE7Cgl9CiAgICAgIGJyZWFrOwoKICAgIGNhc2Ug RV9DQ19OWlZtb2RlOgogICAgICBzd2l0Y2ggKGNvbXBfY29kZSkKCXsKCWNhc2UgTkU6IHJldHVy biBBQVJDSDY0X05FOwoJY2FzZSBFUTogcmV0dXJuIEFBUkNINjRfRVE7CgljYXNlIEdFOiByZXR1 cm4gQUFSQ0g2NF9QTDsKCWNhc2UgTFQ6IHJldHVybiBBQVJDSDY0X01JOwoJY2FzZSBHVDogcmV0 dXJuIEFBUkNINjRfR1Q7CgljYXNlIExFOiByZXR1cm4gQUFSQ0g2NF9MRTsKCWRlZmF1bHQ6IHJl dHVybiAtMTsKCX0KICAgICAgYnJlYWs7CgogICAgY2FzZSBFX0NDX05abW9kZToKICAgICAgc3dp dGNoIChjb21wX2NvZGUpCgl7CgljYXNlIE5FOiByZXR1cm4gQUFSQ0g2NF9ORTsKCWNhc2UgRVE6 IHJldHVybiBBQVJDSDY0X0VROwoJY2FzZSBHRTogcmV0dXJuIEFBUkNINjRfUEw7CgljYXNlIExU OiByZXR1cm4gQUFSQ0g2NF9NSTsKCWRlZmF1bHQ6IHJldHVybiAtMTsKCX0KICAgICAgYnJlYWs7 CgogICAgY2FzZSBFX0NDX1ptb2RlOgogICAgICBzd2l0Y2ggKGNvbXBfY29kZSkKCXsKCWNhc2Ug TkU6IHJldHVybiBBQVJDSDY0X05FOwoJY2FzZSBFUTogcmV0dXJuIEFBUkNINjRfRVE7CglkZWZh dWx0OiByZXR1cm4gLTE7Cgl9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgRV9DQ19DbW9kZToKICAg ICAgc3dpdGNoIChjb21wX2NvZGUpCgl7CgljYXNlIExUVTogcmV0dXJuIEFBUkNINjRfQ1M7Cglj YXNlIEdFVTogcmV0dXJuIEFBUkNINjRfQ0M7CglkZWZhdWx0OiByZXR1cm4gLTE7Cgl9CiAgICAg IGJyZWFrOwoKICAgIGNhc2UgRV9DQ19BRENtb2RlOgogICAgICBzd2l0Y2ggKGNvbXBfY29kZSkK CXsKCWNhc2UgR0VVOiByZXR1cm4gQUFSQ0g2NF9DUzsKCWNhc2UgTFRVOiByZXR1cm4gQUFSQ0g2 NF9DQzsKCWRlZmF1bHQ6IHJldHVybiAtMTsKCX0KICAgICAgYnJlYWs7CgogICAgY2FzZSBFX0ND X1Ztb2RlOgogICAgICBzd2l0Y2ggKGNvbXBfY29kZSkKCXsKCWNhc2UgTkU6IHJldHVybiBBQVJD SDY0X1ZTOwoJY2FzZSBFUTogcmV0dXJuIEFBUkNINjRfVkM7CglkZWZhdWx0OiByZXR1cm4gLTE7 Cgl9CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAtMTsKICAgIH0KCiAg cmV0dXJuIC0xOwp9Cgpib29sCmFhcmNoNjRfY29uc3RfdmVjX2FsbF9zYW1lX2luX3JhbmdlX3Ag KHJ0eCB4LAoJCQkJICAgICAgIEhPU1RfV0lERV9JTlQgbWludmFsLAoJCQkJICAgICAgIEhPU1Rf V0lERV9JTlQgbWF4dmFsKQp7CiAgcnR4IGVsdDsKICByZXR1cm4gKGNvbnN0X3ZlY19kdXBsaWNh dGVfcCAoeCwgJmVsdCkKCSAgJiYgQ09OU1RfSU5UX1AgKGVsdCkKCSAgJiYgSU5fUkFOR0UgKElO VFZBTCAoZWx0KSwgbWludmFsLCBtYXh2YWwpKTsKfQoKYm9vbAphYXJjaDY0X2NvbnN0X3ZlY19h bGxfc2FtZV9pbnRfcCAocnR4IHgsIEhPU1RfV0lERV9JTlQgdmFsKQp7CiAgcmV0dXJuIGFhcmNo NjRfY29uc3RfdmVjX2FsbF9zYW1lX2luX3JhbmdlX3AgKHgsIHZhbCwgdmFsKTsKfQoKLyogUmV0 dXJuIHRydWUgaWYgVkVDIGlzIGEgY29uc3RhbnQgaW4gd2hpY2ggZXZlcnkgZWxlbWVudCBpcyBp biB0aGUgcmFuZ2UKICAgW01JTlZBTCwgTUFYVkFMXS4gIFRoZSBlbGVtZW50cyBkbyBub3QgbmVl ZCB0byBoYXZlIHRoZSBzYW1lIHZhbHVlLiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfY29uc3Rf dmVjX2FsbF9pbl9yYW5nZV9wIChydHggdmVjLAoJCQkJICBIT1NUX1dJREVfSU5UIG1pbnZhbCwK CQkJCSAgSE9TVF9XSURFX0lOVCBtYXh2YWwpCnsKICBpZiAoIUNPTlNUX1ZFQ1RPUl9QICh2ZWMp CiAgICAgIHx8IEdFVF9NT0RFX0NMQVNTIChHRVRfTU9ERSAodmVjKSkgIT0gTU9ERV9WRUNUT1Jf SU5UKQogICAgcmV0dXJuIGZhbHNlOwoKICBpbnQgbnVuaXRzOwogIGlmICghQ09OU1RfVkVDVE9S X1NURVBQRURfUCAodmVjKSkKICAgIG51bml0cyA9IGNvbnN0X3ZlY3Rvcl9lbmNvZGVkX25lbHRz ICh2ZWMpOwogIGVsc2UgaWYgKCFDT05TVF9WRUNUT1JfTlVOSVRTICh2ZWMpLmlzX2NvbnN0YW50 ICgmbnVuaXRzKSkKICAgIHJldHVybiBmYWxzZTsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW5p dHM7IGkrKykKICAgIHsKICAgICAgcnR4IHZlY19lbGVtID0gQ09OU1RfVkVDVE9SX0VMVCAodmVj LCBpKTsKICAgICAgaWYgKCFDT05TVF9JTlRfUCAodmVjX2VsZW0pCgkgIHx8ICFJTl9SQU5HRSAo SU5UVkFMICh2ZWNfZWxlbSksIG1pbnZhbCwgbWF4dmFsKSkKCXJldHVybiBmYWxzZTsKICAgIH0K ICByZXR1cm4gdHJ1ZTsKfQoKLyogTiBaIEMgVi4gICovCiNkZWZpbmUgQUFSQ0g2NF9DQ19WIDEK I2RlZmluZSBBQVJDSDY0X0NDX0MgKDEgPDwgMSkKI2RlZmluZSBBQVJDSDY0X0NDX1ogKDEgPDwg MikKI2RlZmluZSBBQVJDSDY0X0NDX04gKDEgPDwgMykKCi8qIE4gWiBDIFYgZmxhZ3MgZm9yIGNj bXAuICBJbmRleGVkIGJ5IEFBUkNINjRfQ09ORF9DT0RFLiAgKi8Kc3RhdGljIGNvbnN0IGludCBh YXJjaDY0X256Y3ZfY29kZXNbXSA9CnsKICAwLAkJLyogRVEsIFogPT0gMS4gICovCiAgQUFSQ0g2 NF9DQ19aLAkvKiBORSwgWiA9PSAwLiAgKi8KICAwLAkJLyogQ1MsIEMgPT0gMS4gICovCiAgQUFS Q0g2NF9DQ19DLAkvKiBDQywgQyA9PSAwLiAgKi8KICAwLAkJLyogTUksIE4gPT0gMS4gICovCiAg QUFSQ0g2NF9DQ19OLCAvKiBQTCwgTiA9PSAwLiAgKi8KICAwLAkJLyogVlMsIFYgPT0gMS4gICov CiAgQUFSQ0g2NF9DQ19WLCAvKiBWQywgViA9PSAwLiAgKi8KICAwLAkJLyogSEksIEMgPT0xICYm IFogPT0gMC4gICovCiAgQUFSQ0g2NF9DQ19DLAkvKiBMUywgIShDID09IDEgJiYgWiA9PSAwKS4g ICovCiAgQUFSQ0g2NF9DQ19WLAkvKiBHRSwgTiA9PSBWLiAgKi8KICAwLAkJLyogTFQsIE4gIT0g Vi4gICovCiAgQUFSQ0g2NF9DQ19aLCAvKiBHVCwgWiA9PSAwICYmIE4gPT0gVi4gICovCiAgMCwJ CS8qIExFLCAhKFogPT0gMCAmJiBOID09IFYpLiAgKi8KICAwLAkJLyogQUwsIEFueS4gICovCiAg MAkJLyogTlYsIEFueS4gICovCn07CgovKiBQcmludCBmbG9hdGluZy1wb2ludCB2ZWN0b3IgaW1t ZWRpYXRlIG9wZXJhbmQgWCB0byBGLCBuZWdhdGluZyBpdAogICBmaXJzdCBpZiBORUdBVEUgaXMg dHJ1ZS4gIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGl0IGlzbid0CiAgIGEgY29u c3RhbnQgd2UgY2FuIGhhbmRsZS4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3ByaW50X3ZlY3Rv cl9mbG9hdF9vcGVyYW5kIChGSUxFICpmLCBydHggeCwgYm9vbCBuZWdhdGUpCnsKICBydHggZWx0 OwoKICBpZiAoIWNvbnN0X3ZlY19kdXBsaWNhdGVfcCAoeCwgJmVsdCkpCiAgICByZXR1cm4gZmFs c2U7CgogIFJFQUxfVkFMVUVfVFlQRSByID0gKkNPTlNUX0RPVUJMRV9SRUFMX1ZBTFVFIChlbHQp OwogIGlmIChuZWdhdGUpCiAgICByID0gcmVhbF92YWx1ZV9uZWdhdGUgKCZyKTsKCiAgLyogSGFu ZGxlIHRoZSBTVkUgc2luZ2xlLWJpdCBpbW1lZGlhdGVzIHNwZWNpYWxseSwgc2luY2UgdGhleSBo YXZlIGEKICAgICBmaXhlZCBmb3JtIGluIHRoZSBhc3NlbWJseSBzeW50YXguICAqLwogIGlmIChy ZWFsX2VxdWFsICgmciwgJmRjb25zdDApKQogICAgYXNtX2ZwcmludGYgKGYsICIwLjAiKTsKICBl bHNlIGlmIChyZWFsX2VxdWFsICgmciwgJmRjb25zdDIpKQogICAgYXNtX2ZwcmludGYgKGYsICIy LjAiKTsKICBlbHNlIGlmIChyZWFsX2VxdWFsICgmciwgJmRjb25zdDEpKQogICAgYXNtX2Zwcmlu dGYgKGYsICIxLjAiKTsKICBlbHNlIGlmIChyZWFsX2VxdWFsICgmciwgJmRjb25zdGhhbGYpKQog ICAgYXNtX2ZwcmludGYgKGYsICIwLjUiKTsKICBlbHNlCiAgICB7CiAgICAgIGNvbnN0IGludCBi dWZfc2l6ZSA9IDIwOwogICAgICBjaGFyIGZsb2F0X2J1ZltidWZfc2l6ZV0gPSB7J1wwJ307CiAg ICAgIHJlYWxfdG9fZGVjaW1hbF9mb3JfbW9kZSAoZmxvYXRfYnVmLCAmciwgYnVmX3NpemUsIGJ1 Zl9zaXplLAoJCQkJMSwgR0VUX01PREUgKGVsdCkpOwogICAgICBhc21fZnByaW50ZiAoZiwgIiVz IiwgZmxvYXRfYnVmKTsKICAgIH0KCiAgcmV0dXJuIHRydWU7Cn0KCi8qIFJldHVybiB0aGUgZXF1 aXZhbGVudCBsZXR0ZXIgZm9yIHNpemUuICAqLwpzdGF0aWMgY2hhcgpzaXpldG9jaGFyIChpbnQg c2l6ZSkKewogIHN3aXRjaCAoc2l6ZSkKICAgIHsKICAgIGNhc2UgNjQ6IHJldHVybiAnZCc7CiAg ICBjYXNlIDMyOiByZXR1cm4gJ3MnOwogICAgY2FzZSAxNjogcmV0dXJuICdoJzsKICAgIGNhc2Ug OCA6IHJldHVybiAnYic7CiAgICBkZWZhdWx0OiBnY2NfdW5yZWFjaGFibGUgKCk7CiAgICB9Cn0K Ci8qIFByaW50IG9wZXJhbmQgWCB0byBmaWxlIEYgaW4gYSB0YXJnZXQgc3BlY2lmaWMgbWFubmVy IGFjY29yZGluZyB0byBDT0RFLgogICBUaGUgYWNjZXB0YWJsZSBmb3JtYXR0aW5nIGNvbW1hbmRz IGdpdmVuIGJ5IENPREUgYXJlOgogICAgICdjJzoJCUFuIGludGVnZXIgb3Igc3ltYm9sIGFkZHJl c3Mgd2l0aG91dCBhIHByZWNlZGluZyAjCgkJCXNpZ24uCiAgICAgJ0MnOgkJVGFrZSB0aGUgZHVw bGljYXRlZCBlbGVtZW50IGluIGEgdmVjdG9yIGNvbnN0YW50CgkJCWFuZCBwcmludCBpdCBpbiBo ZXguCiAgICAgJ0QnOgkJVGFrZSB0aGUgZHVwbGljYXRlZCBlbGVtZW50IGluIGEgdmVjdG9yIGNv bnN0YW50CgkJCWFuZCBwcmludCBpdCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCBpbiBkZWNpbWFs LgogICAgICdlJzoJCVByaW50IHRoZSBzaWduL3plcm8tZXh0ZW5kIHNpemUgYXMgYSBjaGFyYWN0 ZXIgOC0+YiwKCQkJMTYtPmgsIDMyLT53LiAgQ2FuIGFsc28gYmUgdXNlZCBmb3IgbWFza3M6CgkJ CTB4ZmYtPmIsIDB4ZmZmZi0+aCwgMHhmZmZmZmZmZi0+dy4KICAgICAnSSc6CQlJZiB0aGUgb3Bl cmFuZCBpcyBhIGR1cGxpY2F0ZWQgdmVjdG9yIGNvbnN0YW50LAoJCQlyZXBsYWNlIGl0IHdpdGgg dGhlIGR1cGxpY2F0ZWQgc2NhbGFyLiAgSWYgdGhlCgkJCW9wZXJhbmQgaXMgdGhlbiBhIGZsb2F0 aW5nLXBvaW50IGNvbnN0YW50LCByZXBsYWNlCgkJCWl0IHdpdGggdGhlIGludGVnZXIgYml0IHJl cHJlc2VudGF0aW9uLiAgUHJpbnQgdGhlCgkJCXRyYW5zZm9ybWVkIGNvbnN0YW50IGFzIGEgc2ln bmVkIGRlY2ltYWwgbnVtYmVyLgogICAgICdwJzoJCVByaW50cyBOIHN1Y2ggdGhhdCAyXk4gPT0g WCAoWCBtdXN0IGJlIHBvd2VyIG9mIDIgYW5kCgkJCWNvbnN0IGludCkuCiAgICAgJ1AnOgkJUHJp bnQgdGhlIG51bWJlciBvZiBub24temVybyBiaXRzIGluIFggKGEgY29uc3RfaW50KS4KICAgICAn SCc6CQlQcmludCB0aGUgaGlnaGVyIG51bWJlcmVkIHJlZ2lzdGVyIG9mIGEgcGFpciAoVEltb2Rl KQoJCQlvZiByZWdzLgogICAgICdtJzoJCVByaW50IGEgY29uZGl0aW9uIChlcSwgbmUsIGV0Yyku CiAgICAgJ00nOgkJU2FtZSBhcyAnbScsIGJ1dCBpbnZlcnQgY29uZGl0aW9uLgogICAgICdOJzoJ CVRha2UgdGhlIGR1cGxpY2F0ZWQgZWxlbWVudCBpbiBhIHZlY3RvciBjb25zdGFudAoJCQlhbmQg cHJpbnQgdGhlIG5lZ2F0aXZlIG9mIGl0IGluIGRlY2ltYWwuCiAgICAgJ2IvaC9zL2QvcSc6CVBy aW50IGEgc2NhbGFyIEZQL1NJTUQgcmVnaXN0ZXIgbmFtZS4KICAgICAnUy9UL1UvVic6CQlQcmlu dCBhIEZQL1NJTUQgcmVnaXN0ZXIgbmFtZSBmb3IgYSByZWdpc3RlciBsaXN0LgoJCQlUaGUgcmVn aXN0ZXIgcHJpbnRlZCBpcyB0aGUgRlAvU0lNRCByZWdpc3RlciBuYW1lCgkJCW9mIFggKyAwLzEv Mi8zIGZvciBTL1QvVS9WLgogICAgICdSJzoJCVByaW50IGEgc2NhbGFyIEludGVnZXIvRlAvU0lN RCByZWdpc3RlciBuYW1lICsgMS4KICAgICAnWCc6CQlQcmludCBib3R0b20gMTYgYml0cyBvZiBp bnRlZ2VyIGNvbnN0YW50IGluIGhleC4KICAgICAndy94JzoJCVByaW50IGEgZ2VuZXJhbCByZWdp c3RlciBuYW1lIG9yIHRoZSB6ZXJvIHJlZ2lzdGVyCgkJCSgzMi1iaXQgb3IgNjQtYml0KS4KICAg ICAnMCc6CQlQcmludCBhIG5vcm1hbCBvcGVyYW5kLCBpZiBpdCdzIGEgZ2VuZXJhbCByZWdpc3Rl ciwKCQkJdGhlbiB3ZSBhc3N1bWUgREltb2RlLgogICAgICdrJzoJCVByaW50IE5aQ1YgZm9yIGNv bmRpdGlvbmFsIGNvbXBhcmUgaW5zdHJ1Y3Rpb25zLgogICAgICdBJzoJCU91dHB1dCBhZGRyZXNz IGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgZmlyc3QKCQkJYXJndW1lbnQgb2YgWCwgc3BlY2lm eWluZyBhIHJlbG9jYXRpb24gb2Zmc2V0CgkJCWlmIGFwcHJvcHJpYXRlLgogICAgICdMJzoJCU91 dHB1dCBjb25zdGFudCBhZGRyZXNzIHNwZWNpZmllZCBieSBYCgkJCXdpdGggYSByZWxvY2F0aW9u IG9mZnNldCBpZiBhcHByb3ByaWF0ZS4KICAgICAnRyc6CQlQcmludHMgYWRkcmVzcyBvZiBYLCBz cGVjaWZ5aW5nIGEgUEMgcmVsYXRpdmUKCQkJcmVsb2NhdGlvbiBtb2RlIGlmIGFwcHJvcHJpYXRl LgogICAgICd5JzoJCU91dHB1dCBhZGRyZXNzIG9mIExEUCBvciBTVFAgLSB0aGlzIGlzIHVzZWQg Zm9yCgkJCXNvbWUgTERQL1NUUHMgd2hpY2ggZG9uJ3QgdXNlIGEgUEFSQUxMRUwgaW4gdGhlaXIK CQkJcGF0dGVybiAoc28gdGhlIG1vZGUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQpLgogICAgICd6JzoJ CU91dHB1dCBhZGRyZXNzIG9mIGEgdHlwaWNhbCBMRFAgb3IgU1RQLiAgKi8KCnN0YXRpYyB2b2lk CmFhcmNoNjRfcHJpbnRfb3BlcmFuZCAoRklMRSAqZiwgcnR4IHgsIGludCBjb2RlKQp7CiAgcnR4 IGVsdDsKICBzd2l0Y2ggKGNvZGUpCiAgICB7CiAgICBjYXNlICdjJzoKICAgICAgaWYgKENPTlNU X0lOVF9QICh4KSkKCWZwcmludGYgKGYsIEhPU1RfV0lERV9JTlRfUFJJTlRfREVDLCBJTlRWQUwg KHgpKTsKICAgICAgZWxzZQoJewoJICBwb2x5X2ludDY0IG9mZnNldDsKCSAgcnR4IGJhc2UgPSBz dHJpcF9vZmZzZXRfYW5kX3NhbHQgKHgsICZvZmZzZXQpOwoJICBpZiAoU1lNQk9MX1JFRl9QIChi YXNlKSkKCSAgICBvdXRwdXRfYWRkcl9jb25zdCAoZiwgeCk7CgkgIGVsc2UKCSAgICBvdXRwdXRf b3BlcmFuZF9sb3NzYWdlICgidW5zdXBwb3J0ZWQgb3BlcmFuZCBmb3IgY29kZSAnJWMnIiwgY29k ZSk7Cgl9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ2UnOgogICAgICB7Cgl4ID0gdW53cmFwX2Nv bnN0X3ZlY19kdXBsaWNhdGUgKHgpOwoJaWYgKCFDT05TVF9JTlRfUCAoeCkpCgkgIHsKCSAgICBv dXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5kIGZvciAnJSUlYyciLCBjb2Rl KTsKCSAgICByZXR1cm47CgkgIH0KCglIT1NUX1dJREVfSU5UIHZhbCA9IElOVFZBTCAoeCk7Cglp ZiAoKHZhbCAmIH43KSA9PSA4IHx8IHZhbCA9PSAweGZmKQoJICBmcHV0YyAoJ2InLCBmKTsKCWVs c2UgaWYgKCh2YWwgJiB+NykgPT0gMTYgfHwgdmFsID09IDB4ZmZmZikKCSAgZnB1dGMgKCdoJywg Zik7CgllbHNlIGlmICgodmFsICYgfjcpID09IDMyIHx8IHZhbCA9PSAweGZmZmZmZmZmKQoJICBm cHV0YyAoJ3cnLCBmKTsKCWVsc2UKCSAgewoJICAgIG91dHB1dF9vcGVyYW5kX2xvc3NhZ2UgKCJp bnZhbGlkIG9wZXJhbmQgZm9yICclJSVjJyIsIGNvZGUpOwoJICAgIHJldHVybjsKCSAgfQogICAg ICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ3AnOgogICAgICB7CglpbnQgbjsKCglpZiAoIUNP TlNUX0lOVF9QICh4KSB8fCAobiA9IGV4YWN0X2xvZzIgKElOVFZBTCAoeCkpKSA8IDApCgkgIHsK CSAgICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5kIGZvciAnJSUlYyci LCBjb2RlKTsKCSAgICByZXR1cm47CgkgIH0KCglhc21fZnByaW50ZiAoZiwgIiVkIiwgbik7CiAg ICAgIH0KICAgICAgYnJlYWs7CgogICAgY2FzZSAnUCc6CiAgICAgIGlmICghQ09OU1RfSU5UX1Ag KHgpKQoJewoJICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5kIGZvciAn JSUlYyciLCBjb2RlKTsKCSAgcmV0dXJuOwoJfQoKICAgICAgYXNtX2ZwcmludGYgKGYsICIldSIs IHBvcGNvdW50X2h3aSAoSU5UVkFMICh4KSkpOwogICAgICBicmVhazsKCiAgICBjYXNlICdIJzoK ICAgICAgaWYgKHggPT0gY29uc3QwX3J0eCkKCXsKCSAgYXNtX2ZwcmludGYgKGYsICJ4enIiKTsK CSAgYnJlYWs7Cgl9CgogICAgICBpZiAoIVJFR19QICh4KSB8fCAhR1BfUkVHTlVNX1AgKFJFR05P ICh4KSArIDEpKQoJewoJICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5k IGZvciAnJSUlYyciLCBjb2RlKTsKCSAgcmV0dXJuOwoJfQoKICAgICAgYXNtX2ZwcmludGYgKGYs ICIlcyIsIHJlZ19uYW1lcyBbUkVHTk8gKHgpICsgMV0pOwogICAgICBicmVhazsKCiAgICBjYXNl ICdJJzoKICAgICAgewoJeCA9IGFhcmNoNjRfYml0X3JlcHJlc2VudGF0aW9uICh1bndyYXBfY29u c3RfdmVjX2R1cGxpY2F0ZSAoeCkpOwoJaWYgKENPTlNUX0lOVF9QICh4KSkKCSAgYXNtX2Zwcmlu dGYgKGYsICIld2QiLCBJTlRWQUwgKHgpKTsKCWVsc2UKCSAgewoJICAgIG91dHB1dF9vcGVyYW5k X2xvc3NhZ2UgKCJpbnZhbGlkIG9wZXJhbmQgZm9yICclJSVjJyIsIGNvZGUpOwoJICAgIHJldHVy bjsKCSAgfQoJYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlICdNJzoKICAgIGNhc2UgJ20nOgogICAg ICB7CiAgICAgICAgaW50IGNvbmRfY29kZTsKCS8qIENPTlNUX1RSVUVfUlRYIG1lYW5zIGFsL252 IChhbCBpcyB0aGUgZGVmYXVsdCwgZG9uJ3QgcHJpbnQgaXQpLiAgKi8KCWlmICh4ID09IGNvbnN0 X3RydWVfcnR4KQoJICB7CgkgICAgaWYgKGNvZGUgPT0gJ00nKQoJICAgICAgZnB1dHMgKCJudiIs IGYpOwoJICAgIHJldHVybjsKCSAgfQoKICAgICAgICBpZiAoIUNPTVBBUklTT05fUCAoeCkpCgkg IHsKCSAgICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5kIGZvciAnJSUl YyciLCBjb2RlKTsKCSAgICByZXR1cm47CgkgIH0KCiAgICAgICAgY29uZF9jb2RlID0gYWFyY2g2 NF9nZXRfY29uZGl0aW9uX2NvZGUgKHgpOwogICAgICAgIGdjY19hc3NlcnQgKGNvbmRfY29kZSA+ PSAwKTsKCWlmIChjb2RlID09ICdNJykKCSAgY29uZF9jb2RlID0gQUFSQ0g2NF9JTlZFUlNFX0NP TkRJVElPTl9DT0RFIChjb25kX2NvZGUpOwoJaWYgKEdFVF9NT0RFIChYRVhQICh4LCAwKSkgPT0g Q0NfTlpDbW9kZSkKCSAgZnB1dHMgKGFhcmNoNjRfc3ZlX2NvbmRpdGlvbl9jb2Rlc1tjb25kX2Nv ZGVdLCBmKTsKCWVsc2UKCSAgZnB1dHMgKGFhcmNoNjRfY29uZGl0aW9uX2NvZGVzW2NvbmRfY29k ZV0sIGYpOwogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ04nOgogICAgICBpZiAoIWNv bnN0X3ZlY19kdXBsaWNhdGVfcCAoeCwgJmVsdCkpCgl7CgkgIG91dHB1dF9vcGVyYW5kX2xvc3Nh Z2UgKCJpbnZhbGlkIHZlY3RvciBjb25zdGFudCIpOwoJICByZXR1cm47Cgl9CgogICAgICBpZiAo R0VUX01PREVfQ0xBU1MgKEdFVF9NT0RFICh4KSkgPT0gTU9ERV9WRUNUT1JfSU5UKQoJYXNtX2Zw cmludGYgKGYsICIld2QiLCAoSE9TVF9XSURFX0lOVCkgLVVJTlRWQUwgKGVsdCkpOwogICAgICBl bHNlIGlmIChHRVRfTU9ERV9DTEFTUyAoR0VUX01PREUgKHgpKSA9PSBNT0RFX1ZFQ1RPUl9GTE9B VAoJICAgICAgICYmIGFhcmNoNjRfcHJpbnRfdmVjdG9yX2Zsb2F0X29wZXJhbmQgKGYsIHgsIHRy dWUpKQoJOwogICAgICBlbHNlCgl7CgkgIG91dHB1dF9vcGVyYW5kX2xvc3NhZ2UgKCJpbnZhbGlk IHZlY3RvciBjb25zdGFudCIpOwoJICByZXR1cm47Cgl9CiAgICAgIGJyZWFrOwoKICAgIGNhc2Ug J2InOgogICAgY2FzZSAnaCc6CiAgICBjYXNlICdzJzoKICAgIGNhc2UgJ2QnOgogICAgY2FzZSAn cSc6CiAgICAgIGlmICghUkVHX1AgKHgpIHx8ICFGUF9SRUdOVU1fUCAoUkVHTk8gKHgpKSkKCXsK CSAgb3V0cHV0X29wZXJhbmRfbG9zc2FnZSAoImluY29tcGF0aWJsZSBmbG9hdGluZyBwb2ludCAv IHZlY3RvciByZWdpc3RlciBvcGVyYW5kIGZvciAnJSUlYyciLCBjb2RlKTsKCSAgcmV0dXJuOwoJ fQogICAgICBhc21fZnByaW50ZiAoZiwgIiVjJWQiLCBjb2RlLCBSRUdOTyAoeCkgLSBWMF9SRUdO VU0pOwogICAgICBicmVhazsKCiAgICBjYXNlICdTJzoKICAgIGNhc2UgJ1QnOgogICAgY2FzZSAn VSc6CiAgICBjYXNlICdWJzoKICAgICAgaWYgKCFSRUdfUCAoeCkgfHwgIUZQX1JFR05VTV9QIChS RUdOTyAoeCkpKQoJewoJICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW5jb21wYXRpYmxlIGZs b2F0aW5nIHBvaW50IC8gdmVjdG9yIHJlZ2lzdGVyIG9wZXJhbmQgZm9yICclJSVjJyIsIGNvZGUp OwoJICByZXR1cm47Cgl9CiAgICAgIGFzbV9mcHJpbnRmIChmLCAiJWMlZCIsCgkJICAgYWFyY2g2 NF9zdmVfZGF0YV9tb2RlX3AgKEdFVF9NT0RFICh4KSkgPyAneicgOiAndicsCgkJICAgUkVHTk8g KHgpIC0gVjBfUkVHTlVNICsgKGNvZGUgLSAnUycpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSAn Uic6CiAgICAgIGlmIChSRUdfUCAoeCkgJiYgRlBfUkVHTlVNX1AgKFJFR05PICh4KSkKCSAgJiYg KGFhcmNoNjRfYWR2c2ltZF9wYXJ0aWFsX3N0cnVjdF9tb2RlX3AgKEdFVF9NT0RFICh4KSkpKQoJ YXNtX2ZwcmludGYgKGYsICJkJWQiLCBSRUdOTyAoeCkgLSBWMF9SRUdOVU0gKyAxKTsKICAgICAg ZWxzZSBpZiAoUkVHX1AgKHgpICYmIEZQX1JFR05VTV9QIChSRUdOTyAoeCkpKQoJYXNtX2Zwcmlu dGYgKGYsICJxJWQiLCBSRUdOTyAoeCkgLSBWMF9SRUdOVU0gKyAxKTsKICAgICAgZWxzZSBpZiAo UkVHX1AgKHgpICYmIEdQX1JFR05VTV9QIChSRUdOTyAoeCkpKQoJYXNtX2ZwcmludGYgKGYsICJ4 JWQiLCBSRUdOTyAoeCkgLSBSMF9SRUdOVU0gKyAxKTsKICAgICAgZWxzZQoJb3V0cHV0X29wZXJh bmRfbG9zc2FnZSAoImluY29tcGF0aWJsZSByZWdpc3RlciBvcGVyYW5kIGZvciAnJSUlYyciLAoJ CQkJY29kZSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ1gnOgogICAgICBpZiAoIUNPTlNUX0lO VF9QICh4KSkKCXsKCSAgb3V0cHV0X29wZXJhbmRfbG9zc2FnZSAoImludmFsaWQgb3BlcmFuZCBm b3IgJyUlJWMnIiwgY29kZSk7CgkgIHJldHVybjsKCX0KICAgICAgYXNtX2ZwcmludGYgKGYsICIw eCV3eCIsIFVJTlRWQUwgKHgpICYgMHhmZmZmKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSAnQyc6 CiAgICAgIHsKCS8qIFByaW50IGEgcmVwbGljYXRlZCBjb25zdGFudCBpbiBoZXguICAqLwoJaWYg KCFjb25zdF92ZWNfZHVwbGljYXRlX3AgKHgsICZlbHQpIHx8ICFDT05TVF9JTlRfUCAoZWx0KSkK CSAgewoJICAgIG91dHB1dF9vcGVyYW5kX2xvc3NhZ2UgKCJpbnZhbGlkIG9wZXJhbmQgZm9yICcl JSVjJyIsIGNvZGUpOwoJICAgIHJldHVybjsKCSAgfQoJc2NhbGFyX21vZGUgaW5uZXJfbW9kZSA9 IEdFVF9NT0RFX0lOTkVSIChHRVRfTU9ERSAoeCkpOwoJYXNtX2ZwcmludGYgKGYsICIweCV3eCIs IFVJTlRWQUwgKGVsdCkgJiBHRVRfTU9ERV9NQVNLIChpbm5lcl9tb2RlKSk7CiAgICAgIH0KICAg ICAgYnJlYWs7CgogICAgY2FzZSAnRCc6CiAgICAgIHsKCS8qIFByaW50IGEgcmVwbGljYXRlZCBj b25zdGFudCBpbiBkZWNpbWFsLCB0cmVhdGluZyBpdCBhcwoJICAgdW5zaWduZWQuICAqLwoJaWYg KCFjb25zdF92ZWNfZHVwbGljYXRlX3AgKHgsICZlbHQpIHx8ICFDT05TVF9JTlRfUCAoZWx0KSkK CSAgewoJICAgIG91dHB1dF9vcGVyYW5kX2xvc3NhZ2UgKCJpbnZhbGlkIG9wZXJhbmQgZm9yICcl JSVjJyIsIGNvZGUpOwoJICAgIHJldHVybjsKCSAgfQoJc2NhbGFyX21vZGUgaW5uZXJfbW9kZSA9 IEdFVF9NT0RFX0lOTkVSIChHRVRfTU9ERSAoeCkpOwoJYXNtX2ZwcmludGYgKGYsICIld2QiLCBV SU5UVkFMIChlbHQpICYgR0VUX01PREVfTUFTSyAoaW5uZXJfbW9kZSkpOwogICAgICB9CiAgICAg IGJyZWFrOwoKICAgIGNhc2UgJ3cnOgogICAgY2FzZSAneCc6CiAgICAgIGlmICh4ID09IGNvbnN0 MF9ydHgKCSAgfHwgKENPTlNUX0RPVUJMRV9QICh4KSAmJiBhYXJjaDY0X2Zsb2F0X2NvbnN0X3pl cm9fcnR4X3AgKHgpKSkKCXsKCSAgYXNtX2ZwcmludGYgKGYsICIlY3pyIiwgY29kZSk7CgkgIGJy ZWFrOwoJfQoKICAgICAgaWYgKFJFR19QICh4KSAmJiBHUF9SRUdOVU1fUCAoUkVHTk8gKHgpKSkK CXsKCSAgYXNtX2ZwcmludGYgKGYsICIlYyVkIiwgY29kZSwgUkVHTk8gKHgpIC0gUjBfUkVHTlVN KTsKCSAgYnJlYWs7Cgl9CgogICAgICBpZiAoUkVHX1AgKHgpICYmIFJFR05PICh4KSA9PSBTUF9S RUdOVU0pCgl7CgkgIGFzbV9mcHJpbnRmIChmLCAiJXNzcCIsIGNvZGUgPT0gJ3cnID8gInciIDog IiIpOwoJICBicmVhazsKCX0KCiAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLwoKICAgIGNhc2UgMDoK ICAgICAgaWYgKHggPT0gTlVMTCkKCXsKCSAgb3V0cHV0X29wZXJhbmRfbG9zc2FnZSAoIm1pc3Np bmcgb3BlcmFuZCIpOwoJICByZXR1cm47Cgl9CgogICAgICBzd2l0Y2ggKEdFVF9DT0RFICh4KSkK CXsKCWNhc2UgUkVHOgoJICBpZiAoYWFyY2g2NF9zdmVfZGF0YV9tb2RlX3AgKEdFVF9NT0RFICh4 KSkpCgkgICAgewoJICAgICAgaWYgKFJFR19OUkVHUyAoeCkgPT0gMSkKCQlhc21fZnByaW50ZiAo ZiwgInolZCIsIFJFR05PICh4KSAtIFYwX1JFR05VTSk7CgkgICAgICBlbHNlCgkJewoJCSAgY2hh ciBzdWZmaXgKCQkgICAgPSBzaXpldG9jaGFyIChHRVRfTU9ERV9VTklUX0JJVFNJWkUgKEdFVF9N T0RFICh4KSkpOwoJCSAgYXNtX2ZwcmludGYgKGYsICJ7eiVkLiVjIC0geiVkLiVjfSIsCgkJCSAg ICAgICBSRUdOTyAoeCkgLSBWMF9SRUdOVU0sIHN1ZmZpeCwKCQkJICAgICAgIEVORF9SRUdOTyAo eCkgLSBWMF9SRUdOVU0gLSAxLCBzdWZmaXgpOwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICBhc21f ZnByaW50ZiAoZiwgIiVzIiwgcmVnX25hbWVzIFtSRUdOTyAoeCldKTsKCSAgYnJlYWs7CgoJY2Fz ZSBNRU06CgkgIG91dHB1dF9hZGRyZXNzIChHRVRfTU9ERSAoeCksIFhFWFAgKHgsIDApKTsKCSAg YnJlYWs7CgoJY2FzZSBMQUJFTF9SRUY6CgljYXNlIFNZTUJPTF9SRUY6CgkgIG91dHB1dF9hZGRy X2NvbnN0IChhc21fb3V0X2ZpbGUsIHgpOwoJICBicmVhazsKCgljYXNlIENPTlNUX0lOVDoKCSAg YXNtX2ZwcmludGYgKGYsICIld2QiLCBJTlRWQUwgKHgpKTsKCSAgYnJlYWs7CgoJY2FzZSBDT05T VDoKCSAgaWYgKCFWRUNUT1JfTU9ERV9QIChHRVRfTU9ERSAoeCkpKQoJICAgIHsKCSAgICAgIG91 dHB1dF9hZGRyX2NvbnN0IChhc21fb3V0X2ZpbGUsIHgpOwoJICAgICAgYnJlYWs7CgkgICAgfQoJ ICAvKiBmYWxsIHRocm91Z2ggKi8KCgljYXNlIENPTlNUX1ZFQ1RPUjoKCSAgaWYgKCFjb25zdF92 ZWNfZHVwbGljYXRlX3AgKHgsICZlbHQpKQoJICAgIHsKCSAgICAgIG91dHB1dF9vcGVyYW5kX2xv c3NhZ2UgKCJpbnZhbGlkIHZlY3RvciBjb25zdGFudCIpOwoJICAgICAgcmV0dXJuOwoJICAgIH0K CgkgIGlmIChHRVRfTU9ERV9DTEFTUyAoR0VUX01PREUgKHgpKSA9PSBNT0RFX1ZFQ1RPUl9JTlQp CgkgICAgYXNtX2ZwcmludGYgKGYsICIld2QiLCBJTlRWQUwgKGVsdCkpOwoJICBlbHNlIGlmIChH RVRfTU9ERV9DTEFTUyAoR0VUX01PREUgKHgpKSA9PSBNT0RFX1ZFQ1RPUl9GTE9BVAoJCSAgICYm IGFhcmNoNjRfcHJpbnRfdmVjdG9yX2Zsb2F0X29wZXJhbmQgKGYsIHgsIGZhbHNlKSkKCSAgICA7 CgkgIGVsc2UKCSAgICB7CgkgICAgICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCB2 ZWN0b3IgY29uc3RhbnQiKTsKCSAgICAgIHJldHVybjsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2Ug Q09OU1RfRE9VQkxFOgoJICAvKiBTaW5jZSB3ZSBkZWZpbmUgVEFSR0VUX1NVUFBPUlRTX1dJREVf SU5UIHdlIHNob3VsZG4ndCBldmVyCgkgICAgIGJlIGdldHRpbmcgQ09OU1RfRE9VQkxFcyBob2xk aW5nIGludGVnZXJzLiAgKi8KCSAgZ2NjX2Fzc2VydCAoR0VUX01PREUgKHgpICE9IFZPSURtb2Rl KTsKCSAgaWYgKGFhcmNoNjRfZmxvYXRfY29uc3RfemVyb19ydHhfcCAoeCkpCgkgICAgewoJICAg ICAgZnB1dGMgKCcwJywgZik7CgkgICAgICBicmVhazsKCSAgICB9CgkgIGVsc2UgaWYgKGFhcmNo NjRfZmxvYXRfY29uc3RfcmVwcmVzZW50YWJsZV9wICh4KSkKCSAgICB7CiNkZWZpbmUgYnVmX3Np emUgMjAKCSAgICAgIGNoYXIgZmxvYXRfYnVmW2J1Zl9zaXplXSA9IHsnXDAnfTsKCSAgICAgIHJl YWxfdG9fZGVjaW1hbF9mb3JfbW9kZSAoZmxvYXRfYnVmLAoJCQkJCUNPTlNUX0RPVUJMRV9SRUFM X1ZBTFVFICh4KSwKCQkJCQlidWZfc2l6ZSwgYnVmX3NpemUsCgkJCQkJMSwgR0VUX01PREUgKHgp KTsKCSAgICAgIGFzbV9mcHJpbnRmIChhc21fb3V0X2ZpbGUsICIlcyIsIGZsb2F0X2J1Zik7Cgkg ICAgICBicmVhazsKI3VuZGVmIGJ1Zl9zaXplCgkgICAgfQoJICBvdXRwdXRfb3BlcmFuZF9sb3Nz YWdlICgiaW52YWxpZCBjb25zdGFudCIpOwoJICByZXR1cm47CglkZWZhdWx0OgoJICBvdXRwdXRf b3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5kIik7CgkgIHJldHVybjsKCX0KICAgICAg YnJlYWs7CgogICAgY2FzZSAnQSc6CiAgICAgIGlmIChHRVRfQ09ERSAoeCkgPT0gSElHSCkKCXgg PSBYRVhQICh4LCAwKTsKCiAgICAgIHN3aXRjaCAoYWFyY2g2NF9jbGFzc2lmeV9zeW1ib2xpY19l eHByZXNzaW9uICh4KSkKCXsKCWNhc2UgU1lNQk9MX1NNQUxMX0dPVF80RzoKCSAgYXNtX2Zwcmlu dGYgKGFzbV9vdXRfZmlsZSwgIjpnb3Q6Iik7CgkgIGJyZWFrOwoKCWNhc2UgU1lNQk9MX1NNQUxM X1RMU0dEOgoJICBhc21fZnByaW50ZiAoYXNtX291dF9maWxlLCAiOnRsc2dkOiIpOwoJICBicmVh azsKCgljYXNlIFNZTUJPTF9TTUFMTF9UTFNERVNDOgoJICBhc21fZnByaW50ZiAoYXNtX291dF9m aWxlLCAiOnRsc2Rlc2M6Iik7CgkgIGJyZWFrOwoKCWNhc2UgU1lNQk9MX1NNQUxMX1RMU0lFOgoJ ICBhc21fZnByaW50ZiAoYXNtX291dF9maWxlLCAiOmdvdHRwcmVsOiIpOwoJICBicmVhazsKCglj YXNlIFNZTUJPTF9UTFNMRTI0OgoJICBhc21fZnByaW50ZiAoYXNtX291dF9maWxlLCAiOnRwcmVs OiIpOwoJICBicmVhazsKCgljYXNlIFNZTUJPTF9USU5ZX0dPVDoKCSAgZ2NjX3VucmVhY2hhYmxl ICgpOwoJICBicmVhazsKCglkZWZhdWx0OgoJICBicmVhazsKCX0KICAgICAgb3V0cHV0X2FkZHJf Y29uc3QgKGFzbV9vdXRfZmlsZSwgeCk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ0wnOgogICAg ICBzd2l0Y2ggKGFhcmNoNjRfY2xhc3NpZnlfc3ltYm9saWNfZXhwcmVzc2lvbiAoeCkpCgl7Cglj YXNlIFNZTUJPTF9TTUFMTF9HT1RfNEc6CgkgIGFzbV9mcHJpbnRmIChhc21fb3V0X2ZpbGUsICI6 Z290X2xvMTI6Iik7CgkgIGJyZWFrOwoKCWNhc2UgU1lNQk9MX1NNQUxMX1RMU0dEOgoJICBhc21f ZnByaW50ZiAoYXNtX291dF9maWxlLCAiOnRsc2dkX2xvMTI6Iik7CgkgIGJyZWFrOwoKCWNhc2Ug U1lNQk9MX1NNQUxMX1RMU0RFU0M6CgkgIGFzbV9mcHJpbnRmIChhc21fb3V0X2ZpbGUsICI6dGxz ZGVzY19sbzEyOiIpOwoJICBicmVhazsKCgljYXNlIFNZTUJPTF9TTUFMTF9UTFNJRToKCSAgYXNt X2ZwcmludGYgKGFzbV9vdXRfZmlsZSwgIjpnb3R0cHJlbF9sbzEyOiIpOwoJICBicmVhazsKCglj YXNlIFNZTUJPTF9UTFNMRTEyOgoJICBhc21fZnByaW50ZiAoYXNtX291dF9maWxlLCAiOnRwcmVs X2xvMTI6Iik7CgkgIGJyZWFrOwoKCWNhc2UgU1lNQk9MX1RMU0xFMjQ6CgkgIGFzbV9mcHJpbnRm IChhc21fb3V0X2ZpbGUsICI6dHByZWxfbG8xMl9uYzoiKTsKCSAgYnJlYWs7CgoJY2FzZSBTWU1C T0xfVElOWV9HT1Q6CgkgIGFzbV9mcHJpbnRmIChhc21fb3V0X2ZpbGUsICI6Z290OiIpOwoJICBi cmVhazsKCgljYXNlIFNZTUJPTF9USU5ZX1RMU0lFOgoJICBhc21fZnByaW50ZiAoYXNtX291dF9m aWxlLCAiOmdvdHRwcmVsOiIpOwoJICBicmVhazsKCglkZWZhdWx0OgoJICBicmVhazsKCX0KICAg ICAgb3V0cHV0X2FkZHJfY29uc3QgKGFzbV9vdXRfZmlsZSwgeCk7CiAgICAgIGJyZWFrOwoKICAg IGNhc2UgJ0cnOgogICAgICBzd2l0Y2ggKGFhcmNoNjRfY2xhc3NpZnlfc3ltYm9saWNfZXhwcmVz c2lvbiAoeCkpCgl7CgljYXNlIFNZTUJPTF9UTFNMRTI0OgoJICBhc21fZnByaW50ZiAoYXNtX291 dF9maWxlLCAiOnRwcmVsX2hpMTI6Iik7CgkgIGJyZWFrOwoJZGVmYXVsdDoKCSAgYnJlYWs7Cgl9 CiAgICAgIG91dHB1dF9hZGRyX2NvbnN0IChhc21fb3V0X2ZpbGUsIHgpOwogICAgICBicmVhazsK CiAgICBjYXNlICdrJzoKICAgICAgewoJSE9TVF9XSURFX0lOVCBjb25kX2NvZGU7CgoJaWYgKCFD T05TVF9JTlRfUCAoeCkpCgkgIHsKCSAgICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxp ZCBvcGVyYW5kIGZvciAnJSUlYyciLCBjb2RlKTsKCSAgICByZXR1cm47CgkgIH0KCgljb25kX2Nv ZGUgPSBJTlRWQUwgKHgpOwoJZ2NjX2Fzc2VydCAoY29uZF9jb2RlID49IDAgJiYgY29uZF9jb2Rl IDw9IEFBUkNINjRfTlYpOwoJYXNtX2ZwcmludGYgKGYsICIlZCIsIGFhcmNoNjRfbnpjdl9jb2Rl c1tjb25kX2NvZGVdKTsKICAgICAgfQogICAgICBicmVhazsKCiAgICBjYXNlICd5JzoKICAgIGNh c2UgJ3onOgogICAgICB7CgltYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFICh4KTsKCglpZiAo IU1FTV9QICh4KQoJICAgIHx8IChjb2RlID09ICd5JwoJCSYmIG1heWJlX25lIChHRVRfTU9ERV9T SVpFIChtb2RlKSwgOCkKCQkmJiBtYXliZV9uZSAoR0VUX01PREVfU0laRSAobW9kZSksIDE2KSkp CgkgIHsKCSAgICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5kIGZvciAn JSUlYyciLCBjb2RlKTsKCSAgICByZXR1cm47CgkgIH0KCglpZiAoIWFhcmNoNjRfcHJpbnRfYWRk cmVzc19pbnRlcm5hbCAoZiwgbW9kZSwgWEVYUCAoeCwgMCksCgkJCQkJICAgIGNvZGUgPT0gJ3kn CgkJCQkJICAgID8gQUREUl9RVUVSWV9MRFBfU1RQX04KCQkJCQkgICAgOiBBRERSX1FVRVJZX0xE UF9TVFApKQoJICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5kIHByZWZp eCAnJSUlYyciLCBjb2RlKTsKICAgICAgfQogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAg ICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgiaW52YWxpZCBvcGVyYW5kIHByZWZpeCAnJSUlYyci LCBjb2RlKTsKICAgICAgcmV0dXJuOwogICAgfQp9CgovKiBQcmludCBhZGRyZXNzICd4JyBvZiBh IG1lbW9yeSBhY2Nlc3Mgd2l0aCBtb2RlICdtb2RlJy4KICAgJ29wJyBpcyB0aGUgY29udGV4dCBy ZXF1aXJlZCBieSBhYXJjaDY0X2NsYXNzaWZ5X2FkZHJlc3MuICBJdCBjYW4gZWl0aGVyIGJlCiAg IE1FTSBmb3IgYSBub3JtYWwgbWVtb3J5IGFjY2VzcyBvciBQQVJBTExFTCBmb3IgTERQL1NUUC4g ICovCnN0YXRpYyBib29sCmFhcmNoNjRfcHJpbnRfYWRkcmVzc19pbnRlcm5hbCAoRklMRSAqZiwg bWFjaGluZV9tb2RlIG1vZGUsIHJ0eCB4LAoJCQkJYWFyY2g2NF9hZGRyX3F1ZXJ5X3R5cGUgdHlw ZSkKewogIHN0cnVjdCBhYXJjaDY0X2FkZHJlc3NfaW5mbyBhZGRyOwogIHVuc2lnbmVkIGludCBz aXplLCB2ZWNfZmxhZ3M7CgogIC8qIENoZWNrIGFsbCBhZGRyZXNzZXMgYXJlIFBtb2RlIC0gaW5j bHVkaW5nIElMUDMyLiAgKi8KICBpZiAoR0VUX01PREUgKHgpICE9IFBtb2RlCiAgICAgICYmICgh Q09OU1RfSU5UX1AgKHgpCgkgIHx8IHRydW5jX2ludF9mb3JfbW9kZSAoSU5UVkFMICh4KSwgUG1v ZGUpICE9IElOVFZBTCAoeCkpKQogICAgewogICAgICBvdXRwdXRfb3BlcmFuZF9sb3NzYWdlICgi aW52YWxpZCBhZGRyZXNzIG1vZGUiKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICBpZiAo YWFyY2g2NF9jbGFzc2lmeV9hZGRyZXNzICgmYWRkciwgeCwgbW9kZSwgdHJ1ZSwgdHlwZSkpCiAg ICBzd2l0Y2ggKGFkZHIudHlwZSkKICAgICAgewogICAgICBjYXNlIEFERFJFU1NfUkVHX0lNTToK CWlmIChrbm93bl9lcSAoYWRkci5jb25zdF9vZmZzZXQsIDApKQoJICB7CgkgICAgYXNtX2Zwcmlu dGYgKGYsICJbJXNdIiwgcmVnX25hbWVzW1JFR05PIChhZGRyLmJhc2UpXSk7CgkgICAgcmV0dXJu IHRydWU7CgkgIH0KCgl2ZWNfZmxhZ3MgPSBhYXJjaDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlICht b2RlKTsKCWlmICh2ZWNfZmxhZ3MgJiBWRUNfQU5ZX1NWRSkKCSAgewoJICAgIEhPU1RfV0lERV9J TlQgdm51bQoJICAgICAgPSBleGFjdF9kaXYgKGFkZHIuY29uc3Rfb2Zmc2V0LAoJCQkgICBhYXJj aDY0X3ZsX2J5dGVzIChtb2RlLCB2ZWNfZmxhZ3MpKS50b19jb25zdGFudCAoKTsKCSAgICBhc21f ZnByaW50ZiAoZiwgIlslcywgIyV3ZCwgbXVsIHZsXSIsCgkJCSByZWdfbmFtZXNbUkVHTk8gKGFk ZHIuYmFzZSldLCB2bnVtKTsKCSAgICByZXR1cm4gdHJ1ZTsKCSAgfQoKCWFzbV9mcHJpbnRmIChm LCAiWyVzLCAld2RdIiwgcmVnX25hbWVzW1JFR05PIChhZGRyLmJhc2UpXSwKCQkgICAgIElOVFZB TCAoYWRkci5vZmZzZXQpKTsKCXJldHVybiB0cnVlOwoKICAgICAgY2FzZSBBRERSRVNTX1JFR19S RUc6CglpZiAoYWRkci5zaGlmdCA9PSAwKQoJICBhc21fZnByaW50ZiAoZiwgIlslcywgJXNdIiwg cmVnX25hbWVzIFtSRUdOTyAoYWRkci5iYXNlKV0sCgkJICAgICAgIHJlZ19uYW1lcyBbUkVHTk8g KGFkZHIub2Zmc2V0KV0pOwoJZWxzZQoJICBhc21fZnByaW50ZiAoZiwgIlslcywgJXMsIGxzbCAl dV0iLCByZWdfbmFtZXMgW1JFR05PIChhZGRyLmJhc2UpXSwKCQkgICAgICAgcmVnX25hbWVzIFtS RUdOTyAoYWRkci5vZmZzZXQpXSwgYWRkci5zaGlmdCk7CglyZXR1cm4gdHJ1ZTsKCiAgICAgIGNh c2UgQUREUkVTU19SRUdfVVhUVzoKCWlmIChhZGRyLnNoaWZ0ID09IDApCgkgIGFzbV9mcHJpbnRm IChmLCAiWyVzLCB3JWQsIHV4dHddIiwgcmVnX25hbWVzIFtSRUdOTyAoYWRkci5iYXNlKV0sCgkJ ICAgICAgIFJFR05PIChhZGRyLm9mZnNldCkgLSBSMF9SRUdOVU0pOwoJZWxzZQoJICBhc21fZnBy aW50ZiAoZiwgIlslcywgdyVkLCB1eHR3ICV1XSIsIHJlZ19uYW1lcyBbUkVHTk8gKGFkZHIuYmFz ZSldLAoJCSAgICAgICBSRUdOTyAoYWRkci5vZmZzZXQpIC0gUjBfUkVHTlVNLCBhZGRyLnNoaWZ0 KTsKCXJldHVybiB0cnVlOwoKICAgICAgY2FzZSBBRERSRVNTX1JFR19TWFRXOgoJaWYgKGFkZHIu c2hpZnQgPT0gMCkKCSAgYXNtX2ZwcmludGYgKGYsICJbJXMsIHclZCwgc3h0d10iLCByZWdfbmFt ZXMgW1JFR05PIChhZGRyLmJhc2UpXSwKCQkgICAgICAgUkVHTk8gKGFkZHIub2Zmc2V0KSAtIFIw X1JFR05VTSk7CgllbHNlCgkgIGFzbV9mcHJpbnRmIChmLCAiWyVzLCB3JWQsIHN4dHcgJXVdIiwg cmVnX25hbWVzIFtSRUdOTyAoYWRkci5iYXNlKV0sCgkJICAgICAgIFJFR05PIChhZGRyLm9mZnNl dCkgLSBSMF9SRUdOVU0sIGFkZHIuc2hpZnQpOwoJcmV0dXJuIHRydWU7CgogICAgICBjYXNlIEFE RFJFU1NfUkVHX1dCOgoJLyogV3JpdGViYWNrIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBmaXhlZC13 aWR0aCBtb2Rlcy4gICovCglzaXplID0gR0VUX01PREVfU0laRSAobW9kZSkudG9fY29uc3RhbnQg KCk7Cglzd2l0Y2ggKEdFVF9DT0RFICh4KSkKCSAgewoJICBjYXNlIFBSRV9JTkM6CgkgICAgYXNt X2ZwcmludGYgKGYsICJbJXMsICVkXSEiLCByZWdfbmFtZXMgW1JFR05PIChhZGRyLmJhc2UpXSwg c2l6ZSk7CgkgICAgcmV0dXJuIHRydWU7CgkgIGNhc2UgUE9TVF9JTkM6CgkgICAgYXNtX2Zwcmlu dGYgKGYsICJbJXNdLCAlZCIsIHJlZ19uYW1lcyBbUkVHTk8gKGFkZHIuYmFzZSldLCBzaXplKTsK CSAgICByZXR1cm4gdHJ1ZTsKCSAgY2FzZSBQUkVfREVDOgoJICAgIGFzbV9mcHJpbnRmIChmLCAi WyVzLCAtJWRdISIsIHJlZ19uYW1lcyBbUkVHTk8gKGFkZHIuYmFzZSldLCBzaXplKTsKCSAgICBy ZXR1cm4gdHJ1ZTsKCSAgY2FzZSBQT1NUX0RFQzoKCSAgICBhc21fZnByaW50ZiAoZiwgIlslc10s IC0lZCIsIHJlZ19uYW1lcyBbUkVHTk8gKGFkZHIuYmFzZSldLCBzaXplKTsKCSAgICByZXR1cm4g dHJ1ZTsKCSAgY2FzZSBQUkVfTU9ESUZZOgoJICAgIGFzbV9mcHJpbnRmIChmLCAiWyVzLCAld2Rd ISIsIHJlZ19uYW1lc1tSRUdOTyAoYWRkci5iYXNlKV0sCgkJCSBJTlRWQUwgKGFkZHIub2Zmc2V0 KSk7CgkgICAgcmV0dXJuIHRydWU7CgkgIGNhc2UgUE9TVF9NT0RJRlk6CgkgICAgYXNtX2Zwcmlu dGYgKGYsICJbJXNdLCAld2QiLCByZWdfbmFtZXNbUkVHTk8gKGFkZHIuYmFzZSldLAoJCQkgSU5U VkFMIChhZGRyLm9mZnNldCkpOwoJICAgIHJldHVybiB0cnVlOwoJICBkZWZhdWx0OgoJICAgIGJy ZWFrOwoJICB9CglicmVhazsKCiAgICAgIGNhc2UgQUREUkVTU19MT19TVU06Cglhc21fZnByaW50 ZiAoZiwgIlslcywgIzpsbzEyOiIsIHJlZ19uYW1lcyBbUkVHTk8gKGFkZHIuYmFzZSldKTsKCW91 dHB1dF9hZGRyX2NvbnN0IChmLCBhZGRyLm9mZnNldCk7Cglhc21fZnByaW50ZiAoZiwgIl0iKTsK CXJldHVybiB0cnVlOwoKICAgICAgY2FzZSBBRERSRVNTX1NZTUJPTElDOgoJb3V0cHV0X2FkZHJf Y29uc3QgKGYsIHgpOwoJcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgcmV0dXJuIGZhbHNlOwp9Cgov KiBQcmludCBhZGRyZXNzICd4JyBvZiBhIG1lbW9yeSBhY2Nlc3Mgd2l0aCBtb2RlICdtb2RlJy4g ICovCnN0YXRpYyB2b2lkCmFhcmNoNjRfcHJpbnRfb3BlcmFuZF9hZGRyZXNzIChGSUxFICpmLCBt YWNoaW5lX21vZGUgbW9kZSwgcnR4IHgpCnsKICBpZiAoIWFhcmNoNjRfcHJpbnRfYWRkcmVzc19p bnRlcm5hbCAoZiwgbW9kZSwgeCwgQUREUl9RVUVSWV9BTlkpKQogICAgb3V0cHV0X2FkZHJfY29u c3QgKGYsIHgpOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX0FTTV9PVVRQVVRfQUREUl9DT05TVF9F WFRSQS4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X291dHB1dF9hZGRyX2NvbnN0X2V4dHJhIChG SUxFICpmaWxlLCBydHggeCkKewogIGlmIChHRVRfQ09ERSAoeCkgPT0gVU5TUEVDICYmIFhJTlQg KHgsIDEpID09IFVOU1BFQ19TQUxUX0FERFIpCiAgICB7CiAgICAgIG91dHB1dF9hZGRyX2NvbnN0 IChmaWxlLCBYVkVDRVhQICh4LCAwLCAwKSk7CiAgICAgIHJldHVybiB0cnVlOwogICB9CiAgcmV0 dXJuIGZhbHNlOwp9Cgpib29sCmFhcmNoNjRfbGFiZWxfbWVudGlvbmVkX3AgKHJ0eCB4KQp7CiAg Y29uc3QgY2hhciAqZm10OwogIGludCBpOwoKICBpZiAoTEFCRUxfUkVGX1AgKHgpKQogICAgcmV0 dXJuIHRydWU7CgogIC8qIFVOU1BFQ19UTFMgZW50cmllcyBmb3IgYSBzeW1ib2wgaW5jbHVkZSBh IExBQkVMX1JFRiBmb3IgdGhlCiAgICAgcmVmZXJlbmNpbmcgaW5zdHJ1Y3Rpb24sIGJ1dCB0aGV5 IGFyZSBjb25zdGFudCBvZmZzZXRzLCBub3QKICAgICBzeW1ib2xzLiAgKi8KICBpZiAoR0VUX0NP REUgKHgpID09IFVOU1BFQyAmJiBYSU5UICh4LCAxKSA9PSBVTlNQRUNfVExTKQogICAgcmV0dXJu IGZhbHNlOwoKICBmbXQgPSBHRVRfUlRYX0ZPUk1BVCAoR0VUX0NPREUgKHgpKTsKICBmb3IgKGkg PSBHRVRfUlRYX0xFTkdUSCAoR0VUX0NPREUgKHgpKSAtIDE7IGkgPj0gMDsgaS0tKQogICAgewog ICAgICBpZiAoZm10W2ldID09ICdFJykKCXsKCSAgaW50IGo7CgoJICBmb3IgKGogPSBYVkVDTEVO ICh4LCBpKSAtIDE7IGogPj0gMDsgai0tKQoJICAgIGlmIChhYXJjaDY0X2xhYmVsX21lbnRpb25l ZF9wIChYVkVDRVhQICh4LCBpLCBqKSkpCgkgICAgICByZXR1cm4gMTsKCX0KICAgICAgZWxzZSBp ZiAoZm10W2ldID09ICdlJyAmJiBhYXJjaDY0X2xhYmVsX21lbnRpb25lZF9wIChYRVhQICh4LCBp KSkpCglyZXR1cm4gMTsKICAgIH0KCiAgcmV0dXJuIDA7Cn0KCi8qIEltcGxlbWVudCBSRUdOT19S RUdfQ0xBU1MuICAqLwoKZW51bSByZWdfY2xhc3MKYWFyY2g2NF9yZWdub19yZWdjbGFzcyAodW5z aWduZWQgcmVnbm8pCnsKICBpZiAoU1RVQl9SRUdOVU1fUCAocmVnbm8pKQogICAgcmV0dXJuIFNU VUJfUkVHUzsKCiAgaWYgKEdQX1JFR05VTV9QIChyZWdubykpCiAgICByZXR1cm4gR0VORVJBTF9S RUdTOwoKICBpZiAocmVnbm8gPT0gU1BfUkVHTlVNKQogICAgcmV0dXJuIFNUQUNLX1JFRzsKCiAg aWYgKHJlZ25vID09IEZSQU1FX1BPSU5URVJfUkVHTlVNCiAgICAgIHx8IHJlZ25vID09IEFSR19Q T0lOVEVSX1JFR05VTSkKICAgIHJldHVybiBQT0lOVEVSX1JFR1M7CgogIGlmIChGUF9SRUdOVU1f UCAocmVnbm8pKQogICAgcmV0dXJuIChGUF9MTzhfUkVHTlVNX1AgKHJlZ25vKSA/IEZQX0xPOF9S RUdTCgkgICAgOiBGUF9MT19SRUdOVU1fUCAocmVnbm8pID8gRlBfTE9fUkVHUyA6IEZQX1JFR1Mp OwoKICBpZiAoUFJfUkVHTlVNX1AgKHJlZ25vKSkKICAgIHJldHVybiBQUl9MT19SRUdOVU1fUCAo cmVnbm8pID8gUFJfTE9fUkVHUyA6IFBSX0hJX1JFR1M7CgogIGlmIChyZWdubyA9PSBGRlJfUkVH TlVNIHx8IHJlZ25vID09IEZGUlRfUkVHTlVNKQogICAgcmV0dXJuIEZGUl9SRUdTOwoKICByZXR1 cm4gTk9fUkVHUzsKfQoKLyogT0ZGU0VUIGlzIGFuIGFkZHJlc3Mgb2Zmc2V0IGZvciBtb2RlIE1P REUsIHdoaWNoIGhhcyBTSVpFIGJ5dGVzLgogICBJZiBPRkZTRVQgaXMgb3V0IG9mIHJhbmdlLCBy ZXR1cm4gYW4gb2Zmc2V0IG9mIGFuIGFuY2hvciBwb2ludAogICB0aGF0IGlzIGluIHJhbmdlLiAg UmV0dXJuIDAgb3RoZXJ3aXNlLiAgKi8KCnN0YXRpYyBIT1NUX1dJREVfSU5UCmFhcmNoNjRfYW5j aG9yX29mZnNldCAoSE9TVF9XSURFX0lOVCBvZmZzZXQsIEhPU1RfV0lERV9JTlQgc2l6ZSwKCQkg ICAgICAgbWFjaGluZV9tb2RlIG1vZGUpCnsKICAvKiBEb2VzIGl0IGxvb2sgbGlrZSB3ZSdsbCBu ZWVkIGEgMTYtYnl0ZSBsb2FkL3N0b3JlLXBhaXIgb3BlcmF0aW9uPyAgKi8KICBpZiAoc2l6ZSA+ IDE2KQogICAgcmV0dXJuIChvZmZzZXQgKyAweDQwMCkgJiB+MHg3ZjA7CgogIC8qIEZvciBvZmZz ZXRzIHRoYXQgYXJlbid0IGEgbXVsdGlwbGUgb2YgdGhlIGFjY2VzcyBzaXplLCB0aGUgbGltaXQg aXMKICAgICAtMjU2Li4uMjU1LiAgKi8KICBpZiAob2Zmc2V0ICYgKHNpemUgLSAxKSkKICAgIHsK ICAgICAgLyogQkxLbW9kZSB0eXBpY2FsbHkgdXNlcyBMRFAgb2YgWC1yZWdpc3RlcnMuICAqLwog ICAgICBpZiAobW9kZSA9PSBCTEttb2RlKQoJcmV0dXJuIChvZmZzZXQgKyA1MTIpICYgfjB4M2Zm OwogICAgICByZXR1cm4gKG9mZnNldCArIDB4MTAwKSAmIH4weDFmZjsKICAgIH0KCiAgLyogU21h bGwgbmVnYXRpdmUgb2Zmc2V0cyBhcmUgc3VwcG9ydGVkLiAgKi8KICBpZiAoSU5fUkFOR0UgKG9m ZnNldCwgLTI1NiwgMCkpCiAgICByZXR1cm4gMDsKCiAgaWYgKG1vZGUgPT0gVEltb2RlIHx8IG1v ZGUgPT0gVEZtb2RlIHx8IG1vZGUgPT0gVERtb2RlKQogICAgcmV0dXJuIChvZmZzZXQgKyAweDEw MCkgJiB+MHgxZmY7CgogIC8qIFVzZSAxMi1iaXQgb2Zmc2V0IGJ5IGFjY2VzcyBzaXplLiAgKi8K ICByZXR1cm4gb2Zmc2V0ICYgKH4weGZmZiAqIHNpemUpOwp9CgpzdGF0aWMgcnR4CmFhcmNoNjRf bGVnaXRpbWl6ZV9hZGRyZXNzIChydHggeCwgcnR4IC8qIG9yaWdfeCAgKi8sIG1hY2hpbmVfbW9k ZSBtb2RlKQp7CiAgLyogVHJ5IHRvIHNwbGl0IFgrQ09OU1QgaW50byBZPVgrKENPTlNUICYgfm1h c2spLCBZKyhDT05TVCZtYXNrKSwKICAgICB3aGVyZSBtYXNrIGlzIHNlbGVjdGVkIGJ5IGFsaWdu bWVudCBhbmQgc2l6ZSBvZiB0aGUgb2Zmc2V0LgogICAgIFdlIHRyeSB0byBwaWNrIGFzIGxhcmdl IGEgcmFuZ2UgZm9yIHRoZSBvZmZzZXQgYXMgcG9zc2libGUgdG8KICAgICBtYXhpbWl6ZSB0aGUg Y2hhbmNlIG9mIGEgQ1NFLiAgSG93ZXZlciwgZm9yIGFsaWduZWQgYWRkcmVzc2VzCiAgICAgd2Ug bGltaXQgdGhlIHJhbmdlIHRvIDRrIHNvIHRoYXQgc3RydWN0dXJlcyB3aXRoIGRpZmZlcmVudCBz aXplZAogICAgIGVsZW1lbnRzIGFyZSBsaWtlbHkgdG8gdXNlIHRoZSBzYW1lIGJhc2UuICBXZSBu ZWVkIHRvIGJlIGNhcmVmdWwKICAgICBub3QgdG8gc3BsaXQgYSBDT05TVCBmb3Igc29tZSBmb3Jt cyBvZiBhZGRyZXNzIGV4cHJlc3Npb24sIG90aGVyd2lzZQogICAgIGl0IHdpbGwgZ2VuZXJhdGUg c3ViLW9wdGltYWwgY29kZS4gICovCgogIGlmIChHRVRfQ09ERSAoeCkgPT0gUExVUyAmJiBDT05T VF9JTlRfUCAoWEVYUCAoeCwgMSkpKQogICAgewogICAgICBydHggYmFzZSA9IFhFWFAgKHgsIDAp OwogICAgICBydHggb2Zmc2V0X3J0eCA9IFhFWFAgKHgsIDEpOwogICAgICBIT1NUX1dJREVfSU5U IG9mZnNldCA9IElOVFZBTCAob2Zmc2V0X3J0eCk7CgogICAgICBpZiAoR0VUX0NPREUgKGJhc2Up ID09IFBMVVMpCgl7CgkgIHJ0eCBvcDAgPSBYRVhQIChiYXNlLCAwKTsKCSAgcnR4IG9wMSA9IFhF WFAgKGJhc2UsIDEpOwoKCSAgLyogRm9yY2UgYW55IHNjYWxpbmcgaW50byBhIHRlbXAgZm9yIENT RS4gICovCgkgIG9wMCA9IGZvcmNlX3JlZyAoUG1vZGUsIG9wMCk7CgkgIG9wMSA9IGZvcmNlX3Jl ZyAoUG1vZGUsIG9wMSk7CgoJICAvKiBMZXQgdGhlIHBvaW50ZXIgcmVnaXN0ZXIgYmUgaW4gb3Aw LiAgKi8KCSAgaWYgKFJFR19QT0lOVEVSIChvcDEpKQoJICAgIHN0ZDo6c3dhcCAob3AwLCBvcDEp OwoKCSAgLyogSWYgdGhlIHBvaW50ZXIgaXMgdmlydHVhbCBvciBmcmFtZSByZWxhdGVkLCB0aGVu IHdlIGtub3cgdGhhdAoJICAgICB2aXJ0dWFsIHJlZ2lzdGVyIGluc3RhbnRpYXRpb24gb3IgcmVn aXN0ZXIgZWxpbWluYXRpb24gaXMgZ29pbmcKCSAgICAgdG8gYXBwbHkgYSBzZWNvbmQgY29uc3Rh bnQuICBXZSB3YW50IHRoZSB0d28gY29uc3RhbnRzIGZvbGRlZAoJICAgICB0b2dldGhlciBlYXNp bHkuICBUaGVyZWZvcmUsIGVtaXQgYXMgKE9QMCArIENPTlNUKSArIE9QMS4gICovCgkgIGlmICh2 aXJ0X29yX2VsaW1fcmVnbm9fcCAoUkVHTk8gKG9wMCkpKQoJICAgIHsKCSAgICAgIGJhc2UgPSBl eHBhbmRfYmlub3AgKFBtb2RlLCBhZGRfb3B0YWIsIG9wMCwgb2Zmc2V0X3J0eCwKCQkJCSAgIE5V TExfUlRYLCB0cnVlLCBPUFRBQl9ESVJFQ1QpOwoJICAgICAgcmV0dXJuIGdlbl9ydHhfUExVUyAo UG1vZGUsIGJhc2UsIG9wMSk7CgkgICAgfQoKCSAgLyogT3RoZXJ3aXNlLCBpbiBvcmRlciB0byBl bmNvdXJhZ2UgQ1NFIChhbmQgdGhlbmNlIGxvb3Agc3RyZW5ndGgKCSAgICAgcmVkdWNlKSBzY2Fs ZWQgYWRkcmVzc2VzLCBlbWl0IGFzIChPUDAgKyBPUDEpICsgQ09OU1QuICAqLwoJICBiYXNlID0g ZXhwYW5kX2Jpbm9wIChQbW9kZSwgYWRkX29wdGFiLCBvcDAsIG9wMSwKCQkJICAgICAgIE5VTExf UlRYLCB0cnVlLCBPUFRBQl9ESVJFQ1QpOwoJICB4ID0gZ2VuX3J0eF9QTFVTIChQbW9kZSwgYmFz ZSwgb2Zmc2V0X3J0eCk7Cgl9CgogICAgICBIT1NUX1dJREVfSU5UIHNpemU7CiAgICAgIGlmIChH RVRfTU9ERV9TSVpFIChtb2RlKS5pc19jb25zdGFudCAoJnNpemUpKQoJewoJICBIT1NUX1dJREVf SU5UIGJhc2Vfb2Zmc2V0ID0gYWFyY2g2NF9hbmNob3Jfb2Zmc2V0IChvZmZzZXQsIHNpemUsCgkJ CQkJCQkgICAgIG1vZGUpOwoJICBpZiAoYmFzZV9vZmZzZXQgIT0gMCkKCSAgICB7CgkgICAgICBi YXNlID0gcGx1c19jb25zdGFudCAoUG1vZGUsIGJhc2UsIGJhc2Vfb2Zmc2V0KTsKCSAgICAgIGJh c2UgPSBmb3JjZV9vcGVyYW5kIChiYXNlLCBOVUxMX1JUWCk7CgkgICAgICByZXR1cm4gcGx1c19j b25zdGFudCAoUG1vZGUsIGJhc2UsIG9mZnNldCAtIGJhc2Vfb2Zmc2V0KTsKCSAgICB9Cgl9CiAg ICB9CgogIHJldHVybiB4Owp9CgpzdGF0aWMgcmVnX2NsYXNzX3QKYWFyY2g2NF9zZWNvbmRhcnlf cmVsb2FkIChib29sIGluX3AgQVRUUklCVVRFX1VOVVNFRCwgcnR4IHgsCgkJCSAgcmVnX2NsYXNz X3QgcmNsYXNzLAoJCQkgIG1hY2hpbmVfbW9kZSBtb2RlLAoJCQkgIHNlY29uZGFyeV9yZWxvYWRf aW5mbyAqc3JpKQp7CiAgLyogVXNlIGFhcmNoNjRfc3ZlX3JlbG9hZF9tZW0gZm9yIFNWRSBtZW1v cnkgcmVsb2FkcyB0aGF0IGNhbm5vdCB1c2UKICAgICBMRFIgYW5kIFNUUi4gIFNlZSB0aGUgY29t bWVudCBhdCB0aGUgaGVhZCBvZiBhYXJjaDY0LXN2ZS5tZCBmb3IKICAgICBtb3JlIGRldGFpbHMg YWJvdXQgdGhlIGJpZy1lbmRpYW4gaGFuZGxpbmcuICAqLwogIHVuc2lnbmVkIGludCB2ZWNfZmxh Z3MgPSBhYXJjaDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlIChtb2RlKTsKICBpZiAocmVnX2NsYXNz X3N1YnNldF9wIChyY2xhc3MsIEZQX1JFR1MpCiAgICAgICYmICEoKFJFR19QICh4KSAmJiBIQVJE X1JFR0lTVEVSX1AgKHgpKQoJICAgfHwgYWFyY2g2NF9zaW1kX3ZhbGlkX2ltbWVkaWF0ZSAoeCwg TlVMTCkpCiAgICAgICYmIG1vZGUgIT0gVk54MTZRSW1vZGUKICAgICAgJiYgKHZlY19mbGFncyAm IFZFQ19TVkVfREFUQSkKICAgICAgJiYgKCh2ZWNfZmxhZ3MgJiBWRUNfUEFSVElBTCkgfHwgQllU RVNfQklHX0VORElBTikpCiAgICB7CiAgICAgIHNyaS0+aWNvZGUgPSBDT0RFX0ZPUl9hYXJjaDY0 X3N2ZV9yZWxvYWRfbWVtOwogICAgICByZXR1cm4gTk9fUkVHUzsKICAgIH0KCiAgLyogSWYgd2Ug aGF2ZSB0byBkaXNhYmxlIGRpcmVjdCBsaXRlcmFsIHBvb2wgbG9hZHMgYW5kIHN0b3JlcyBiZWNh dXNlIHRoZQogICAgIGZ1bmN0aW9uIGlzIHRvbyBiaWcsIHRoZW4gd2UgbmVlZCBhIHNjcmF0Y2gg cmVnaXN0ZXIuICAqLwogIGlmIChNRU1fUCAoeCkgJiYgU1lNQk9MX1JFRl9QICh4KSAmJiBDT05T VEFOVF9QT09MX0FERFJFU1NfUCAoeCkKICAgICAgJiYgKFNDQUxBUl9GTE9BVF9NT0RFX1AgKEdF VF9NT0RFICh4KSkKCSAgfHwgdGFyZ2V0bS52ZWN0b3JfbW9kZV9zdXBwb3J0ZWRfcCAoR0VUX01P REUgKHgpKSkKICAgICAgJiYgIWFhcmNoNjRfcGNyZWxhdGl2ZV9saXRlcmFsX2xvYWRzKQogICAg ewogICAgICBzcmktPmljb2RlID0gY29kZV9mb3JfYWFyY2g2NF9yZWxvYWRfbW92Y3AgKG1vZGUs IERJbW9kZSk7CiAgICAgIHJldHVybiBOT19SRUdTOwogICAgfQoKICAvKiBXaXRob3V0IHRoZSBU QVJHRVRfU0lNRCBpbnN0cnVjdGlvbnMgd2UgY2Fubm90IG1vdmUgYSBRIHJlZ2lzdGVyCiAgICAg dG8gYSBRIHJlZ2lzdGVyIGRpcmVjdGx5LiAgV2UgbmVlZCBhIHNjcmF0Y2guICAqLwogIGlmIChS RUdfUCAoeCkKICAgICAgJiYgKG1vZGUgPT0gVEZtb2RlCgkgIHx8IG1vZGUgPT0gVEltb2RlCgkg IHx8IG1vZGUgPT0gVERtb2RlCgkgIHx8ICh2ZWNfZmxhZ3MgPT0gVkVDX0FEVlNJTUQgJiYga25v d25fZXEgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCAxNikpKQogICAgICAmJiBtb2RlID09IEdFVF9N T0RFICh4KQogICAgICAmJiAhVEFSR0VUX1NJTUQKICAgICAgJiYgRlBfUkVHTlVNX1AgKFJFR05P ICh4KSkKICAgICAgJiYgcmVnX2NsYXNzX3N1YnNldF9wIChyY2xhc3MsIEZQX1JFR1MpKQogICAg ewogICAgICBzcmktPmljb2RlID0gY29kZV9mb3JfYWFyY2g2NF9yZWxvYWRfbW92IChtb2RlKTsK ICAgICAgcmV0dXJuIE5PX1JFR1M7CiAgICB9CgogIC8qIEEgVEZtb2RlLCBUSW1vZGUgb3IgVERt b2RlIG1lbW9yeSBhY2Nlc3Mgc2hvdWxkIGJlIGhhbmRsZWQgdmlhIGFuIEZQX1JFR1MKICAgICBi ZWNhdXNlIEFBcmNoNjQgaGFzIHJpY2hlciBhZGRyZXNzaW5nIG1vZGVzIGZvciBMRFIvU1RSIGlu c3RydWN0aW9ucwogICAgIHRoYW4gTERQL1NUUCBpbnN0cnVjdGlvbnMuICAqLwogIGlmIChUQVJH RVRfRkxPQVQgJiYgcmNsYXNzID09IEdFTkVSQUxfUkVHUwogICAgICAmJiBrbm93bl9lcSAoR0VU X01PREVfU0laRSAobW9kZSksIDE2KSAmJiBNRU1fUCAoeCkpCiAgICByZXR1cm4gRlBfUkVHUzsK CiAgaWYgKHJjbGFzcyA9PSBGUF9SRUdTCiAgICAgICYmIChtb2RlID09IFRJbW9kZSB8fCBtb2Rl ID09IFRGbW9kZSB8fCBtb2RlID09IFREbW9kZSkKICAgICAgJiYgQ09OU1RBTlRfUCh4KSkKICAg ICAgcmV0dXJuIEdFTkVSQUxfUkVHUzsKCiAgcmV0dXJuIE5PX1JFR1M7Cn0KCi8qIEltcGxlbWVu dCBUQVJHRVRfU0VDT05EQVJZX01FTU9SWV9ORUVERUQuICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2 NF9zZWNvbmRhcnlfbWVtb3J5X25lZWRlZCAobWFjaGluZV9tb2RlIG1vZGUsIHJlZ19jbGFzc190 IGNsYXNzMSwKCQkJCSByZWdfY2xhc3NfdCBjbGFzczIpCnsKICBpZiAoIVRBUkdFVF9TSU1ECiAg ICAgICYmIHJlZ19jbGFzc2VzX2ludGVyc2VjdF9wIChjbGFzczEsIEZQX1JFR1MpCiAgICAgICYm IHJlZ19jbGFzc2VzX2ludGVyc2VjdF9wIChjbGFzczIsIEZQX1JFR1MpKQogICAgewogICAgICAv KiBXZSBjYW4ndCBkbyBhIDEyOC1iaXQgRlBSLXRvLUZQUiBtb3ZlIHdpdGhvdXQgVEFSR0VUX1NJ TUQsCgkgc28gd2UgY2FuJ3QgZWFzaWx5IHNwbGl0IGEgbW92ZSBpbnZvbHZpbmcgdHVwbGVzIG9m IDEyOC1iaXQKCSB2ZWN0b3JzLiAgRm9yY2UgdGhlIGNvcHkgdGhyb3VnaCBtZW1vcnkgaW5zdGVh ZC4KCgkgKFR1cGxlcyBvZiA2NC1iaXQgdmVjdG9ycyBhcmUgZmluZS4pICAqLwogICAgICB1bnNp Z25lZCBpbnQgdmVjX2ZsYWdzID0gYWFyY2g2NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAobW9kZSk7 CiAgICAgIGlmICh2ZWNfZmxhZ3MgPT0gKFZFQ19BRFZTSU1EIHwgVkVDX1NUUlVDVCkpCglyZXR1 cm4gdHJ1ZTsKICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCnN0YXRpYyBib29sCmFhcmNoNjRfY2Fu X2VsaW1pbmF0ZSAoY29uc3QgaW50IGZyb20gQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgaW50IHRv KQp7CiAgZ2NjX2Fzc2VydCAoZnJvbSA9PSBBUkdfUE9JTlRFUl9SRUdOVU0gfHwgZnJvbSA9PSBG UkFNRV9QT0lOVEVSX1JFR05VTSk7CgogIC8qIElmIHdlIG5lZWQgYSBmcmFtZSBwb2ludGVyLCBB UkdfUE9JTlRFUl9SRUdOVU0gYW5kIEZSQU1FX1BPSU5URVJfUkVHTlVNCiAgICAgY2FuIG9ubHkg ZWxpbWluYXRlIHRvIEhBUkRfRlJBTUVfUE9JTlRFUl9SRUdOVU0uICAqLwogIGlmIChmcmFtZV9w b2ludGVyX25lZWRlZCkKICAgIHJldHVybiB0byA9PSBIQVJEX0ZSQU1FX1BPSU5URVJfUkVHTlVN OwogIHJldHVybiB0cnVlOwp9Cgpwb2x5X2ludDY0CmFhcmNoNjRfaW5pdGlhbF9lbGltaW5hdGlv bl9vZmZzZXQgKHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQp7CiAgaWYgKHRvID09IEhBUkRf RlJBTUVfUE9JTlRFUl9SRUdOVU0pCiAgICB7CiAgICAgIGlmIChmcm9tID09IEFSR19QT0lOVEVS X1JFR05VTSkKCXJldHVybiBjZnVuLT5tYWNoaW5lLT5mcmFtZS5oYXJkX2ZwX29mZnNldDsKCiAg ICAgIGlmIChmcm9tID09IEZSQU1FX1BPSU5URVJfUkVHTlVNKQoJcmV0dXJuIGNmdW4tPm1hY2hp bmUtPmZyYW1lLmhhcmRfZnBfb2Zmc2V0CgkgICAgICAgLSBjZnVuLT5tYWNoaW5lLT5mcmFtZS5s b2NhbHNfb2Zmc2V0OwogICAgfQoKICBpZiAodG8gPT0gU1RBQ0tfUE9JTlRFUl9SRUdOVU0pCiAg ICB7CiAgICAgIGlmIChmcm9tID09IEZSQU1FX1BPSU5URVJfUkVHTlVNKQoJICByZXR1cm4gY2Z1 bi0+bWFjaGluZS0+ZnJhbWUuZnJhbWVfc2l6ZQoJCSAtIGNmdW4tPm1hY2hpbmUtPmZyYW1lLmxv Y2Fsc19vZmZzZXQ7CiAgICB9CgogIHJldHVybiBjZnVuLT5tYWNoaW5lLT5mcmFtZS5mcmFtZV9z aXplOwp9CgoKLyogR2V0IHJldHVybiBhZGRyZXNzIHdpdGhvdXQgbWFuZ2xpbmcuICAqLwoKcnR4 CmFhcmNoNjRfcmV0dXJuX2FkZHJfcnR4ICh2b2lkKQp7CiAgcnR4IHZhbCA9IGdldF9oYXJkX3Jl Z19pbml0aWFsX3ZhbCAoUG1vZGUsIExSX1JFR05VTSk7CiAgLyogTm90ZTogYWFyY2g2NF9yZXR1 cm5fYWRkcmVzc19zaWduaW5nX2VuYWJsZWQgb25seQogICAgIHdvcmtzIGFmdGVyIGNmdW4tPm1h Y2hpbmUtPmZyYW1lLmxhaWRfb3V0IGlzIHNldCwKICAgICBzbyBoZXJlIHdlIGRvbid0IGtub3cg aWYgdGhlIHJldHVybiBhZGRyZXNzIHdpbGwKICAgICBiZSBzaWduZWQgb3Igbm90LiAgKi8KICBy dHggbHIgPSBnZW5fcnR4X1JFRyAoUG1vZGUsIExSX1JFR05VTSk7CiAgZW1pdF9tb3ZlX2luc24g KGxyLCB2YWwpOwogIGVtaXRfaW5zbiAoR0VOX0ZDTiAoQ09ERV9GT1JfeHBhY2xyaSkgKCkpOwog IHJldHVybiBscjsKfQoKCi8qIEltcGxlbWVudCBSRVRVUk5fQUREUl9SVFguICBXZSBkbyBub3Qg c3VwcG9ydCBtb3ZpbmcgYmFjayB0byBhCiAgIHByZXZpb3VzIGZyYW1lLiAgKi8KCnJ0eAphYXJj aDY0X3JldHVybl9hZGRyIChpbnQgY291bnQsIHJ0eCBmcmFtZSBBVFRSSUJVVEVfVU5VU0VEKQp7 CiAgaWYgKGNvdW50ICE9IDApCiAgICByZXR1cm4gY29uc3QwX3J0eDsKICByZXR1cm4gYWFyY2g2 NF9yZXR1cm5fYWRkcl9ydHggKCk7Cn0KCnN0YXRpYyB2b2lkCmFhcmNoNjRfYXNtX3RyYW1wb2xp bmVfdGVtcGxhdGUgKEZJTEUgKmYpCnsKICAvKiBFdmVuIGlmIHRoZSBjdXJyZW50IGZ1bmN0aW9u IGRvZXNuJ3QgaGF2ZSBicmFuY2ggcHJvdGVjdGlvbiwgc29tZQogICAgIGxhdGVyIGZ1bmN0aW9u IG1pZ2h0LCBzbyBzaW5jZSB0aGlzIHRlbXBsYXRlIGlzIG9ubHkgZ2VuZXJhdGVkIG9uY2UKICAg ICB3ZSBoYXZlIHRvIGFkZCBhIEJUSSBqdXN0IGluIGNhc2UuICovCiAgYXNtX2ZwcmludGYgKGYs ICJcdGhpbnRcdDM0IC8vIGJ0aSBjXG4iKTsKCiAgaWYgKFRBUkdFVF9JTFAzMikKICAgIHsKICAg ICAgYXNtX2ZwcmludGYgKGYsICJcdGxkclx0dyVkLCAuKzIwXG4iLCBJUDFfUkVHTlVNIC0gUjBf UkVHTlVNKTsKICAgICAgYXNtX2ZwcmludGYgKGYsICJcdGxkclx0dyVkLCAuKzIwXG4iLCBTVEFU SUNfQ0hBSU5fUkVHTlVNIC0gUjBfUkVHTlVNKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGFz bV9mcHJpbnRmIChmLCAiXHRsZHJcdCVzLCAuKzIwXG4iLCByZWdfbmFtZXMgW0lQMV9SRUdOVU1d KTsKICAgICAgYXNtX2ZwcmludGYgKGYsICJcdGxkclx0JXMsIC4rMjRcbiIsIHJlZ19uYW1lcyBb U1RBVElDX0NIQUlOX1JFR05VTV0pOwogICAgfQogIGFzbV9mcHJpbnRmIChmLCAiXHRiclx0JXNc biIsIHJlZ19uYW1lcyBbSVAxX1JFR05VTV0pOwoKICAvKiBXZSBhbHdheXMgZW1pdCBhIHNwZWN1 bGF0aW9uIGJhcnJpZXIuCiAgICAgVGhpcyBpcyBiZWNhdXNlIHRoZSBzYW1lIHRyYW1wb2xpbmUg dGVtcGxhdGUgaXMgdXNlZCBmb3IgZXZlcnkgbmVzdGVkCiAgICAgZnVuY3Rpb24uICBTaW5jZSBu ZXN0ZWQgZnVuY3Rpb25zIGFyZSBub3QgcGFydGljdWxhcmx5IGNvbW1vbiBvcgogICAgIHBlcmZv cm1hbnQgd2UgZG9uJ3Qgd29ycnkgdG9vIG11Y2ggYWJvdXQgdGhlIGV4dHJhIGluc3RydWN0aW9u cyB0byBjb3B5CiAgICAgYXJvdW5kLgogICAgIFRoaXMgaXMgbm90IHlldCBhIHByb2JsZW0sIHNp bmNlIHdlIGhhdmUgbm90IHlldCBpbXBsZW1lbnRlZCBmdW5jdGlvbgogICAgIHNwZWNpZmljIGF0 dHJpYnV0ZXMgdG8gY2hvb3NlIGJldHdlZW4gaGFyZGVuaW5nIGFnYWluc3Qgc3RyYWlnaHQgbGlu ZQogICAgIHNwZWN1bGF0aW9uIG9yIG5vdCwgYnV0IHN1Y2ggZnVuY3Rpb24gc3BlY2lmaWMgYXR0 cmlidXRlcyBhcmUgbGlrZWx5IHRvCiAgICAgaGFwcGVuIGluIHRoZSBmdXR1cmUuICAqLwogIGFz bV9mcHJpbnRmIChmLCAiXHRkc2JcdHN5XG5cdGlzYlxuIik7CgogIGFzc2VtYmxlX2FsaWduZWRf aW50ZWdlciAoUE9JTlRFUl9CWVRFUywgY29uc3QwX3J0eCk7CiAgYXNzZW1ibGVfYWxpZ25lZF9p bnRlZ2VyIChQT0lOVEVSX0JZVEVTLCBjb25zdDBfcnR4KTsKfQoKc3RhdGljIHZvaWQKYWFyY2g2 NF90cmFtcG9saW5lX2luaXQgKHJ0eCBtX3RyYW1wLCB0cmVlIGZuZGVjbCwgcnR4IGNoYWluX3Zh bHVlKQp7CiAgcnR4IGZuYWRkciwgbWVtLCBhX3RyYW1wOwogIGNvbnN0IGludCB0cmFtcF9jb2Rl X3N6ID0gMjQ7CgogIC8qIERvbid0IG5lZWQgdG8gY29weSB0aGUgdHJhaWxpbmcgRC13b3Jkcywg d2UgZmlsbCB0aG9zZSBpbiBiZWxvdy4gICovCiAgLyogV2UgY3JlYXRlIG91ciBvd24gbWVtb3J5 IGFkZHJlc3MgaW4gUG1vZGUgc28gdGhhdCBgZW1pdF9ibG9ja19tb3ZlYCBjYW4KICAgICB1c2Ug cGFydHMgb2YgdGhlIGJhY2tlbmQgd2hpY2ggZXhwZWN0IFBtb2RlIGFkZHJlc3Nlcy4gICovCiAg cnR4IHRlbXAgPSBjb252ZXJ0X21lbW9yeV9hZGRyZXNzIChQbW9kZSwgWEVYUCAobV90cmFtcCwg MCkpOwogIGVtaXRfYmxvY2tfbW92ZSAoZ2VuX3J0eF9NRU0gKEJMS21vZGUsIHRlbXApLAoJCSAg IGFzc2VtYmxlX3RyYW1wb2xpbmVfdGVtcGxhdGUgKCksCgkJICAgR0VOX0lOVCAodHJhbXBfY29k ZV9zeiksIEJMT0NLX09QX05PUk1BTCk7CiAgbWVtID0gYWRqdXN0X2FkZHJlc3MgKG1fdHJhbXAs IHB0cl9tb2RlLCB0cmFtcF9jb2RlX3N6KTsKICBmbmFkZHIgPSBYRVhQIChERUNMX1JUTCAoZm5k ZWNsKSwgMCk7CiAgaWYgKEdFVF9NT0RFIChmbmFkZHIpICE9IHB0cl9tb2RlKQogICAgZm5hZGRy ID0gY29udmVydF9tZW1vcnlfYWRkcmVzcyAocHRyX21vZGUsIGZuYWRkcik7CiAgZW1pdF9tb3Zl X2luc24gKG1lbSwgZm5hZGRyKTsKCiAgbWVtID0gYWRqdXN0X2FkZHJlc3MgKG1fdHJhbXAsIHB0 cl9tb2RlLCB0cmFtcF9jb2RlX3N6ICsgUE9JTlRFUl9CWVRFUyk7CiAgZW1pdF9tb3ZlX2luc24g KG1lbSwgY2hhaW5fdmFsdWUpOwoKICAvKiBYWFggV2Ugc2hvdWxkIHJlYWxseSBkZWZpbmUgYSAi Y2xlYXJfY2FjaGUiIHBhdHRlcm4gYW5kIHVzZQogICAgIGdlbl9jbGVhcl9jYWNoZSgpLiAgKi8K ICBhX3RyYW1wID0gWEVYUCAobV90cmFtcCwgMCk7CiAgbWF5YmVfZW1pdF9jYWxsX2J1aWx0aW5f X19jbGVhcl9jYWNoZSAoYV90cmFtcCwKCQkJCQkgcGx1c19jb25zdGFudCAocHRyX21vZGUsCgkJ CQkJCQlhX3RyYW1wLAoJCQkJCQkJVFJBTVBPTElORV9TSVpFKSk7Cn0KCnN0YXRpYyB1bnNpZ25l ZCBjaGFyCmFhcmNoNjRfY2xhc3NfbWF4X25yZWdzIChyZWdfY2xhc3NfdCByZWdjbGFzcywgbWFj aGluZV9tb2RlIG1vZGUpCnsKICAvKiA/Pz8gTG9naWNhbGx5IHdlIHNob3VsZCBvbmx5IG5lZWQg dG8gcHJvdmlkZSBhIHZhbHVlIHdoZW4KICAgICBIQVJEX1JFR05PX01PREVfT0sgc2F5cyB0aGF0 IGF0IGxlYXN0IG9uZSByZWdpc3RlciBpbiBSRUdDTEFTUwogICAgIGNhbiBob2xkIE1PREUsIGJ1 dCBhdCB0aGUgbW9tZW50IHdlIG5lZWQgdG8gaGFuZGxlIGFsbCBtb2Rlcy4KICAgICBKdXN0IGln bm9yZSBhbnkgcnVudGltZSBwYXJ0cyBmb3IgcmVnaXN0ZXJzIHRoYXQgY2FuJ3Qgc3RvcmUgdGhl bS4gICovCiAgSE9TVF9XSURFX0lOVCBsb3dlc3Rfc2l6ZSA9IGNvbnN0YW50X2xvd2VyX2JvdW5k IChHRVRfTU9ERV9TSVpFIChtb2RlKSk7CiAgdW5zaWduZWQgaW50IG5yZWdzLCB2ZWNfZmxhZ3M7 CiAgc3dpdGNoIChyZWdjbGFzcykKICAgIHsKICAgIGNhc2UgU1RVQl9SRUdTOgogICAgY2FzZSBU QUlMQ0FMTF9BRERSX1JFR1M6CiAgICBjYXNlIFBPSU5URVJfUkVHUzoKICAgIGNhc2UgR0VORVJB TF9SRUdTOgogICAgY2FzZSBBTExfUkVHUzoKICAgIGNhc2UgUE9JTlRFUl9BTkRfRlBfUkVHUzoK ICAgIGNhc2UgRlBfUkVHUzoKICAgIGNhc2UgRlBfTE9fUkVHUzoKICAgIGNhc2UgRlBfTE84X1JF R1M6CiAgICAgIHZlY19mbGFncyA9IGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9yX21vZGUgKG1vZGUp OwogICAgICBpZiAoKHZlY19mbGFncyAmIFZFQ19TVkVfREFUQSkKCSAgJiYgY29uc3RhbnRfbXVs dGlwbGVfcCAoR0VUX01PREVfU0laRSAobW9kZSksCgkJCQkgIGFhcmNoNjRfdmxfYnl0ZXMgKG1v ZGUsIHZlY19mbGFncyksICZucmVncykpCglyZXR1cm4gbnJlZ3M7CiAgICAgIHJldHVybiAodmVj X2ZsYWdzICYgVkVDX0FEVlNJTUQKCSAgICAgID8gQ0VJTCAobG93ZXN0X3NpemUsIFVOSVRTX1BF Ul9WUkVHKQoJICAgICAgOiBDRUlMIChsb3dlc3Rfc2l6ZSwgVU5JVFNfUEVSX1dPUkQpKTsKICAg IGNhc2UgU1RBQ0tfUkVHOgogICAgY2FzZSBQUl9SRUdTOgogICAgY2FzZSBQUl9MT19SRUdTOgog ICAgY2FzZSBQUl9ISV9SRUdTOgogICAgY2FzZSBGRlJfUkVHUzoKICAgIGNhc2UgUFJfQU5EX0ZG Ul9SRUdTOgogICAgICByZXR1cm4gMTsKCiAgICBjYXNlIE5PX1JFR1M6CiAgICAgIHJldHVybiAw OwoKICAgIGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogICAgfQogIGdjY191bnJlYWNoYWJsZSAoKTsK fQoKc3RhdGljIHJlZ19jbGFzc190CmFhcmNoNjRfcHJlZmVycmVkX3JlbG9hZF9jbGFzcyAocnR4 IHgsIHJlZ19jbGFzc190IHJlZ2NsYXNzKQp7CiAgaWYgKHJlZ2NsYXNzID09IFBPSU5URVJfUkVH UykKICAgIHJldHVybiBHRU5FUkFMX1JFR1M7CgogIGlmIChyZWdjbGFzcyA9PSBTVEFDS19SRUcp CiAgICB7CiAgICAgIGlmIChSRUdfUCh4KQoJICAmJiByZWdfY2xhc3Nfc3Vic2V0X3AgKFJFR05P X1JFR19DTEFTUyAoUkVHTk8gKHgpKSwgUE9JTlRFUl9SRUdTKSkKCSAgcmV0dXJuIHJlZ2NsYXNz OwoKICAgICAgcmV0dXJuIE5PX1JFR1M7CiAgICB9CgogIC8qIFJlZ2lzdGVyIGVsaW1pbmlhdGlv biBjYW4gcmVzdWx0IGluIGEgcmVxdWVzdCBmb3IKICAgICBTUCtjb25zdGFudC0+RlBfUkVHUy4g IFdlIGNhbm5vdCBzdXBwb3J0IHN1Y2ggb3BlcmF0aW9ucyB3aGljaAogICAgIHVzZSBTUCBhcyBz b3VyY2UgYW5kIGFuIEZQX1JFRyBhcyBkZXN0aW5hdGlvbiwgc28gcmVqZWN0IG91dAogICAgIHJp Z2h0IG5vdy4gICovCiAgaWYgKCEgcmVnX2NsYXNzX3N1YnNldF9wIChyZWdjbGFzcywgR0VORVJB TF9SRUdTKSAmJiBHRVRfQ09ERSAoeCkgPT0gUExVUykKICAgIHsKICAgICAgcnR4IGxocyA9IFhF WFAgKHgsIDApOwoKICAgICAgLyogTG9vayB0aHJvdWdoIGEgcG9zc2libGUgU1VCUkVHIGludHJv ZHVjZWQgYnkgSUxQMzIuICAqLwogICAgICBpZiAoU1VCUkVHX1AgKGxocykpCglsaHMgPSBTVUJS RUdfUkVHIChsaHMpOwoKICAgICAgZ2NjX2Fzc2VydCAoUkVHX1AgKGxocykpOwogICAgICBnY2Nf YXNzZXJ0IChyZWdfY2xhc3Nfc3Vic2V0X3AgKFJFR05PX1JFR19DTEFTUyAoUkVHTk8gKGxocykp LAoJCQkJICAgICAgUE9JTlRFUl9SRUdTKSk7CiAgICAgIHJldHVybiBOT19SRUdTOwogICAgfQoK ICByZXR1cm4gcmVnY2xhc3M7Cn0KCnZvaWQKYWFyY2g2NF9hc21fb3V0cHV0X2xhYmVscmVmIChG SUxFKiBmLCBjb25zdCBjaGFyICpuYW1lKQp7CiAgYXNtX2ZwcmludGYgKGYsICIlVSVzIiwgbmFt ZSk7Cn0KCnN0YXRpYyB2b2lkCmFhcmNoNjRfZWxmX2FzbV9jb25zdHJ1Y3RvciAocnR4IHN5bWJv bCwgaW50IHByaW9yaXR5KQp7CiAgaWYgKHByaW9yaXR5ID09IERFRkFVTFRfSU5JVF9QUklPUklU WSkKICAgIGRlZmF1bHRfY3Rvcl9zZWN0aW9uX2FzbV9vdXRfY29uc3RydWN0b3IgKHN5bWJvbCwg cHJpb3JpdHkpOwogIGVsc2UKICAgIHsKICAgICAgc2VjdGlvbiAqczsKICAgICAgLyogV2hpbGUg cHJpb3JpdHkgaXMga25vd24gdG8gYmUgaW4gcmFuZ2UgWzAsIDY1NTM1XSwgc28gMTggYnl0ZXMK ICAgICAgICAgd291bGQgYmUgZW5vdWdoLCB0aGUgY29tcGlsZXIgbWlnaHQgbm90IGtub3cgdGhh dC4gIFRvIGF2b2lkCiAgICAgICAgIC1XZm9ybWF0LXRydW5jYXRpb24gZmFsc2UgcG9zaXRpdmUs IHVzZSBhIGxhcmdlciBzaXplLiAgKi8KICAgICAgY2hhciBidWZbMjNdOwogICAgICBzbnByaW50 ZiAoYnVmLCBzaXplb2YgKGJ1ZiksICIuaW5pdF9hcnJheS4lLjV1IiwgcHJpb3JpdHkpOwogICAg ICBzID0gZ2V0X3NlY3Rpb24gKGJ1ZiwgU0VDVElPTl9XUklURSB8IFNFQ1RJT05fTk9UWVBFLCBO VUxMKTsKICAgICAgc3dpdGNoX3RvX3NlY3Rpb24gKHMpOwogICAgICBhc3NlbWJsZV9hbGlnbiAo UE9JTlRFUl9TSVpFKTsKICAgICAgYXNzZW1ibGVfYWxpZ25lZF9pbnRlZ2VyIChQT0lOVEVSX0JZ VEVTLCBzeW1ib2wpOwogICAgfQp9CgpzdGF0aWMgdm9pZAphYXJjaDY0X2VsZl9hc21fZGVzdHJ1 Y3RvciAocnR4IHN5bWJvbCwgaW50IHByaW9yaXR5KQp7CiAgaWYgKHByaW9yaXR5ID09IERFRkFV TFRfSU5JVF9QUklPUklUWSkKICAgIGRlZmF1bHRfZHRvcl9zZWN0aW9uX2FzbV9vdXRfZGVzdHJ1 Y3RvciAoc3ltYm9sLCBwcmlvcml0eSk7CiAgZWxzZQogICAgewogICAgICBzZWN0aW9uICpzOwog ICAgICAvKiBXaGlsZSBwcmlvcml0eSBpcyBrbm93biB0byBiZSBpbiByYW5nZSBbMCwgNjU1MzVd LCBzbyAxOCBieXRlcwogICAgICAgICB3b3VsZCBiZSBlbm91Z2gsIHRoZSBjb21waWxlciBtaWdo dCBub3Qga25vdyB0aGF0LiAgVG8gYXZvaWQKICAgICAgICAgLVdmb3JtYXQtdHJ1bmNhdGlvbiBm YWxzZSBwb3NpdGl2ZSwgdXNlIGEgbGFyZ2VyIHNpemUuICAqLwogICAgICBjaGFyIGJ1ZlsyM107 CiAgICAgIHNucHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSwgIi5maW5pX2FycmF5LiUuNXUiLCBw cmlvcml0eSk7CiAgICAgIHMgPSBnZXRfc2VjdGlvbiAoYnVmLCBTRUNUSU9OX1dSSVRFIHwgU0VD VElPTl9OT1RZUEUsIE5VTEwpOwogICAgICBzd2l0Y2hfdG9fc2VjdGlvbiAocyk7CiAgICAgIGFz c2VtYmxlX2FsaWduIChQT0lOVEVSX1NJWkUpOwogICAgICBhc3NlbWJsZV9hbGlnbmVkX2ludGVn ZXIgKFBPSU5URVJfQllURVMsIHN5bWJvbCk7CiAgICB9Cn0KCmNvbnN0IGNoYXIqCmFhcmNoNjRf b3V0cHV0X2Nhc2VzaSAocnR4ICpvcGVyYW5kcykKewogIGNoYXIgYnVmWzEwMF07CiAgY2hhciBs YWJlbFsxMDBdOwogIHJ0eCBkaWZmX3ZlYyA9IFBBVFRFUk4gKE5FWFRfSU5TTiAoYXNfYSA8cnR4 X2luc24gKj4gKG9wZXJhbmRzWzJdKSkpOwogIGludCBpbmRleDsKICBzdGF0aWMgY29uc3QgY2hh ciAqY29uc3QgcGF0dGVybnNbNF1bMl0gPQogIHsKICAgIHsKICAgICAgImxkcmJcdCV3MywgWyUw LCV3MSx1eHR3XSIsCiAgICAgICJhZGRcdCUzLCAlNCwgJXczLCBzeHRiICMyIgogICAgfSwKICAg IHsKICAgICAgImxkcmhcdCV3MywgWyUwLCV3MSx1eHR3ICMxXSIsCiAgICAgICJhZGRcdCUzLCAl NCwgJXczLCBzeHRoICMyIgogICAgfSwKICAgIHsKICAgICAgImxkclx0JXczLCBbJTAsJXcxLHV4 dHcgIzJdIiwKICAgICAgImFkZFx0JTMsICU0LCAldzMsIHN4dHcgIzIiCiAgICB9LAogICAgLyog V2UgYXNzdW1lIHRoYXQgREltb2RlIGlzIG9ubHkgZ2VuZXJhdGVkIHdoZW4gbm90IG9wdGltaXpp bmcgYW5kCiAgICAgICB0aGF0IHdlIGRvbid0IHJlYWxseSBuZWVkIDY0LWJpdCBhZGRyZXNzIG9m ZnNldHMuICBUaGF0IHdvdWxkCiAgICAgICBpbXBseSBhbiBvYmplY3QgZmlsZSB3aXRoIDhHQiBv ZiBjb2RlIGluIGEgc2luZ2xlIGZ1bmN0aW9uISAgKi8KICAgIHsKICAgICAgImxkclx0JXczLCBb JTAsJXcxLHV4dHcgIzJdIiwKICAgICAgImFkZFx0JTMsICU0LCAldzMsIHN4dHcgIzIiCiAgICB9 CiAgfTsKCiAgZ2NjX2Fzc2VydCAoR0VUX0NPREUgKGRpZmZfdmVjKSA9PSBBRERSX0RJRkZfVkVD KTsKCiAgc2NhbGFyX2ludF9tb2RlIG1vZGUgPSBhc19hIDxzY2FsYXJfaW50X21vZGU+IChHRVRf TU9ERSAoZGlmZl92ZWMpKTsKICBpbmRleCA9IGV4YWN0X2xvZzIgKEdFVF9NT0RFX1NJWkUgKG1v ZGUpKTsKCiAgZ2NjX2Fzc2VydCAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSAzKTsKCiAgLyogTmVl ZCB0byBpbXBsZW1lbnQgdGFibGUgc2l6ZSByZWR1Y3Rpb24sIGJ5IGNoYW5pbmcgdGhlIGNvZGUg YmVsb3cuICAqLwogIG91dHB1dF9hc21faW5zbiAocGF0dGVybnNbaW5kZXhdWzBdLCBvcGVyYW5k cyk7CiAgQVNNX0dFTkVSQVRFX0lOVEVSTkFMX0xBQkVMIChsYWJlbCwgIkxydHgiLCBDT0RFX0xB QkVMX05VTUJFUiAob3BlcmFuZHNbMl0pKTsKICBzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1Ziks CgkgICAgImFkclx0JSU0LCAlcyIsIHRhcmdldG0uc3RyaXBfbmFtZV9lbmNvZGluZyAobGFiZWwp KTsKICBvdXRwdXRfYXNtX2luc24gKGJ1Ziwgb3BlcmFuZHMpOwogIG91dHB1dF9hc21faW5zbiAo cGF0dGVybnNbaW5kZXhdWzFdLCBvcGVyYW5kcyk7CiAgb3V0cHV0X2FzbV9pbnNuICgiYnJcdCUz Iiwgb3BlcmFuZHMpOwogIG91dHB1dF9hc21faW5zbiAoYWFyY2g2NF9zbHNfYmFycmllciAoYWFy Y2g2NF9oYXJkZW5fc2xzX3JldGJyX3AgKCkpLAoJCSAgIG9wZXJhbmRzKTsKICBhc3NlbWJsZV9s YWJlbCAoYXNtX291dF9maWxlLCBsYWJlbCk7CiAgcmV0dXJuICIiOwp9CgoKLyogUmV0dXJuIHNp emUgaW4gYml0cyBvZiBhbiBhcml0aG1ldGljIG9wZXJhbmQgd2hpY2ggaXMgc2hpZnRlZC9zY2Fs ZWQgYW5kCiAgIG1hc2tlZCBzdWNoIHRoYXQgaXQgaXMgc3VpdGFibGUgZm9yIGEgVVhUQiwgVVhU SCwgb3IgVVhUVyBleHRlbmQKICAgb3BlcmF0b3IuICAqLwoKaW50CmFhcmNoNjRfdXh0X3NpemUg KGludCBzaGlmdCwgSE9TVF9XSURFX0lOVCBtYXNrKQp7CiAgaWYgKHNoaWZ0ID49IDAgJiYgc2hp ZnQgPD0gNCkKICAgIHsKICAgICAgaW50IHNpemU7CiAgICAgIGZvciAoc2l6ZSA9IDg7IHNpemUg PD0gMzI7IHNpemUgKj0gMikKCXsKCSAgSE9TVF9XSURFX0lOVCBiaXRzID0gKChIT1NUX1dJREVf SU5UKTFVIDw8IHNpemUpIC0gMTsKCSAgaWYgKG1hc2sgPT0gYml0cyA8PCBzaGlmdCkKCSAgICBy ZXR1cm4gc2l6ZTsKCX0KICAgIH0KICByZXR1cm4gMDsKfQoKLyogQ29uc3RhbnQgcG9vbHMgYXJl IHBlciBmdW5jdGlvbiBvbmx5IHdoZW4gUEMgcmVsYXRpdmUKICAgbGl0ZXJhbCBsb2FkcyBhcmUg dHJ1ZSBvciB3ZSBhcmUgaW4gdGhlIGxhcmdlIG1lbW9yeQogICBtb2RlbC4gICovCgpzdGF0aWMg aW5saW5lIGJvb2wKYWFyY2g2NF9jYW5fdXNlX3Blcl9mdW5jdGlvbl9saXRlcmFsX3Bvb2xzX3Ag KHZvaWQpCnsKICByZXR1cm4gKGFhcmNoNjRfcGNyZWxhdGl2ZV9saXRlcmFsX2xvYWRzCgkgIHx8 IGFhcmNoNjRfY21vZGVsID09IEFBUkNINjRfQ01PREVMX0xBUkdFKTsKfQoKc3RhdGljIGJvb2wK YWFyY2g2NF91c2VfYmxvY2tzX2Zvcl9jb25zdGFudF9wIChtYWNoaW5lX21vZGUsIGNvbnN0X3J0 eCkKewogIC8qIFdlIGNhbid0IHVzZSBibG9ja3MgZm9yIGNvbnN0YW50cyB3aGVuIHdlJ3JlIHVz aW5nIGEgcGVyLWZ1bmN0aW9uCiAgICAgY29uc3RhbnQgcG9vbC4gICovCiAgcmV0dXJuICFhYXJj aDY0X2Nhbl91c2VfcGVyX2Z1bmN0aW9uX2xpdGVyYWxfcG9vbHNfcCAoKTsKfQoKLyogU2VsZWN0 IGFwcHJvcHJpYXRlIHNlY3Rpb24gZm9yIGNvbnN0YW50cyBkZXBlbmRpbmcKICAgb24gd2hlcmUg d2UgcGxhY2UgbGl0ZXJhbCBwb29scy4gICovCgpzdGF0aWMgc2VjdGlvbiAqCmFhcmNoNjRfc2Vs ZWN0X3J0eF9zZWN0aW9uIChtYWNoaW5lX21vZGUgbW9kZSwKCQkJICAgIHJ0eCB4LAoJCQkgICAg dW5zaWduZWQgSE9TVF9XSURFX0lOVCBhbGlnbikKewogIGlmIChhYXJjaDY0X2Nhbl91c2VfcGVy X2Z1bmN0aW9uX2xpdGVyYWxfcG9vbHNfcCAoKSkKICAgIHJldHVybiBmdW5jdGlvbl9zZWN0aW9u IChjdXJyZW50X2Z1bmN0aW9uX2RlY2wpOwoKICByZXR1cm4gZGVmYXVsdF9lbGZfc2VsZWN0X3J0 eF9zZWN0aW9uIChtb2RlLCB4LCBhbGlnbik7Cn0KCi8qIEltcGxlbWVudCBBU01fT1VUUFVUX1BP T0xfRVBJTE9HVUUuICAqLwp2b2lkCmFhcmNoNjRfYXNtX291dHB1dF9wb29sX2VwaWxvZ3VlIChG SUxFICpmLCBjb25zdCBjaGFyICosIHRyZWUsCgkJCQkgIEhPU1RfV0lERV9JTlQgb2Zmc2V0KQp7 CiAgLyogV2hlbiB1c2luZyBwZXItZnVuY3Rpb24gbGl0ZXJhbCBwb29scywgd2UgbXVzdCBlbnN1 cmUgdGhhdCBhbnkgY29kZQogICAgIHNlY3Rpb24gaXMgYWxpZ25lZCB0byB0aGUgbWluaW1hbCBp bnN0cnVjdGlvbiBsZW5ndGgsIGxlc3Qgd2UgZ2V0CiAgICAgZXJyb3JzIGZyb20gdGhlIGFzc2Vt YmxlciByZSAidW5hbGlnbmVkIGluc3RydWN0aW9ucyIuICAqLwogIGlmICgob2Zmc2V0ICYgMykg JiYgYWFyY2g2NF9jYW5fdXNlX3Blcl9mdW5jdGlvbl9saXRlcmFsX3Bvb2xzX3AgKCkpCiAgICBB U01fT1VUUFVUX0FMSUdOIChmLCAyKTsKfQoKLyogQ29zdHMuICAqLwoKLyogSGVscGVyIGZ1bmN0 aW9uIGZvciBydHggY29zdCBjYWxjdWxhdGlvbi4gIFN0cmlwIGEgc2hpZnQgZXhwcmVzc2lvbgog ICBmcm9tIFguICBSZXR1cm5zIHRoZSBpbm5lciBvcGVyYW5kIGlmIHN1Y2Nlc3NmdWwsIG9yIHRo ZSBvcmlnaW5hbAogICBleHByZXNzaW9uIG9uIGZhaWx1cmUuICAqLwpzdGF0aWMgcnR4CmFhcmNo NjRfc3RyaXBfc2hpZnQgKHJ0eCB4KQp7CiAgcnR4IG9wID0geDsKCiAgLyogV2UgYWNjZXB0IGJv dGggUk9UQVRFUlQgYW5kIFJPVEFURTogc2luY2UgdGhlIFJIUyBtdXN0IGJlIGEgY29uc3RhbnQK ICAgICB3ZSBjYW4gY29udmVydCBib3RoIHRvIFJPUiBkdXJpbmcgZmluYWwgb3V0cHV0LiAgKi8K ICBpZiAoKEdFVF9DT0RFIChvcCkgPT0gQVNISUZUCiAgICAgICB8fCBHRVRfQ09ERSAob3ApID09 IEFTSElGVFJUCiAgICAgICB8fCBHRVRfQ09ERSAob3ApID09IExTSElGVFJUCiAgICAgICB8fCBH RVRfQ09ERSAob3ApID09IFJPVEFURVJUCiAgICAgICB8fCBHRVRfQ09ERSAob3ApID09IFJPVEFU RSkKICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKG9wLCAxKSkpCiAgICByZXR1cm4gWEVYUCAo b3AsIDApOwoKICBpZiAoR0VUX0NPREUgKG9wKSA9PSBNVUxUCiAgICAgICYmIENPTlNUX0lOVF9Q IChYRVhQIChvcCwgMSkpCiAgICAgICYmICgodW5zaWduZWQpIGV4YWN0X2xvZzIgKElOVFZBTCAo WEVYUCAob3AsIDEpKSkpIDwgNjQpCiAgICByZXR1cm4gWEVYUCAob3AsIDApOwoKICByZXR1cm4g eDsKfQoKLyogSGVscGVyIGZ1bmN0aW9uIGZvciBydHggY29zdCBjYWxjdWxhdGlvbi4gIFN0cmlw IGFuIGV4dGVuZAogICBleHByZXNzaW9uIGZyb20gWC4gIFJldHVybnMgdGhlIGlubmVyIG9wZXJh bmQgaWYgc3VjY2Vzc2Z1bCwgb3IgdGhlCiAgIG9yaWdpbmFsIGV4cHJlc3Npb24gb24gZmFpbHVy ZS4gIFdlIGRlYWwgd2l0aCBhIG51bWJlciBvZiBwb3NzaWJsZQogICBjYW5vbmljYWxpemF0aW9u IHZhcmlhdGlvbnMgaGVyZS4gSWYgU1RSSVBfU0hJRlQgaXMgdHJ1ZSwgdGhlbgogICB3ZSBjYW4g c3RyaXAgb2ZmIGEgc2hpZnQgYWxzby4gICovCnN0YXRpYyBydHgKYWFyY2g2NF9zdHJpcF9leHRl bmQgKHJ0eCB4LCBib29sIHN0cmlwX3NoaWZ0KQp7CiAgc2NhbGFyX2ludF9tb2RlIG1vZGU7CiAg cnR4IG9wID0geDsKCiAgaWYgKCFpc19hIDxzY2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAob3Ap LCAmbW9kZSkpCiAgICByZXR1cm4gb3A7CgogIGlmIChHRVRfQ09ERSAob3ApID09IEFORAogICAg ICAmJiBHRVRfQ09ERSAoWEVYUCAob3AsIDApKSA9PSBNVUxUCiAgICAgICYmIENPTlNUX0lOVF9Q IChYRVhQIChYRVhQIChvcCwgMCksIDEpKQogICAgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAob3As IDEpKQogICAgICAmJiBhYXJjaDY0X3V4dF9zaXplIChleGFjdF9sb2cyIChJTlRWQUwgKFhFWFAg KFhFWFAgKG9wLCAwKSwgMSkpKSwKCQkJICAgSU5UVkFMIChYRVhQIChvcCwgMSkpKSAhPSAwKQog ICAgcmV0dXJuIFhFWFAgKFhFWFAgKG9wLCAwKSwgMCk7CgogIC8qIE5vdyBoYW5kbGUgZXh0ZW5k ZWQgcmVnaXN0ZXIsIGFzIHRoaXMgbWF5IGFsc28gaGF2ZSBhbiBvcHRpb25hbAogICAgIGxlZnQg c2hpZnQgYnkgMS4uNC4gICovCiAgaWYgKHN0cmlwX3NoaWZ0CiAgICAgICYmIEdFVF9DT0RFIChv cCkgPT0gQVNISUZUCiAgICAgICYmIENPTlNUX0lOVF9QIChYRVhQIChvcCwgMSkpCiAgICAgICYm ICgodW5zaWduZWQgSE9TVF9XSURFX0lOVCkgSU5UVkFMIChYRVhQIChvcCwgMSkpKSA8PSA0KQog ICAgb3AgPSBYRVhQIChvcCwgMCk7CgogIGlmIChHRVRfQ09ERSAob3ApID09IFpFUk9fRVhURU5E CiAgICAgIHx8IEdFVF9DT0RFIChvcCkgPT0gU0lHTl9FWFRFTkQpCiAgICBvcCA9IFhFWFAgKG9w LCAwKTsKCiAgaWYgKG9wICE9IHgpCiAgICByZXR1cm4gb3A7CgogIHJldHVybiB4Owp9CgovKiBI ZWxwZXIgZnVuY3Rpb24gZm9yIHJ0eCBjb3N0IGNhbGN1bGF0aW9uLiBTdHJpcCBleHRlbnNpb24g YXMgd2VsbCBhcyBhbnkKICAgaW5uZXIgVkVDX1NFTEVDVCBoaWdoLWhhbGYgZnJvbSBYLiBSZXR1 cm5zIHRoZSBpbm5lciB2ZWN0b3Igb3BlcmFuZCBpZgogICBzdWNjZXNzZnVsLCBvciB0aGUgb3Jp Z2luYWwgZXhwcmVzc2lvbiBvbiBmYWlsdXJlLiAgKi8Kc3RhdGljIHJ0eAphYXJjaDY0X3N0cmlw X2V4dGVuZF92ZWNfaGFsZiAocnR4IHgpCnsKICBpZiAoR0VUX0NPREUgKHgpID09IFpFUk9fRVhU RU5EIHx8IEdFVF9DT0RFICh4KSA9PSBTSUdOX0VYVEVORCkKICAgIHsKICAgICAgeCA9IFhFWFAg KHgsIDApOwogICAgICBpZiAoR0VUX0NPREUgKHgpID09IFZFQ19TRUxFQ1QKCSAgJiYgdmVjX3Nl cmllc19oaWdocGFydF9wIChHRVRfTU9ERSAoeCksIEdFVF9NT0RFIChYRVhQICh4LCAwKSksCgkJ CQkgICAgWEVYUCAoeCwgMSkpKQoJeCA9IFhFWFAgKHgsIDApOwogICAgfQogIHJldHVybiB4Owp9 CgovKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJ0eCBjb3N0IGNhbGN1bGF0aW9uLiBTdHJpcCBWRUNf RFVQTElDQVRFIGFzIHdlbGwgYXMKICAgYW55IHN1YnNlcXVlbnQgZXh0ZW5kIGFuZCBWRUNfU0VM RUNUIGZyb20gWC4gUmV0dXJucyB0aGUgaW5uZXIgc2NhbGFyCiAgIG9wZXJhbmQgaWYgc3VjY2Vz c2Z1bCwgb3IgdGhlIG9yaWdpbmFsIGV4cHJlc3Npb24gb24gZmFpbHVyZS4gICovCnN0YXRpYyBy dHgKYWFyY2g2NF9zdHJpcF9kdXBsaWNhdGVfdmVjX2VsdCAocnR4IHgpCnsKICBpZiAoR0VUX0NP REUgKHgpID09IFZFQ19EVVBMSUNBVEUKICAgICAgJiYgaXNfYTxzY2FsYXJfbW9kZT4gKEdFVF9N T0RFIChYRVhQICh4LCAwKSkpKQogICAgewogICAgICB4ID0gWEVYUCAoeCwgMCk7CiAgICAgIGlm IChHRVRfQ09ERSAoeCkgPT0gVkVDX1NFTEVDVCkKCXggPSBYRVhQICh4LCAwKTsKICAgICAgZWxz ZSBpZiAoKEdFVF9DT0RFICh4KSA9PSBaRVJPX0VYVEVORCB8fCBHRVRfQ09ERSAoeCkgPT0gU0lH Tl9FWFRFTkQpCgkgICAgICAgJiYgR0VUX0NPREUgKFhFWFAgKHgsIDApKSA9PSBWRUNfU0VMRUNU KQoJeCA9IFhFWFAgKFhFWFAgKHgsIDApLCAwKTsKICAgIH0KICByZXR1cm4geDsKfQoKLyogUmV0 dXJuIHRydWUgaWZmIENPREUgaXMgYSBzaGlmdCBzdXBwb3J0ZWQgaW4gY29tYmluYXRpb24KICAg d2l0aCBhcml0aG1ldGljIGluc3RydWN0aW9ucy4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3No aWZ0X3AgKGVudW0gcnR4X2NvZGUgY29kZSkKewogIHJldHVybiBjb2RlID09IEFTSElGVCB8fCBj b2RlID09IEFTSElGVFJUIHx8IGNvZGUgPT0gTFNISUZUUlQ7Cn0KCgovKiBSZXR1cm4gdHJ1ZSBp ZmYgWCBpcyBhIGNoZWFwIHNoaWZ0IHdpdGhvdXQgYSBzaWduIGV4dGVuZC4gKi8KCnN0YXRpYyBi b29sCmFhcmNoNjRfY2hlYXBfbXVsdF9zaGlmdF9wIChydHggeCkKewogIHJ0eCBvcDAsIG9wMTsK CiAgb3AwID0gWEVYUCAoeCwgMCk7CiAgb3AxID0gWEVYUCAoeCwgMSk7CgogIGlmICghKGFhcmNo NjRfdHVuZV9wYXJhbXMuZXh0cmFfdHVuaW5nX2ZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAm IEFBUkNINjRfRVhUUkFfVFVORV9DSEVBUF9TSElGVF9FWFRFTkQpKQogICAgcmV0dXJuIGZhbHNl OwoKICBpZiAoR0VUX0NPREUgKG9wMCkgPT0gU0lHTl9FWFRFTkQpCiAgICByZXR1cm4gZmFsc2U7 CgogIGlmIChHRVRfQ09ERSAoeCkgPT0gQVNISUZUICYmIENPTlNUX0lOVF9QIChvcDEpCiAgICAg ICYmIFVJTlRWQUwgKG9wMSkgPD0gNCkKICAgIHJldHVybiB0cnVlOwoKICBpZiAoR0VUX0NPREUg KHgpICE9IE1VTFQgfHwgIUNPTlNUX0lOVF9QIChvcDEpKQogICAgcmV0dXJuIGZhbHNlOwoKICBI T1NUX1dJREVfSU5UIGwyID0gZXhhY3RfbG9nMiAoSU5UVkFMIChvcDEpKTsKCiAgaWYgKGwyID4g MCAmJiBsMiA8PSA0KQogICAgcmV0dXJuIHRydWU7CgogIHJldHVybiBmYWxzZTsKfQoKLyogSGVs cGVyIGZ1bmN0aW9uIGZvciBydHggY29zdCBjYWxjdWxhdGlvbi4gIENhbGN1bGF0ZSB0aGUgY29z dCBvZgogICBhIE1VTFQgb3IgQVNISUZULCB3aGljaCBtYXkgYmUgcGFydCBvZiBhIGNvbXBvdW5k IFBMVVMvTUlOVVMgcnR4LgogICBSZXR1cm4gdGhlIGNhbGN1bGF0ZWQgY29zdCBvZiB0aGUgZXhw cmVzc2lvbiwgcmVjdXJzaW5nIG1hbnVhbGx5IGluIHRvCiAgIG9wZXJhbmRzIHdoZXJlIG5lZWRl ZC4gICovCgpzdGF0aWMgaW50CmFhcmNoNjRfcnR4X211bHRfY29zdCAocnR4IHgsIGVudW0gcnR4 X2NvZGUgY29kZSwgaW50IG91dGVyLCBib29sIHNwZWVkKQp7CiAgcnR4IG9wMCwgb3AxOwogIGNv bnN0IHN0cnVjdCBjcHVfY29zdF90YWJsZSAqZXh0cmFfY29zdAogICAgPSBhYXJjaDY0X3R1bmVf cGFyYW1zLmluc25fZXh0cmFfY29zdDsKICBpbnQgY29zdCA9IDA7CiAgYm9vbCBjb21wb3VuZF9w ID0gKG91dGVyID09IFBMVVMgfHwgb3V0ZXIgPT0gTUlOVVMpOwogIG1hY2hpbmVfbW9kZSBtb2Rl ID0gR0VUX01PREUgKHgpOwoKICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChjb2RlID09IE1VTFQpOwoK ICBvcDAgPSBYRVhQICh4LCAwKTsKICBvcDEgPSBYRVhQICh4LCAxKTsKCiAgaWYgKFZFQ1RPUl9N T0RFX1AgKG1vZGUpKQogICAgewogICAgICB1bnNpZ25lZCBpbnQgdmVjX2ZsYWdzID0gYWFyY2g2 NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAobW9kZSk7CiAgICAgIGlmIChUQVJHRVRfU0lNRCAmJiAo dmVjX2ZsYWdzICYgVkVDX0FEVlNJTUQpKQoJewoJICAvKiBUaGUgc2VsZWN0LW9wZXJhbmQtaGln aC1oYWxmIHZlcnNpb25zIG9mIHRoZSBpbnN0cnVjdGlvbiBoYXZlIHRoZQoJICAgICBzYW1lIGNv c3QgYXMgdGhlIHRocmVlIHZlY3RvciB2ZXJzaW9uIC0gZG9uJ3QgYWRkIHRoZSBjb3N0cyBvZiB0 aGUKCSAgICAgZXh0ZW5zaW9uIG9yIHNlbGVjdGlvbiBpbnRvIHRoZSBjb3N0cyBvZiB0aGUgbXVs dGlwbHkuICAqLwoJICBvcDAgPSBhYXJjaDY0X3N0cmlwX2V4dGVuZF92ZWNfaGFsZiAob3AwKTsK CSAgb3AxID0gYWFyY2g2NF9zdHJpcF9leHRlbmRfdmVjX2hhbGYgKG9wMSk7CgkgIC8qIFRoZSBi eS1lbGVtZW50IHZlcnNpb25zIG9mIHRoZSBpbnN0cnVjdGlvbiBoYXZlIHRoZSBzYW1lIGNvc3Rz IGFzCgkgICAgIHRoZSBub3JtYWwgMy12ZWN0b3IgdmVyc2lvbi4gIFdlIG1ha2UgYW4gYXNzdW1w dGlvbiB0aGF0IHRoZSBpbnB1dAoJICAgICB0byB0aGUgVkVDX0RVUExJQ0FURSBpcyBhbHJlYWR5 IG9uIHRoZSBGUCAmIFNJTUQgc2lkZS4gIFRoaXMgbWVhbnMKCSAgICAgY29zdGluZyBvZiBhIE1V TCBieSBlbGVtZW50IHByZSBSQSBpcyBhIGJpdCBvcHRpbWlzdGljLiAgKi8KCSAgb3AwID0gYWFy Y2g2NF9zdHJpcF9kdXBsaWNhdGVfdmVjX2VsdCAob3AwKTsKCSAgb3AxID0gYWFyY2g2NF9zdHJp cF9kdXBsaWNhdGVfdmVjX2VsdCAob3AxKTsKCX0KICAgICAgY29zdCArPSBydHhfY29zdCAob3Aw LCBtb2RlLCBNVUxULCAwLCBzcGVlZCk7CiAgICAgIGNvc3QgKz0gcnR4X2Nvc3QgKG9wMSwgbW9k ZSwgTVVMVCwgMSwgc3BlZWQpOwogICAgICBpZiAoc3BlZWQpCgl7CgkgIGlmIChHRVRfQ09ERSAo eCkgPT0gTVVMVCkKCSAgICBjb3N0ICs9IGV4dHJhX2Nvc3QtPnZlY3QubXVsdDsKCSAgLyogVGhp cyBpcyB0byBjYXRjaCB0aGUgU1NSQSBjb3N0aW5nIGN1cnJlbnRseSBmbG93aW5nIGhlcmUuICAq LwoJICBlbHNlCgkgICAgY29zdCArPSBleHRyYV9jb3N0LT52ZWN0LmFsdTsKCX0KICAgICAgcmV0 dXJuIGNvc3Q7CiAgICB9CgogIC8qIEludGVnZXIgbXVsdGlwbHkvZm1hLiAgKi8KICBpZiAoR0VU X01PREVfQ0xBU1MgKG1vZGUpID09IE1PREVfSU5UKQogICAgewogICAgICAvKiBUaGUgbXVsdGlw bHkgd2lsbCBiZSBjYW5vbmljYWxpemVkIGFzIGEgc2hpZnQsIGNvc3QgaXQgYXMgc3VjaC4gICov CiAgICAgIGlmIChhYXJjaDY0X3NoaWZ0X3AgKEdFVF9DT0RFICh4KSkKCSAgfHwgKENPTlNUX0lO VF9QIChvcDEpCgkgICAgICAmJiBleGFjdF9sb2cyIChJTlRWQUwgKG9wMSkpID4gMCkpCgl7Cgkg IGJvb2wgaXNfZXh0ZW5kID0gR0VUX0NPREUgKG9wMCkgPT0gWkVST19FWFRFTkQKCSAgICAgICAg ICAgICAgICAgICB8fCBHRVRfQ09ERSAob3AwKSA9PSBTSUdOX0VYVEVORDsKCSAgaWYgKHNwZWVk KQoJICAgIHsKCSAgICAgIGlmIChjb21wb3VuZF9wKQoJICAgICAgICB7CgkJICAvKiBJZiB0aGUg c2hpZnQgaXMgY29uc2lkZXJlZCBjaGVhcCwKCQkgICAgIHRoZW4gZG9uJ3QgYWRkIGFueSBjb3N0 LiAqLwoJCSAgaWYgKGFhcmNoNjRfY2hlYXBfbXVsdF9zaGlmdF9wICh4KSkKCQkgICAgOwoJICAg ICAgICAgIGVsc2UgaWYgKFJFR19QIChvcDEpKQoJCSAgICAvKiBBUklUSCArIHNoaWZ0LWJ5LXJl Z2lzdGVyLiAgKi8KCQkgICAgY29zdCArPSBleHRyYV9jb3N0LT5hbHUuYXJpdGhfc2hpZnRfcmVn OwoJCSAgZWxzZSBpZiAoaXNfZXh0ZW5kKQoJCSAgICAvKiBBUklUSCArIGV4dGVuZGVkIHJlZ2lz dGVyLiAgV2UgZG9uJ3QgaGF2ZSBhIGNvc3QgZmllbGQKCQkgICAgICAgZm9yIEFSSVRIK0VYVEVO RCtTSElGVCwgc28gdXNlIGV4dGVuZF9hcml0aCBoZXJlLiAgKi8KCQkgICAgY29zdCArPSBleHRy YV9jb3N0LT5hbHUuZXh0ZW5kX2FyaXRoOwoJCSAgZWxzZQoJCSAgICAvKiBBUklUSCArIHNoaWZ0 LWJ5LWltbWVkaWF0ZS4gICovCgkJICAgIGNvc3QgKz0gZXh0cmFfY29zdC0+YWx1LmFyaXRoX3No aWZ0OwoJCX0KCSAgICAgIGVsc2UKCQkvKiBMU0wgKGltbWVkaWF0ZSkuICAqLwoJICAgICAgICBj b3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5zaGlmdDsKCgkgICAgfQoJICAvKiBTdHJpcCBleHRlbmRz IGFzIHdlIHdpbGwgaGF2ZSBjb3N0ZWQgdGhlbSBpbiB0aGUgY2FzZSBhYm92ZS4gICovCgkgIGlm IChpc19leHRlbmQpCgkgICAgb3AwID0gYWFyY2g2NF9zdHJpcF9leHRlbmQgKG9wMCwgdHJ1ZSk7 CgoJICBjb3N0ICs9IHJ0eF9jb3N0IChvcDAsIFZPSURtb2RlLCBjb2RlLCAwLCBzcGVlZCk7CgoJ ICByZXR1cm4gY29zdDsKCX0KCiAgICAgIC8qIE1ORUcgb3IgW1VTXU1ORUdMLiAgRXh0cmFjdCB0 aGUgTkVHIG9wZXJhbmQgYW5kIGluZGljYXRlIHRoYXQgaXQncyBhCgkgY29tcG91bmQgYW5kIGxl dCB0aGUgYmVsb3cgY2FzZXMgaGFuZGxlIGl0LiAgQWZ0ZXIgYWxsLCBNTkVHIGlzIGEKCSBzcGVj aWFsLWNhc2UgYWxpYXMgb2YgTVNVQi4gICovCiAgICAgIGlmIChHRVRfQ09ERSAob3AwKSA9PSBO RUcpCgl7CgkgIG9wMCA9IFhFWFAgKG9wMCwgMCk7CgkgIGNvbXBvdW5kX3AgPSB0cnVlOwoJfQoK ICAgICAgLyogSW50ZWdlciBtdWx0aXBsaWVzIG9yIEZNQXMgaGF2ZSB6ZXJvL3NpZ24gZXh0ZW5k aW5nIHZhcmlhbnRzLiAgKi8KICAgICAgaWYgKChHRVRfQ09ERSAob3AwKSA9PSBaRVJPX0VYVEVO RAoJICAgJiYgR0VUX0NPREUgKG9wMSkgPT0gWkVST19FWFRFTkQpCgkgIHx8IChHRVRfQ09ERSAo b3AwKSA9PSBTSUdOX0VYVEVORAoJICAgICAgJiYgR0VUX0NPREUgKG9wMSkgPT0gU0lHTl9FWFRF TkQpKQoJewoJICBjb3N0ICs9IHJ0eF9jb3N0IChYRVhQIChvcDAsIDApLCBWT0lEbW9kZSwgTVVM VCwgMCwgc3BlZWQpOwoJICBjb3N0ICs9IHJ0eF9jb3N0IChYRVhQIChvcDEsIDApLCBWT0lEbW9k ZSwgTVVMVCwgMSwgc3BlZWQpOwoKCSAgaWYgKHNwZWVkKQoJICAgIHsKCSAgICAgIGlmIChjb21w b3VuZF9wKQoJCS8qIFNNQURETC9VTUFEREwvVU1TVUJML1NNU1VCTC4gICovCgkJY29zdCArPSBl eHRyYV9jb3N0LT5tdWx0WzBdLmV4dGVuZF9hZGQ7CgkgICAgICBlbHNlCgkJLyogTVVML1NNVUxM L1VNVUxMLiAgKi8KCQljb3N0ICs9IGV4dHJhX2Nvc3QtPm11bHRbMF0uZXh0ZW5kOwoJICAgIH0K CgkgIHJldHVybiBjb3N0OwoJfQoKICAgICAgLyogVGhpcyBpcyBlaXRoZXIgYW4gaW50ZWdlciBt dWx0aXBseSBvciBhIE1BREQuICBJbiBib3RoIGNhc2VzCgkgd2Ugd2FudCB0byByZWN1cnNlIGFu ZCBjb3N0IHRoZSBvcGVyYW5kcy4gICovCiAgICAgIGNvc3QgKz0gcnR4X2Nvc3QgKG9wMCwgbW9k ZSwgTVVMVCwgMCwgc3BlZWQpOwogICAgICBjb3N0ICs9IHJ0eF9jb3N0IChvcDEsIG1vZGUsIE1V TFQsIDEsIHNwZWVkKTsKCiAgICAgIGlmIChzcGVlZCkKCXsKCSAgaWYgKGNvbXBvdW5kX3ApCgkg ICAgLyogTUFERC9NU1VCLiAgKi8KCSAgICBjb3N0ICs9IGV4dHJhX2Nvc3QtPm11bHRbbW9kZSA9 PSBESW1vZGVdLmFkZDsKCSAgZWxzZQoJICAgIC8qIE1VTC4gICovCgkgICAgY29zdCArPSBleHRy YV9jb3N0LT5tdWx0W21vZGUgPT0gREltb2RlXS5zaW1wbGU7Cgl9CgogICAgICByZXR1cm4gY29z dDsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGlmIChzcGVlZCkKCXsKCSAgLyogRmxvYXRpbmct cG9pbnQgRk1BL0ZNVUwgY2FuIGFsc28gc3VwcG9ydCBuZWdhdGlvbnMgb2YgdGhlCgkgICAgIG9w ZXJhbmRzLCB1bmxlc3MgdGhlIHJvdW5kaW5nIG1vZGUgaXMgdXB3YXJkIG9yIGRvd253YXJkIGlu CgkgICAgIHdoaWNoIGNhc2UgRk5NVUwgaXMgZGlmZmVyZW50IHRoYW4gRk1VTCB3aXRoIG9wZXJh bmQgbmVnYXRpb24uICAqLwoJICBib29sIG5lZzAgPSBHRVRfQ09ERSAob3AwKSA9PSBORUc7Cgkg IGJvb2wgbmVnMSA9IEdFVF9DT0RFIChvcDEpID09IE5FRzsKCSAgaWYgKGNvbXBvdW5kX3AgfHwg IWZsYWdfcm91bmRpbmdfbWF0aCB8fCAobmVnMCAmJiBuZWcxKSkKCSAgICB7CgkgICAgICBpZiAo bmVnMCkKCQlvcDAgPSBYRVhQIChvcDAsIDApOwoJICAgICAgaWYgKG5lZzEpCgkJb3AxID0gWEVY UCAob3AxLCAwKTsKCSAgICB9CgoJICBpZiAoY29tcG91bmRfcCkKCSAgICAvKiBGTUFERC9GTk1B REQvRk5NU1VCL0ZNU1VCLiAgKi8KCSAgICBjb3N0ICs9IGV4dHJhX2Nvc3QtPmZwW21vZGUgPT0g REZtb2RlXS5mbWE7CgkgIGVsc2UKCSAgICAvKiBGTVVML0ZOTVVMLiAgKi8KCSAgICBjb3N0ICs9 IGV4dHJhX2Nvc3QtPmZwW21vZGUgPT0gREZtb2RlXS5tdWx0OwoJfQoKICAgICAgY29zdCArPSBy dHhfY29zdCAob3AwLCBtb2RlLCBNVUxULCAwLCBzcGVlZCk7CiAgICAgIGNvc3QgKz0gcnR4X2Nv c3QgKG9wMSwgbW9kZSwgTVVMVCwgMSwgc3BlZWQpOwogICAgICByZXR1cm4gY29zdDsKICAgIH0K fQoKc3RhdGljIGludAphYXJjaDY0X2FkZHJlc3NfY29zdCAocnR4IHgsCgkJICAgICAgbWFjaGlu ZV9tb2RlIG1vZGUsCgkJICAgICAgYWRkcl9zcGFjZV90IGFzIEFUVFJJQlVURV9VTlVTRUQsCgkJ ICAgICAgYm9vbCBzcGVlZCkKewogIGVudW0gcnR4X2NvZGUgYyA9IEdFVF9DT0RFICh4KTsKICBj b25zdCBzdHJ1Y3QgY3B1X2FkZHJjb3N0X3RhYmxlICphZGRyX2Nvc3QgPSBhYXJjaDY0X3R1bmVf cGFyYW1zLmFkZHJfY29zdDsKICBzdHJ1Y3QgYWFyY2g2NF9hZGRyZXNzX2luZm8gaW5mbzsKICBp bnQgY29zdCA9IDA7CiAgaW5mby5zaGlmdCA9IDA7CgogIGlmICghYWFyY2g2NF9jbGFzc2lmeV9h ZGRyZXNzICgmaW5mbywgeCwgbW9kZSwgZmFsc2UpKQogICAgewogICAgICBpZiAoR0VUX0NPREUg KHgpID09IENPTlNUIHx8IFNZTUJPTF9SRUZfUCAoeCkpCgl7CgkgIC8qIFRoaXMgaXMgYSBDT05T VCBvciBTWU1CT0wgcmVmIHdoaWNoIHdpbGwgYmUgc3BsaXQKCSAgICAgaW4gYSBkaWZmZXJlbnQg d2F5IGRlcGVuZGluZyBvbiB0aGUgY29kZSBtb2RlbCBpbiB1c2UuCgkgICAgIENvc3QgaXQgdGhy b3VnaCB0aGUgZ2VuZXJpYyBpbmZyYXN0cnVjdHVyZS4gICovCgkgIGludCBjb3N0X3N5bWJvbF9y ZWYgPSBydHhfY29zdCAoeCwgUG1vZGUsIE1FTSwgMSwgc3BlZWQpOwoJICAvKiBEaXZpZGUgdGhy b3VnaCBieSB0aGUgY29zdCBvZiBvbmUgaW5zdHJ1Y3Rpb24gdG8KCSAgICAgYnJpbmcgaXQgdG8g dGhlIHNhbWUgdW5pdHMgYXMgdGhlIGFkZHJlc3MgY29zdHMuICAqLwoJICBjb3N0X3N5bWJvbF9y ZWYgLz0gQ09TVFNfTl9JTlNOUyAoMSk7CgkgIC8qIFRoZSBjb3N0IGlzIHRoZW4gdGhlIGNvc3Qg b2YgcHJlcGFyaW5nIHRoZSBhZGRyZXNzLAoJICAgICBmb2xsb3dlZCBieSBhbiBpbW1lZGlhdGUg KHBvc3NpYmx5IDApIG9mZnNldC4gICovCgkgIHJldHVybiBjb3N0X3N5bWJvbF9yZWYgKyBhZGRy X2Nvc3QtPmltbV9vZmZzZXQ7Cgl9CiAgICAgIGVsc2UKCXsKCSAgLyogVGhpcyBpcyBtb3N0IGxp a2VseSBhIGp1bXAgdGFibGUgZnJvbSBhIGNhc2UKCSAgICAgc3RhdGVtZW50LiAgKi8KCSAgcmV0 dXJuIGFkZHJfY29zdC0+cmVnaXN0ZXJfb2Zmc2V0OwoJfQogICAgfQoKICBzd2l0Y2ggKGluZm8u dHlwZSkKICAgIHsKICAgICAgY2FzZSBBRERSRVNTX0xPX1NVTToKICAgICAgY2FzZSBBRERSRVNT X1NZTUJPTElDOgogICAgICBjYXNlIEFERFJFU1NfUkVHX0lNTToKCWNvc3QgKz0gYWRkcl9jb3N0 LT5pbW1fb2Zmc2V0OwoJYnJlYWs7CgogICAgICBjYXNlIEFERFJFU1NfUkVHX1dCOgoJaWYgKGMg PT0gUFJFX0lOQyB8fCBjID09IFBSRV9ERUMgfHwgYyA9PSBQUkVfTU9ESUZZKQoJICBjb3N0ICs9 IGFkZHJfY29zdC0+cHJlX21vZGlmeTsKCWVsc2UgaWYgKGMgPT0gUE9TVF9JTkMgfHwgYyA9PSBQ T1NUX0RFQyB8fCBjID09IFBPU1RfTU9ESUZZKQoJICB7CgkgICAgdW5zaWduZWQgaW50IG52ZWN0 b3JzID0gYWFyY2g2NF9sZG5fc3RuX3ZlY3RvcnMgKG1vZGUpOwoJICAgIGlmIChudmVjdG9ycyA9 PSAzKQoJICAgICAgY29zdCArPSBhZGRyX2Nvc3QtPnBvc3RfbW9kaWZ5X2xkM19zdDM7CgkgICAg ZWxzZSBpZiAobnZlY3RvcnMgPT0gNCkKCSAgICAgIGNvc3QgKz0gYWRkcl9jb3N0LT5wb3N0X21v ZGlmeV9sZDRfc3Q0OwoJICAgIGVsc2UKCSAgICAgIGNvc3QgKz0gYWRkcl9jb3N0LT5wb3N0X21v ZGlmeTsKCSAgfQoJZWxzZQoJICBnY2NfdW5yZWFjaGFibGUgKCk7CgoJYnJlYWs7CgogICAgICBj YXNlIEFERFJFU1NfUkVHX1JFRzoKCWNvc3QgKz0gYWRkcl9jb3N0LT5yZWdpc3Rlcl9vZmZzZXQ7 CglicmVhazsKCiAgICAgIGNhc2UgQUREUkVTU19SRUdfU1hUVzoKCWNvc3QgKz0gYWRkcl9jb3N0 LT5yZWdpc3Rlcl9zZXh0ZW5kOwoJYnJlYWs7CgogICAgICBjYXNlIEFERFJFU1NfUkVHX1VYVFc6 Cgljb3N0ICs9IGFkZHJfY29zdC0+cmVnaXN0ZXJfemV4dGVuZDsKCWJyZWFrOwoKICAgICAgZGVm YXVsdDoKCWdjY191bnJlYWNoYWJsZSAoKTsKICAgIH0KCgogIGlmIChpbmZvLnNoaWZ0ID4gMCkK ICAgIHsKICAgICAgLyogRm9yIHRoZSBzYWtlIG9mIGNhbGN1bGF0aW5nIHRoZSBjb3N0IG9mIHRo ZSBzaGlmdGVkIHJlZ2lzdGVyCgkgY29tcG9uZW50LCB3ZSBjYW4gdHJlYXQgc2FtZSBzaXplZCBt b2RlcyBpbiB0aGUgc2FtZSB3YXkuICAqLwogICAgICBpZiAoa25vd25fZXEgKEdFVF9NT0RFX0JJ VFNJWkUgKG1vZGUpLCAxNikpCgljb3N0ICs9IGFkZHJfY29zdC0+YWRkcl9zY2FsZV9jb3N0cy5o aTsKICAgICAgZWxzZSBpZiAoa25vd25fZXEgKEdFVF9NT0RFX0JJVFNJWkUgKG1vZGUpLCAzMikp Cgljb3N0ICs9IGFkZHJfY29zdC0+YWRkcl9zY2FsZV9jb3N0cy5zaTsKICAgICAgZWxzZSBpZiAo a25vd25fZXEgKEdFVF9NT0RFX0JJVFNJWkUgKG1vZGUpLCA2NCkpCgljb3N0ICs9IGFkZHJfY29z dC0+YWRkcl9zY2FsZV9jb3N0cy5kaTsKICAgICAgZWxzZQoJLyogV2UgY2FuJ3QgdGVsbCwgb3Ig dGhpcyBpcyBhIDEyOC1iaXQgdmVjdG9yLiAgKi8KCWNvc3QgKz0gYWRkcl9jb3N0LT5hZGRyX3Nj YWxlX2Nvc3RzLnRpOwogICAgfQoKICByZXR1cm4gY29zdDsKfQoKLyogUmV0dXJuIHRoZSBjb3N0 IG9mIGEgYnJhbmNoLiAgSWYgU1BFRURfUCBpcyB0cnVlIHRoZW4gdGhlIGNvbXBpbGVyIGlzCiAg IG9wdGltaXppbmcgZm9yIHNwZWVkLiAgSWYgUFJFRElDVEFCTEVfUCBpcyB0cnVlIHRoZW4gdGhl IGJyYW5jaCBpcyBwcmVkaWN0ZWQKICAgdG8gYmUgdGFrZW4uICAqLwoKaW50CmFhcmNoNjRfYnJh bmNoX2Nvc3QgKGJvb2wgc3BlZWRfcCwgYm9vbCBwcmVkaWN0YWJsZV9wKQp7CiAgLyogV2hlbiBv cHRpbWl6aW5nIGZvciBzcGVlZCwgdXNlIHRoZSBjb3N0IG9mIHVucHJlZGljdGFibGUgYnJhbmNo ZXMuICAqLwogIGNvbnN0IHN0cnVjdCBjcHVfYnJhbmNoX2Nvc3QgKmJyYW5jaF9jb3N0cyA9CiAg ICBhYXJjaDY0X3R1bmVfcGFyYW1zLmJyYW5jaF9jb3N0czsKCiAgaWYgKCFzcGVlZF9wIHx8IHBy ZWRpY3RhYmxlX3ApCiAgICByZXR1cm4gYnJhbmNoX2Nvc3RzLT5wcmVkaWN0YWJsZTsKICBlbHNl CiAgICByZXR1cm4gYnJhbmNoX2Nvc3RzLT51bnByZWRpY3RhYmxlOwp9CgovKiBSZXR1cm4gdHJ1 ZSBpZiBYIGlzIGEgemVybyBvciBzaWduIGV4dHJhY3QKICAgdXNhYmxlIGluIGFuIEFERCBvciBT VUIgKGV4dGVuZGVkIHJlZ2lzdGVyKSBpbnN0cnVjdGlvbi4gICovCnN0YXRpYyBib29sCmFhcmNo NjRfcnR4X2FyaXRoX29wX2V4dHJhY3RfcCAocnR4IHgpCnsKICAvKiBUaGUgc2ltcGxlIGNhc2Ug PEFSSVRIPiwgWEQsIFhOLCBYTSwgW3VzXXh0LgogICAgIE5vIHNoaWZ0LiAgKi8KICBpZiAoR0VU X0NPREUgKHgpID09IFNJR05fRVhURU5ECiAgICAgIHx8IEdFVF9DT0RFICh4KSA9PSBaRVJPX0VY VEVORCkKICAgIHJldHVybiBSRUdfUCAoWEVYUCAoeCwgMCkpOwoKICByZXR1cm4gZmFsc2U7Cn0K CnN0YXRpYyBib29sCmFhcmNoNjRfZnJpbnRfdW5zcGVjX3AgKHVuc2lnbmVkIGludCB1KQp7CiAg c3dpdGNoICh1KQogICAgewogICAgICBjYXNlIFVOU1BFQ19GUklOVFo6CiAgICAgIGNhc2UgVU5T UEVDX0ZSSU5UUDoKICAgICAgY2FzZSBVTlNQRUNfRlJJTlRNOgogICAgICBjYXNlIFVOU1BFQ19G UklOVEE6CiAgICAgIGNhc2UgVU5TUEVDX0ZSSU5UTjoKICAgICAgY2FzZSBVTlNQRUNfRlJJTlRY OgogICAgICBjYXNlIFVOU1BFQ19GUklOVEk6CiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICBk ZWZhdWx0OgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQoKLyogUmV0dXJuIHRydWUgaWZm IFggaXMgYW4gcnR4IHRoYXQgd2lsbCBtYXRjaCBhbiBleHRyIGluc3RydWN0aW9uCiAgIGkuZS4g YXMgZGVzY3JpYmVkIGluIHRoZSAqZXh0cjxtb2RlPjVfaW5zbiBmYW1pbHkgb2YgcGF0dGVybnMu CiAgIE9QMCBhbmQgT1AxIHdpbGwgYmUgc2V0IHRvIHRoZSBvcGVyYW5kcyBvZiB0aGUgc2hpZnRz IGludm9sdmVkCiAgIG9uIHN1Y2Nlc3MgYW5kIHdpbGwgYmUgTlVMTF9SVFggb3RoZXJ3aXNlLiAg Ki8KCnN0YXRpYyBib29sCmFhcmNoNjRfZXh0cl9ydHhfcCAocnR4IHgsIHJ0eCAqcmVzX29wMCwg cnR4ICpyZXNfb3AxKQp7CiAgcnR4IG9wMCwgb3AxOwogIHNjYWxhcl9pbnRfbW9kZSBtb2RlOwog IGlmICghaXNfYSA8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUgKHgpLCAmbW9kZSkpCiAgICBy ZXR1cm4gZmFsc2U7CgogICpyZXNfb3AwID0gTlVMTF9SVFg7CiAgKnJlc19vcDEgPSBOVUxMX1JU WDsKCiAgaWYgKEdFVF9DT0RFICh4KSAhPSBJT1IpCiAgICByZXR1cm4gZmFsc2U7CgogIG9wMCA9 IFhFWFAgKHgsIDApOwogIG9wMSA9IFhFWFAgKHgsIDEpOwoKICBpZiAoKEdFVF9DT0RFIChvcDAp ID09IEFTSElGVCAmJiBHRVRfQ09ERSAob3AxKSA9PSBMU0hJRlRSVCkKICAgICAgfHwgKEdFVF9D T0RFIChvcDEpID09IEFTSElGVCAmJiBHRVRfQ09ERSAob3AwKSA9PSBMU0hJRlRSVCkpCiAgICB7 CiAgICAgLyogQ2Fub25pY2FsaXNlIGxvY2FsbHkgdG8gYXNoaWZ0IGluIG9wMCwgbHNoaWZ0cnQg aW4gb3AxLiAgKi8KICAgICAgaWYgKEdFVF9DT0RFIChvcDEpID09IEFTSElGVCkKICAgICAgICBz dGQ6OnN3YXAgKG9wMCwgb3AxKTsKCiAgICAgIGlmICghQ09OU1RfSU5UX1AgKFhFWFAgKG9wMCwg MSkpIHx8ICFDT05TVF9JTlRfUCAoWEVYUCAob3AxLCAxKSkpCiAgICAgICAgcmV0dXJuIGZhbHNl OwoKICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBzaGZ0X2FtbnRfMCA9IFVJTlRWQUwgKFhF WFAgKG9wMCwgMSkpOwogICAgICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHNoZnRfYW1udF8xID0g VUlOVFZBTCAoWEVYUCAob3AxLCAxKSk7CgogICAgICBpZiAoc2hmdF9hbW50XzAgPCBHRVRfTU9E RV9CSVRTSVpFIChtb2RlKQogICAgICAgICAgJiYgc2hmdF9hbW50XzAgKyBzaGZ0X2FtbnRfMSA9 PSBHRVRfTU9ERV9CSVRTSVpFIChtb2RlKSkKICAgICAgICB7CiAgICAgICAgICAqcmVzX29wMCA9 IFhFWFAgKG9wMCwgMCk7CiAgICAgICAgICAqcmVzX29wMSA9IFhFWFAgKG9wMSwgMCk7CiAgICAg ICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKLyog Q2FsY3VsYXRlIHRoZSBjb3N0IG9mIGNhbGN1bGF0aW5nIChpZl90aGVuX2Vsc2UgKE9QMCkgKE9Q MSkgKE9QMikpLAogICBzdG9yaW5nIGl0IGluICpDT1NULiAgUmVzdWx0IGlzIHRydWUgaWYgdGhl IHRvdGFsIGNvc3Qgb2YgdGhlIG9wZXJhdGlvbgogICBoYXMgbm93IGJlZW4gY2FsY3VsYXRlZC4g ICovCnN0YXRpYyBib29sCmFhcmNoNjRfaWZfdGhlbl9lbHNlX2Nvc3RzIChydHggb3AwLCBydHgg b3AxLCBydHggb3AyLCBpbnQgKmNvc3QsIGJvb2wgc3BlZWQpCnsKICBydHggaW5uZXI7CiAgcnR4 IGNvbXBhcmF0b3I7CiAgZW51bSBydHhfY29kZSBjbXBjb2RlOwogIGNvbnN0IHN0cnVjdCBjcHVf Y29zdF90YWJsZSAqZXh0cmFfY29zdAogICAgPSBhYXJjaDY0X3R1bmVfcGFyYW1zLmluc25fZXh0 cmFfY29zdDsKCiAgaWYgKENPTVBBUklTT05fUCAob3AwKSkKICAgIHsKICAgICAgaW5uZXIgPSBY RVhQIChvcDAsIDApOwogICAgICBjb21wYXJhdG9yID0gWEVYUCAob3AwLCAxKTsKICAgICAgY21w Y29kZSA9IEdFVF9DT0RFIChvcDApOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgaW5uZXIgPSBv cDA7CiAgICAgIGNvbXBhcmF0b3IgPSBjb25zdDBfcnR4OwogICAgICBjbXBjb2RlID0gTkU7CiAg ICB9CgogIGlmIChHRVRfQ09ERSAob3AxKSA9PSBQQyB8fCBHRVRfQ09ERSAob3AyKSA9PSBQQykK ICAgIHsKICAgICAgLyogQ29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KICAgICAgaWYgKEdFVF9NT0RF X0NMQVNTIChHRVRfTU9ERSAoaW5uZXIpKSA9PSBNT0RFX0NDKQoJcmV0dXJuIHRydWU7CiAgICAg IGVsc2UKCXsKCSAgaWYgKGNtcGNvZGUgPT0gTkUgfHwgY21wY29kZSA9PSBFUSkKCSAgICB7Cgkg ICAgICBpZiAoY29tcGFyYXRvciA9PSBjb25zdDBfcnR4KQoJCXsKCQkgIC8qIFRCWi9UQk5aL0NC Wi9DQk5aLiAgKi8KCQkgIGlmIChHRVRfQ09ERSAoaW5uZXIpID09IFpFUk9fRVhUUkFDVCkKCQkg ICAgLyogVEJaL1RCTlouICAqLwoJCSAgICAqY29zdCArPSBydHhfY29zdCAoWEVYUCAoaW5uZXIs IDApLCBWT0lEbW9kZSwKCQkJCSAgICAgICBaRVJPX0VYVFJBQ1QsIDAsIHNwZWVkKTsKCQkgIGVs c2UKCQkgICAgLyogQ0JaL0NCTlouICAqLwoJCSAgICAqY29zdCArPSBydHhfY29zdCAoaW5uZXIs IFZPSURtb2RlLCBjbXBjb2RlLCAwLCBzcGVlZCk7CgoJCSAgcmV0dXJuIHRydWU7CgkJfQoJICAg ICAgaWYgKHJlZ2lzdGVyX29wZXJhbmQgKGlubmVyLCBWT0lEbW9kZSkKCQkgICYmIGFhcmNoNjRf aW1tMjQgKGNvbXBhcmF0b3IsIFZPSURtb2RlKSkKCQl7CgkJICAvKiBTVUIgYW5kIFNVQlMuICAq LwoJCSAgKmNvc3QgKz0gQ09TVFNfTl9JTlNOUyAoMik7CgkJICBpZiAoc3BlZWQpCgkJICAgICpj b3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5hcml0aCAqIDI7CgkJICByZXR1cm4gdHJ1ZTsKCQl9Cgkg ICAgfQoJICBlbHNlIGlmIChjbXBjb2RlID09IExUIHx8IGNtcGNvZGUgPT0gR0UpCgkgICAgewoJ ICAgICAgLyogVEJaL1RCTlouICAqLwoJICAgICAgaWYgKGNvbXBhcmF0b3IgPT0gY29uc3QwX3J0 eCkKCQlyZXR1cm4gdHJ1ZTsKCSAgICB9Cgl9CiAgICB9CiAgZWxzZSBpZiAoR0VUX01PREVfQ0xB U1MgKEdFVF9NT0RFIChpbm5lcikpID09IE1PREVfQ0MpCiAgICB7CiAgICAgIC8qIENDTVAuICAq LwogICAgICBpZiAoR0VUX0NPREUgKG9wMSkgPT0gQ09NUEFSRSkKCXsKCSAgLyogSW5jcmVhc2Ug Y29zdCBvZiBDQ01QIHJlZywgMCwgaW1tLCBDQyB0byBwcmVmZXIgQ01QIHJlZywgMC4gICovCgkg IGlmIChYRVhQIChvcDEsIDEpID09IGNvbnN0MF9ydHgpCgkgICAgKmNvc3QgKz0gMTsKCSAgaWYg KHNwZWVkKQoJICAgIHsKCSAgICAgIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKFhFWFAg KG9wMSwgMCkpOwoKCSAgICAgIGlmIChHRVRfTU9ERV9DTEFTUyAobW9kZSkgPT0gTU9ERV9JTlQp CgkJKmNvc3QgKz0gZXh0cmFfY29zdC0+YWx1LmFyaXRoOwoJICAgICAgZWxzZQoJCSpjb3N0ICs9 IGV4dHJhX2Nvc3QtPmZwW21vZGUgPT0gREZtb2RlXS5jb21wYXJlOwoJICAgIH0KCSAgcmV0dXJu IHRydWU7Cgl9CgogICAgICAvKiBJdCdzIGEgY29uZGl0aW9uYWwgb3BlcmF0aW9uIGJhc2VkIG9u IHRoZSBzdGF0dXMgZmxhZ3MsCgkgc28gaXQgbXVzdCBiZSBzb21lIGZsYXZvciBvZiBDU0VMLiAg Ki8KCiAgICAgIC8qIENTTkVHLCBDU0lOViwgYW5kIENTSU5DIGFyZSBoYW5kbGVkIGZvciBmcmVl IGFzIHBhcnQgb2YgQ1NFTC4gICovCiAgICAgIGlmIChHRVRfQ09ERSAob3AxKSA9PSBORUcKICAg ICAgICAgIHx8IEdFVF9DT0RFIChvcDEpID09IE5PVAogICAgICAgICAgfHwgKEdFVF9DT0RFIChv cDEpID09IFBMVVMgJiYgWEVYUCAob3AxLCAxKSA9PSBjb25zdDFfcnR4KSkKCW9wMSA9IFhFWFAg KG9wMSwgMCk7CiAgICAgIGVsc2UgaWYgKEdFVF9DT0RFIChvcDEpID09IFpFUk9fRVhURU5EICYm IEdFVF9DT0RFIChvcDIpID09IFpFUk9fRVhURU5EKQoJewoJICAvKiBDU0VMIHdpdGggemVyby1l eHRlbnNpb24gKCpjbW92ZGlfaW5zbl91eHR3KS4gICovCgkgIG9wMSA9IFhFWFAgKG9wMSwgMCk7 CgkgIG9wMiA9IFhFWFAgKG9wMiwgMCk7Cgl9CiAgICAgIGVsc2UgaWYgKEdFVF9DT0RFIChvcDEp ID09IFpFUk9fRVhURU5EICYmIG9wMiA9PSBjb25zdDBfcnR4KQoJewoJICBpbm5lciA9IFhFWFAg KG9wMSwgMCk7CgkgIGlmIChHRVRfQ09ERSAoaW5uZXIpID09IE5FRyB8fCBHRVRfQ09ERSAoaW5u ZXIpID09IE5PVCkKCSAgICAvKiBDU0lOVi9ORUcgd2l0aCB6ZXJvIGV4dGVuZCArIGNvbnN0IDAg KCpjc2ludjNfdXh0d19pbnNuMykuICAqLwoJICAgIG9wMSA9IFhFWFAgKGlubmVyLCAwKTsKCX0K CiAgICAgICpjb3N0ICs9IHJ0eF9jb3N0IChvcDEsIFZPSURtb2RlLCBJRl9USEVOX0VMU0UsIDEs IHNwZWVkKTsKICAgICAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMiwgVk9JRG1vZGUsIElGX1RIRU5f RUxTRSwgMiwgc3BlZWQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgLyogV2UgZG9uJ3Qg a25vdyB3aGF0IHRoaXMgaXMsIGNvc3QgYWxsIG9wZXJhbmRzLiAgKi8KICByZXR1cm4gZmFsc2U7 Cn0KCi8qIENoZWNrIHdoZXRoZXIgWCBpcyBhIGJpdGZpZWxkIG9wZXJhdGlvbiBvZiB0aGUgZm9y bSBzaGlmdCArIGV4dGVuZCB0aGF0CiAgIG1hcHMgZG93biB0byBhIFVCRklaL1NCRklaL1VCRlgv U0JGWCBpbnN0cnVjdGlvbi4gIElmIHNvLCByZXR1cm4gdGhlCiAgIG9wZXJhbmQgdG8gd2hpY2gg dGhlIGJpdGZpZWxkIG9wZXJhdGlvbiBpcyBhcHBsaWVkLiAgT3RoZXJ3aXNlIHJldHVybgogICBO VUxMX1JUWC4gICovCgpzdGF0aWMgcnR4CmFhcmNoNjRfZXh0ZW5kX2JpdGZpZWxkX3BhdHRlcm5f cCAocnR4IHgpCnsKICBydHhfY29kZSBvdXRlcl9jb2RlID0gR0VUX0NPREUgKHgpOwogIG1hY2hp bmVfbW9kZSBvdXRlcl9tb2RlID0gR0VUX01PREUgKHgpOwoKICBpZiAob3V0ZXJfY29kZSAhPSBa RVJPX0VYVEVORCAmJiBvdXRlcl9jb2RlICE9IFNJR05fRVhURU5ECiAgICAgICYmIG91dGVyX21v ZGUgIT0gU0ltb2RlICYmIG91dGVyX21vZGUgIT0gREltb2RlKQogICAgcmV0dXJuIE5VTExfUlRY OwoKICBydHggaW5uZXIgPSBYRVhQICh4LCAwKTsKICBydHhfY29kZSBpbm5lcl9jb2RlID0gR0VU X0NPREUgKGlubmVyKTsKICBtYWNoaW5lX21vZGUgaW5uZXJfbW9kZSA9IEdFVF9NT0RFIChpbm5l cik7CiAgcnR4IG9wID0gTlVMTF9SVFg7CgogIHN3aXRjaCAoaW5uZXJfY29kZSkKICAgIHsKICAg ICAgY2FzZSBBU0hJRlQ6CglpZiAoQ09OU1RfSU5UX1AgKFhFWFAgKGlubmVyLCAxKSkKCSAgICAm JiAoaW5uZXJfbW9kZSA9PSBRSW1vZGUgfHwgaW5uZXJfbW9kZSA9PSBISW1vZGUpKQoJICBvcCA9 IFhFWFAgKGlubmVyLCAwKTsKCWJyZWFrOwogICAgICBjYXNlIExTSElGVFJUOgoJaWYgKG91dGVy X2NvZGUgPT0gWkVST19FWFRFTkQgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKGlubmVyLCAxKSkKCSAg ICAmJiAoaW5uZXJfbW9kZSA9PSBRSW1vZGUgfHwgaW5uZXJfbW9kZSA9PSBISW1vZGUpKQoJICBv cCA9IFhFWFAgKGlubmVyLCAwKTsKCWJyZWFrOwogICAgICBjYXNlIEFTSElGVFJUOgoJaWYgKG91 dGVyX2NvZGUgPT0gU0lHTl9FWFRFTkQgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKGlubmVyLCAxKSkK CSAgICAmJiAoaW5uZXJfbW9kZSA9PSBRSW1vZGUgfHwgaW5uZXJfbW9kZSA9PSBISW1vZGUpKQoJ ICBvcCA9IFhFWFAgKGlubmVyLCAwKTsKCWJyZWFrOwogICAgICBkZWZhdWx0OgoJYnJlYWs7CiAg ICB9CgogIHJldHVybiBvcDsKfQoKLyogUmV0dXJuIHRydWUgaWYgdGhlIG1hc2sgYW5kIGEgc2hp ZnQgYW1vdW50IGZyb20gYW4gUlRYIG9mIHRoZSBmb3JtCiAgICh4IDw8IFNIRlRfQU1OVCkgJiBN QVNLIGFyZSB2YWxpZCB0byBjb21iaW5lIGludG8gYSBVQkZJWiBpbnN0cnVjdGlvbiBvZgogICBt b2RlIE1PREUuICBTZWUgdGhlICphbmRpbV9hc2hpZnQ8bW9kZT5fYmZpeiBwYXR0ZXJuLiAgKi8K CmJvb2wKYWFyY2g2NF9tYXNrX2FuZF9zaGlmdF9mb3JfdWJmaXpfcCAoc2NhbGFyX2ludF9tb2Rl IG1vZGUsIHJ0eCBtYXNrLAoJCQkJICAgIHJ0eCBzaGZ0X2FtbnQpCnsKICByZXR1cm4gQ09OU1Rf SU5UX1AgKG1hc2spICYmIENPTlNUX0lOVF9QIChzaGZ0X2FtbnQpCgkgJiYgSU5UVkFMIChtYXNr KSA+IDAKCSAmJiBVSU5UVkFMIChzaGZ0X2FtbnQpIDwgR0VUX01PREVfQklUU0laRSAobW9kZSkK CSAmJiBleGFjdF9sb2cyICgoVUlOVFZBTCAobWFzaykgPj4gVUlOVFZBTCAoc2hmdF9hbW50KSkg KyAxKSA+PSAwCgkgJiYgKFVJTlRWQUwgKG1hc2spCgkgICAgICYgKChIT1NUX1dJREVfSU5UXzFV IDw8IFVJTlRWQUwgKHNoZnRfYW1udCkpIC0gMSkpID09IDA7Cn0KCi8qIFJldHVybiB0cnVlIGlm IHRoZSBtYXNrcyBhbmQgYSBzaGlmdCBhbW91bnQgZnJvbSBhbiBSVFggb2YgdGhlIGZvcm0KICAg KCh4ICYgTUFTSzEpIHwgKCh5IDw8IFNISUZUX0FNTlQpICYgTUFTSzIpKSBhcmUgdmFsaWQgdG8g Y29tYmluZSBpbnRvCiAgIGEgQkZJIGluc3RydWN0aW9uIG9mIG1vZGUgTU9ERS4gIFNlZSAqYXJj aDY0X2JmaSBwYXR0ZXJucy4gICovCgpib29sCmFhcmNoNjRfbWFza3NfYW5kX3NoaWZ0X2Zvcl9i ZmlfcCAoc2NhbGFyX2ludF9tb2RlIG1vZGUsCgkJCQkgICB1bnNpZ25lZCBIT1NUX1dJREVfSU5U IG1hc2sxLAoJCQkJICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBzaGZ0X2FtbnQsCgkJCQkgICB1 bnNpZ25lZCBIT1NUX1dJREVfSU5UIG1hc2syKQp7CiAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCB0 OwoKICAvKiBWZXJpZnkgdGhhdCB0aGVyZSBpcyBubyBvdmVybGFwIGluIHdoYXQgYml0cyBhcmUg c2V0IGluIHRoZSB0d28gbWFza3MuICAqLwogIGlmIChtYXNrMSAhPSB+bWFzazIpCiAgICByZXR1 cm4gZmFsc2U7CgogIC8qIFZlcmlmeSB0aGF0IG1hc2syIGlzIG5vdCBhbGwgemVyb3Mgb3Igb25l cy4gICovCiAgaWYgKG1hc2syID09IDAgfHwgbWFzazIgPT0gSE9TVF9XSURFX0lOVF9NMVUpCiAg ICByZXR1cm4gZmFsc2U7CgogIC8qIFRoZSBzaGlmdCBhbW91bnQgc2hvdWxkIGFsd2F5cyBiZSBs ZXNzIHRoYW4gdGhlIG1vZGUgc2l6ZS4gICovCiAgZ2NjX2Fzc2VydCAoc2hmdF9hbW50IDwgR0VU X01PREVfQklUU0laRSAobW9kZSkpOwoKICAvKiBWZXJpZnkgdGhhdCB0aGUgbWFzayBiZWluZyBz aGlmdGVkIGlzIGNvbnRpZ3VvdXMgYW5kIHdvdWxkIGJlIGluIHRoZQogICAgIGxlYXN0IHNpZ25p ZmljYW50IGJpdHMgYWZ0ZXIgc2hpZnRpbmcgYnkgc2hmdF9hbW50LiAgKi8KICB0ID0gbWFzazIg KyAoSE9TVF9XSURFX0lOVF8xVSA8PCBzaGZ0X2FtbnQpOwogIHJldHVybiAodCA9PSAodCAmIC10 KSk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIFggaXMgYW4gUlRYIHJlcHJlc2VudGluZyBhbiBvcGVy YXRpb24gaW4gdGhlIEFCRCBmYW1pbHkKICAgb2YgaW5zdHJ1Y3Rpb25zLiAgKi8KCnN0YXRpYyBi b29sCmFhcmNoNjRfYWJkX3J0eF9wIChydHggeCkKewogIGlmIChHRVRfQ09ERSAoeCkgIT0gTUlO VVMpCiAgICByZXR1cm4gZmFsc2U7CiAgcnR4IG1heF9hcm0gPSBYRVhQICh4LCAwKTsKICBydHgg bWluX2FybSA9IFhFWFAgKHgsIDEpOwogIGlmIChHRVRfQ09ERSAobWF4X2FybSkgIT0gU01BWCAm JiBHRVRfQ09ERSAobWF4X2FybSkgIT0gVU1BWCkKICAgIHJldHVybiBmYWxzZTsKICBib29sIHNp Z25lZF9wID0gR0VUX0NPREUgKG1heF9hcm0pID09IFNNQVg7CiAgaWYgKHNpZ25lZF9wICYmIEdF VF9DT0RFIChtaW5fYXJtKSAhPSBTTUlOKQogICAgcmV0dXJuIGZhbHNlOwogIGVsc2UgaWYgKCFz aWduZWRfcCAmJiBHRVRfQ09ERSAobWluX2FybSkgIT0gVU1JTikKICAgIHJldHVybiBmYWxzZTsK CiAgcnR4IG1heG9wMCA9IFhFWFAgKG1heF9hcm0sIDApOwogIHJ0eCBtYXhvcDEgPSBYRVhQICht YXhfYXJtLCAxKTsKICBydHggbWlub3AwID0gWEVYUCAobWluX2FybSwgMCk7CiAgcnR4IG1pbm9w MSA9IFhFWFAgKG1pbl9hcm0sIDEpOwogIHJldHVybiBydHhfZXF1YWxfcCAobWF4b3AwLCBtaW5v cDApICYmIHJ0eF9lcXVhbF9wIChtYXhvcDEsIG1pbm9wMSk7Cn0KCi8qIENhbGN1bGF0ZSB0aGUg Y29zdCBvZiBjYWxjdWxhdGluZyBYLCBzdG9yaW5nIGl0IGluICpDT1NULiAgUmVzdWx0CiAgIGlz IHRydWUgaWYgdGhlIHRvdGFsIGNvc3Qgb2YgdGhlIG9wZXJhdGlvbiBoYXMgbm93IGJlZW4gY2Fs Y3VsYXRlZC4gICovCnN0YXRpYyBib29sCmFhcmNoNjRfcnR4X2Nvc3RzIChydHggeCwgbWFjaGlu ZV9tb2RlIG1vZGUsIGludCBvdXRlciBBVFRSSUJVVEVfVU5VU0VELAoJCSAgIGludCBwYXJhbSBB VFRSSUJVVEVfVU5VU0VELCBpbnQgKmNvc3QsIGJvb2wgc3BlZWQpCnsKICBydHggb3AwLCBvcDEs IG9wMjsKICBjb25zdCBzdHJ1Y3QgY3B1X2Nvc3RfdGFibGUgKmV4dHJhX2Nvc3QKICAgID0gYWFy Y2g2NF90dW5lX3BhcmFtcy5pbnNuX2V4dHJhX2Nvc3Q7CiAgcnR4X2NvZGUgY29kZSA9IEdFVF9D T0RFICh4KTsKICBzY2FsYXJfaW50X21vZGUgaW50X21vZGU7CgogIC8qIEJ5IGRlZmF1bHQsIGFz c3VtZSB0aGF0IGV2ZXJ5dGhpbmcgaGFzIGVxdWl2YWxlbnQgY29zdCB0byB0aGUKICAgICBjaGVh cGVzdCBpbnN0cnVjdGlvbi4gIEFueSBhZGRpdGlvbmFsIGNvc3RzIGFyZSBhcHBsaWVkIGFzIGEg ZGVsdGEKICAgICBhYm92ZSB0aGlzIGRlZmF1bHQuICAqLwogICpjb3N0ID0gQ09TVFNfTl9JTlNO UyAoMSk7CgogIHN3aXRjaCAoY29kZSkKICAgIHsKICAgIGNhc2UgU0VUOgogICAgICAvKiBUaGUg Y29zdCBkZXBlbmRzIGVudGlyZWx5IG9uIHRoZSBvcGVyYW5kcyB0byBTRVQuICAqLwogICAgICAq Y29zdCA9IDA7CiAgICAgIG9wMCA9IFNFVF9ERVNUICh4KTsKICAgICAgb3AxID0gU0VUX1NSQyAo eCk7CgogICAgICBzd2l0Y2ggKEdFVF9DT0RFIChvcDApKQoJewoJY2FzZSBNRU06CgkgIGlmIChz cGVlZCkKCSAgICB7CgkgICAgICBydHggYWRkcmVzcyA9IFhFWFAgKG9wMCwgMCk7CgkgICAgICBp ZiAoVkVDVE9SX01PREVfUCAobW9kZSkpCgkJKmNvc3QgKz0gZXh0cmFfY29zdC0+bGRzdC5zdG9y ZXY7CgkgICAgICBlbHNlIGlmIChHRVRfTU9ERV9DTEFTUyAobW9kZSkgPT0gTU9ERV9JTlQpCgkJ KmNvc3QgKz0gZXh0cmFfY29zdC0+bGRzdC5zdG9yZTsKCSAgICAgIGVsc2UgaWYgKG1vZGUgPT0g U0Ztb2RlIHx8IG1vZGUgPT0gU0Rtb2RlKQoJCSpjb3N0ICs9IGV4dHJhX2Nvc3QtPmxkc3Quc3Rv cmVmOwoJICAgICAgZWxzZSBpZiAobW9kZSA9PSBERm1vZGUgfHwgbW9kZSA9PSBERG1vZGUpCgkJ KmNvc3QgKz0gZXh0cmFfY29zdC0+bGRzdC5zdG9yZWQ7CgoJICAgICAgKmNvc3QgKz0KCQlDT1NU U19OX0lOU05TIChhYXJjaDY0X2FkZHJlc3NfY29zdCAoYWRkcmVzcywgbW9kZSwKCQkJCQkJICAg ICAwLCBzcGVlZCkpOwoJICAgIH0KCgkgICpjb3N0ICs9IHJ0eF9jb3N0IChvcDEsIG1vZGUsIFNF VCwgMSwgc3BlZWQpOwoJICByZXR1cm4gdHJ1ZTsKCgljYXNlIFNVQlJFRzoKCSAgaWYgKCEgUkVH X1AgKFNVQlJFR19SRUcgKG9wMCkpKQoJICAgICpjb3N0ICs9IHJ0eF9jb3N0IChTVUJSRUdfUkVH IChvcDApLCBWT0lEbW9kZSwgU0VULCAwLCBzcGVlZCk7CgoJICAvKiBGYWxsIHRocm91Z2guICAq LwoJY2FzZSBSRUc6CgkgIC8qIFRoZSBjb3N0IGlzIG9uZSBwZXIgdmVjdG9yLXJlZ2lzdGVyIGNv cGllZC4gICovCgkgIGlmIChWRUNUT1JfTU9ERV9QIChHRVRfTU9ERSAob3AwKSkgJiYgUkVHX1Ag KG9wMSkpCgkgICAgewoJICAgICAgaW50IG5yZWdzID0gYWFyY2g2NF9oYXJkX3JlZ25vX25yZWdz IChWMF9SRUdOVU0sIEdFVF9NT0RFIChvcDApKTsKCSAgICAgICpjb3N0ID0gQ09TVFNfTl9JTlNO UyAobnJlZ3MpOwoJICAgIH0KCSAgLyogY29uc3QwX3J0eCBpcyBpbiBnZW5lcmFsIGZyZWUsIGJ1 dCB3ZSB3aWxsIHVzZSBhbgoJICAgICBpbnN0cnVjdGlvbiB0byBzZXQgYSByZWdpc3RlciB0byAw LiAgKi8KCSAgZWxzZSBpZiAoUkVHX1AgKG9wMSkgfHwgb3AxID09IGNvbnN0MF9ydHgpCgkgICAg ewoJICAgICAgLyogVGhlIGNvc3QgaXMgMSBwZXIgcmVnaXN0ZXIgY29waWVkLiAgKi8KCSAgICAg IGludCBucmVncyA9IGFhcmNoNjRfaGFyZF9yZWdub19ucmVncyAoUjBfUkVHTlVNLCBHRVRfTU9E RSAob3AwKSk7CgkgICAgICAqY29zdCA9IENPU1RTX05fSU5TTlMgKG5yZWdzKTsKCSAgICB9CiAg ICAgICAgICBlbHNlCgkgICAgLyogQ29zdCBpcyBqdXN0IHRoZSBjb3N0IG9mIHRoZSBSSFMgb2Yg dGhlIHNldC4gICovCgkgICAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMSwgbW9kZSwgU0VULCAxLCBz cGVlZCk7CgkgIHJldHVybiB0cnVlOwoKCWNhc2UgWkVST19FWFRSQUNUOgoJY2FzZSBTSUdOX0VY VFJBQ1Q6CgkgIC8qIEJpdC1maWVsZCBpbnNlcnRpb24uICBTdHJpcCBhbnkgcmVkdW5kYW50IHdp ZGVuaW5nIG9mCgkgICAgIHRoZSBSSFMgdG8gbWVldCB0aGUgd2lkdGggb2YgdGhlIHRhcmdldC4g ICovCgkgIGlmIChTVUJSRUdfUCAob3AxKSkKCSAgICBvcDEgPSBTVUJSRUdfUkVHIChvcDEpOwoJ ICBpZiAoKEdFVF9DT0RFIChvcDEpID09IFpFUk9fRVhURU5ECgkgICAgICAgfHwgR0VUX0NPREUg KG9wMSkgPT0gU0lHTl9FWFRFTkQpCgkgICAgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAob3AwLCAx KSkKCSAgICAgICYmIGlzX2EgPHNjYWxhcl9pbnRfbW9kZT4gKEdFVF9NT0RFIChYRVhQIChvcDEs IDApKSwgJmludF9tb2RlKQoJICAgICAgJiYgR0VUX01PREVfQklUU0laRSAoaW50X21vZGUpID49 IElOVFZBTCAoWEVYUCAob3AwLCAxKSkpCgkgICAgb3AxID0gWEVYUCAob3AxLCAwKTsKCiAgICAg ICAgICBpZiAoQ09OU1RfSU5UX1AgKG9wMSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAv KiBNT1YgaW1tZWRpYXRlIGlzIGFzc3VtZWQgdG8gYWx3YXlzIGJlIGNoZWFwLiAgKi8KICAgICAg ICAgICAgICAqY29zdCA9IENPU1RTX05fSU5TTlMgKDEpOwogICAgICAgICAgICB9CiAgICAgICAg ICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBCRk0uICAqLwoJICAgICAgaWYg KHNwZWVkKQoJCSpjb3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5iZmk7CgkgICAgICAqY29zdCArPSBy dHhfY29zdCAob3AxLCBWT0lEbW9kZSwgKGVudW0gcnR4X2NvZGUpIGNvZGUsIDEsIHNwZWVkKTsK ICAgICAgICAgICAgfQoKCSAgcmV0dXJuIHRydWU7CgoJZGVmYXVsdDoKCSAgLyogV2UgY2FuJ3Qg bWFrZSBzZW5zZSBvZiB0aGlzLCBhc3N1bWUgZGVmYXVsdCBjb3N0LiAgKi8KICAgICAgICAgICpj b3N0ID0gQ09TVFNfTl9JTlNOUyAoMSk7CgkgIHJldHVybiBmYWxzZTsKCX0KICAgICAgcmV0dXJu IGZhbHNlOwoKICAgIGNhc2UgQ09OU1RfSU5UOgogICAgICAvKiBJZiBhbiBpbnN0cnVjdGlvbiBj YW4gaW5jb3Jwb3JhdGUgYSBjb25zdGFudCB3aXRoaW4gdGhlCgkgaW5zdHJ1Y3Rpb24sIHRoZSBp bnN0cnVjdGlvbidzIGV4cHJlc3Npb24gYXZvaWRzIGNhbGxpbmcKCSBydHhfY29zdCgpIG9uIHRo ZSBjb25zdGFudC4gIElmIHJ0eF9jb3N0KCkgaXMgY2FsbGVkIG9uIGEKCSBjb25zdGFudCwgdGhl biBpdCBpcyB1c3VhbGx5IGJlY2F1c2UgdGhlIGNvbnN0YW50IG11c3QgYmUKCSBtb3ZlZCBpbnRv IGEgcmVnaXN0ZXIgYnkgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zLgoKCSBUaGUgZXhjZXB0aW9u IGlzIGNvbnN0YW50IDAsIHdoaWNoIGNhbiBiZSBleHByZXNzZWQKCSBhcyBYWlIvV1pSIGFuZCBp cyB0aGVyZWZvcmUgZnJlZS4gIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpcwoJIGlmIHdlIGhhdmUg KHNldCAocmVnKSAoY29uc3QwX3J0eCkpIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBjb3N0CgkgdGhl IG1vdmUuICBIb3dldmVyLCB3ZSBjYW4gY2F0Y2ggdGhhdCB3aGVuIHdlIGNvc3QgdGhlIFNFVCwg c28KCSB3ZSBkb24ndCBuZWVkIHRvIGNvbnNpZGVyIHRoYXQgaGVyZS4gICovCiAgICAgIGlmICh4 ID09IGNvbnN0MF9ydHgpCgkqY29zdCA9IDA7CiAgICAgIGVsc2UKCXsKCSAgLyogVG8gYW4gYXBw cm94aW1hdGlvbiwgYnVpbGRpbmcgYW55IG90aGVyIGNvbnN0YW50IGlzCgkgICAgIHByb3BvcnRp b25hbGx5IGV4cGVuc2l2ZSB0byB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucwoJICAgICByZXF1 aXJlZCB0byBidWlsZCB0aGF0IGNvbnN0YW50LiAgVGhpcyBpcyB0cnVlIHdoZXRoZXIgd2UKCSAg ICAgYXJlIGNvbXBpbGluZyBmb3IgU1BFRUQgb3Igb3RoZXJ3aXNlLiAgKi8KCSAgbWFjaGluZV9t b2RlIGltb2RlID0ga25vd25fbGUgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCA0KQoJCQkJPyBTSW1v ZGUgOiBESW1vZGU7CgkgICpjb3N0ID0gQ09TVFNfTl9JTlNOUyAoYWFyY2g2NF9pbnRlcm5hbF9t b3ZfaW1tZWRpYXRlCgkJCQkgKE5VTExfUlRYLCB4LCBmYWxzZSwgaW1vZGUpKTsKCX0KICAgICAg cmV0dXJuIHRydWU7CgogICAgY2FzZSBDT05TVF9ET1VCTEU6CgogICAgICAvKiBGaXJzdCBkZXRl cm1pbmUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0byBkbyB0aGUgbW92ZQoJICBhcyBhbiBpbnRl Z2VyIGNvbnN0YW50LiAgKi8KICAgICAgaWYgKCFhYXJjaDY0X2Zsb2F0X2NvbnN0X3JlcHJlc2Vu dGFibGVfcCAoeCkKCSAgICYmICFhYXJjaDY0X2Nhbl9jb25zdF9tb3ZpX3J0eF9wICh4LCBtb2Rl KQoJICAgJiYgYWFyY2g2NF9mbG9hdF9jb25zdF9ydHhfcCAoeCkpCgl7CgkgIHVuc2lnbmVkIEhP U1RfV0lERV9JTlQgaXZhbDsKCSAgYm9vbCBzdWNjZWVkID0gYWFyY2g2NF9yZWludGVycHJldF9m bG9hdF9hc19pbnQgKHgsICZpdmFsKTsKCSAgZ2NjX2Fzc2VydCAoc3VjY2VlZCk7CgoJICBtYWNo aW5lX21vZGUgaW1vZGUgPSBrbm93bl9lcSAoR0VUX01PREVfU0laRSAobW9kZSksIDgpCgkJCQk/ IERJbW9kZSA6IFNJbW9kZTsKCSAgaW50IG5jb3N0ID0gYWFyY2g2NF9pbnRlcm5hbF9tb3ZfaW1t ZWRpYXRlCgkJKE5VTExfUlRYLCBnZW5faW50X21vZGUgKGl2YWwsIGltb2RlKSwgZmFsc2UsIGlt b2RlKTsKCSAgKmNvc3QgKz0gQ09TVFNfTl9JTlNOUyAobmNvc3QpOwoJICByZXR1cm4gdHJ1ZTsK CX0KCiAgICAgIGlmIChzcGVlZCkKCXsKCSAgLyogbW92W2RmLHNmXV9hYXJjaDY0LiAgKi8KCSAg aWYgKGFhcmNoNjRfZmxvYXRfY29uc3RfcmVwcmVzZW50YWJsZV9wICh4KSkKCSAgICAvKiBGTU9W IChzY2FsYXIgaW1tZWRpYXRlKS4gICovCgkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+ZnBbbW9k ZSA9PSBERm1vZGUgfHwgbW9kZSA9PSBERG1vZGVdLmZwY29uc3Q7CgkgIGVsc2UgaWYgKCFhYXJj aDY0X2Zsb2F0X2NvbnN0X3plcm9fcnR4X3AgKHgpKQoJICAgIHsKCSAgICAgIC8qIFRoaXMgd2ls bCBiZSBhIGxvYWQgZnJvbSBtZW1vcnkuICAqLwoJICAgICAgaWYgKG1vZGUgPT0gREZtb2RlIHx8 IG1vZGUgPT0gRERtb2RlKQoJCSpjb3N0ICs9IGV4dHJhX2Nvc3QtPmxkc3QubG9hZGQ7CgkgICAg ICBlbHNlCgkJKmNvc3QgKz0gZXh0cmFfY29zdC0+bGRzdC5sb2FkZjsKCSAgICB9CgkgIGVsc2UK CSAgICAvKiBPdGhlcndpc2UgdGhpcyBpcyArMC4wLiAgV2UgZ2V0IHRoaXMgdXNpbmcgTU9WSSBk MCwgIzAKCSAgICAgICBvciBNT1YgdjAuc1swXSwgd3pyIC0gbmVpdGhlciBvZiB3aGljaCBhcmUg bW9kZWxlZCBieSB0aGUKCSAgICAgICBjb3N0IHRhYmxlcy4gIEp1c3QgdXNlIHRoZSBkZWZhdWx0 IGNvc3QuICAqLwoJICAgIHsKCSAgICB9Cgl9CgogICAgICByZXR1cm4gdHJ1ZTsKCiAgICBjYXNl IE1FTToKICAgICAgaWYgKHNwZWVkKQoJewoJICAvKiBGb3IgbG9hZHMgd2Ugd2FudCB0aGUgYmFz ZSBjb3N0IG9mIGEgbG9hZCwgcGx1cyBhbgoJICAgICBhcHByb3hpbWF0aW9uIGZvciB0aGUgYWRk aXRpb25hbCBjb3N0IG9mIHRoZSBhZGRyZXNzaW5nCgkgICAgIG1vZGUuICAqLwoJICBydHggYWRk cmVzcyA9IFhFWFAgKHgsIDApOwoJICBpZiAoVkVDVE9SX01PREVfUCAobW9kZSkpCgkgICAgKmNv c3QgKz0gZXh0cmFfY29zdC0+bGRzdC5sb2FkdjsKCSAgZWxzZSBpZiAoR0VUX01PREVfQ0xBU1Mg KG1vZGUpID09IE1PREVfSU5UKQoJICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPmxkc3QubG9hZDsK CSAgZWxzZSBpZiAobW9kZSA9PSBTRm1vZGUgfHwgbW9kZSA9PSBTRG1vZGUpCgkgICAgKmNvc3Qg Kz0gZXh0cmFfY29zdC0+bGRzdC5sb2FkZjsKCSAgZWxzZSBpZiAobW9kZSA9PSBERm1vZGUgfHwg bW9kZSA9PSBERG1vZGUpCgkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+bGRzdC5sb2FkZDsKCgkg ICpjb3N0ICs9CgkJQ09TVFNfTl9JTlNOUyAoYWFyY2g2NF9hZGRyZXNzX2Nvc3QgKGFkZHJlc3Ms IG1vZGUsCgkJCQkJCSAgICAgMCwgc3BlZWQpKTsKCX0KCiAgICAgIHJldHVybiB0cnVlOwoKICAg IGNhc2UgTkVHOgogICAgICBvcDAgPSBYRVhQICh4LCAwKTsKCiAgICAgIGlmIChWRUNUT1JfTU9E RV9QIChtb2RlKSkKCXsKCSAgLyogTWFueSB2ZWN0b3IgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFy ZSByZXByZXNlbnRlZCBhcyBORUcKCSAgICAgb2YgYSBjb21wYXJpc29uLiAgKi8KCSAgaWYgKENP TVBBUklTT05fUCAob3AwKSkKCSAgICB7CgkgICAgICBydHggb3AwMCA9IFhFWFAgKG9wMCwgMCk7 CgkgICAgICBydHggb3AwMSA9IFhFWFAgKG9wMCwgMSk7CgkgICAgICBtYWNoaW5lX21vZGUgaW5u ZXJfbW9kZSA9IEdFVF9NT0RFIChvcDAwKTsKCSAgICAgIC8qIEZBQ0dFL0ZBQ0dULiAgKi8KCSAg ICAgIGlmIChHRVRfTU9ERV9DTEFTUyAoaW5uZXJfbW9kZSkgPT0gTU9ERV9WRUNUT1JfRkxPQVQK CQkgICYmIEdFVF9DT0RFIChvcDAwKSA9PSBBQlMKCQkgICYmIEdFVF9DT0RFIChvcDAxKSA9PSBB QlMpCgkJewoJCSAgb3AwMCA9IFhFWFAgKG9wMDAsIDApOwoJCSAgb3AwMSA9IFhFWFAgKG9wMDEs IDApOwoJCX0KCSAgICAgICpjb3N0ICs9IHJ0eF9jb3N0IChvcDAwLCBpbm5lcl9tb2RlLCBHRVRf Q09ERSAob3AwKSwgMCwgc3BlZWQpOwoJICAgICAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMDEsIGlu bmVyX21vZGUsIEdFVF9DT0RFIChvcDApLCAxLCBzcGVlZCk7CgkgICAgICBpZiAoc3BlZWQpCgkJ KmNvc3QgKz0gZXh0cmFfY29zdC0+dmVjdC5hbHU7CgkgICAgICByZXR1cm4gdHJ1ZTsKCSAgICB9 CgkgIGlmIChzcGVlZCkKCSAgICB7CgkgICAgICAvKiBGTkVHLiAgKi8KCSAgICAgICpjb3N0ICs9 IGV4dHJhX2Nvc3QtPnZlY3QuYWx1OwoJICAgIH0KCSAgcmV0dXJuIGZhbHNlOwoJfQoKICAgICAg aWYgKEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX0lOVCkKCXsKICAgICAgICAgIGlmIChH RVRfUlRYX0NMQVNTIChHRVRfQ09ERSAob3AwKSkgPT0gUlRYX0NPTVBBUkUKICAgICAgICAgICAg ICB8fCBHRVRfUlRYX0NMQVNTIChHRVRfQ09ERSAob3AwKSkgPT0gUlRYX0NPTU1fQ09NUEFSRSkK ICAgICAgICAgICAgewogICAgICAgICAgICAgIC8qIENTRVRNLiAgKi8KCSAgICAgICpjb3N0ICs9 IHJ0eF9jb3N0IChYRVhQIChvcDAsIDApLCBWT0lEbW9kZSwgTkVHLCAwLCBzcGVlZCk7CiAgICAg ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCgkgIC8qIENvc3QgdGhpcyBhcyBT VUIgd3pyLCBYLiAgKi8KICAgICAgICAgIG9wMCA9IENPTlNUMF9SVFggKG1vZGUpOwogICAgICAg ICAgb3AxID0gWEVYUCAoeCwgMCk7CiAgICAgICAgICBnb3RvIGNvc3RfbWludXM7CiAgICAgICAg fQoKICAgICAgaWYgKEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX0ZMT0FUKQogICAgICAg IHsKICAgICAgICAgIC8qIFN1cHBvcnQgKG5lZyhmbWEuLi4pKSBhcyBhIHNpbmdsZSBpbnN0cnVj dGlvbiBvbmx5IGlmCiAgICAgICAgICAgICBzaWduIG9mIHplcm9zIGlzIHVuaW1wb3J0YW50LiAg VGhpcyBtYXRjaGVzIHRoZSBkZWNpc2lvbgogICAgICAgICAgICAgbWFraW5nIGluIGFhcmNoNjQu bWQuICAqLwogICAgICAgICAgaWYgKEdFVF9DT0RFIChvcDApID09IEZNQSAmJiAhSE9OT1JfU0lH TkVEX1pFUk9TIChHRVRfTU9ERSAob3AwKSkpCiAgICAgICAgICAgIHsKCSAgICAgIC8qIEZOTUFE RC4gICovCgkgICAgICAqY29zdCA9IHJ0eF9jb3N0IChvcDAsIG1vZGUsIE5FRywgMCwgc3BlZWQp OwogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgkgIGlmIChHRVRfQ09E RSAob3AwKSA9PSBNVUxUKQoJICAgIHsKCSAgICAgIC8qIEZOTVVMLiAgKi8KCSAgICAgICpjb3N0 ID0gcnR4X2Nvc3QgKG9wMCwgbW9kZSwgTkVHLCAwLCBzcGVlZCk7CgkgICAgICByZXR1cm4gdHJ1 ZTsKCSAgICB9CgkgIGlmIChzcGVlZCkKCSAgICAvKiBGTkVHLiAgKi8KCSAgICAqY29zdCArPSBl eHRyYV9jb3N0LT5mcFttb2RlID09IERGbW9kZV0ubmVnOwogICAgICAgICAgcmV0dXJuIGZhbHNl OwogICAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICBjYXNlIENMUlNCOgogICAgY2Fz ZSBDTFo6CiAgICAgIGlmIChzcGVlZCkKCXsKCSAgaWYgKFZFQ1RPUl9NT0RFX1AgKG1vZGUpKQoJ ICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPnZlY3QuYWx1OwoJICBlbHNlCgkgICAgKmNvc3QgKz0g ZXh0cmFfY29zdC0+YWx1LmNsejsKCX0KCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICBjYXNlIENU WjoKICAgICAgKmNvc3QgPSBDT1NUU19OX0lOU05TICgyKTsKCiAgICAgIGlmIChzcGVlZCkKCSpj b3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5jbHogKyBleHRyYV9jb3N0LT5hbHUucmV2OwogICAgICBy ZXR1cm4gZmFsc2U7CgogICAgY2FzZSBDT01QQVJFOgogICAgICBvcDAgPSBYRVhQICh4LCAwKTsK ICAgICAgb3AxID0gWEVYUCAoeCwgMSk7CgogICAgICBpZiAob3AxID09IGNvbnN0MF9ydHgKCSAg JiYgR0VUX0NPREUgKG9wMCkgPT0gQU5EKQoJewoJICB4ID0gb3AwOwoJICBtb2RlID0gR0VUX01P REUgKG9wMCk7CgkgIGdvdG8gY29zdF9sb2dpYzsKCX0KCiAgICAgIGlmIChHRVRfTU9ERV9DTEFT UyAoR0VUX01PREUgKG9wMCkpID09IE1PREVfSU5UKQogICAgICAgIHsKICAgICAgICAgIC8qIFRP RE86IEEgd3JpdGUgdG8gdGhlIENDIGZsYWdzIHBvc3NpYmx5IGNvc3RzIGV4dHJhLCB0aGlzCgkg ICAgIG5lZWRzIGVuY29kaW5nIGluIHRoZSBjb3N0IHRhYmxlcy4gICovCgoJICBtb2RlID0gR0VU X01PREUgKG9wMCk7CiAgICAgICAgICAvKiBBTkRTLiAgKi8KICAgICAgICAgIGlmIChHRVRfQ09E RSAob3AwKSA9PSBBTkQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB4ID0gb3AwOwogICAg ICAgICAgICAgIGdvdG8gY29zdF9sb2dpYzsKICAgICAgICAgICAgfQoKICAgICAgICAgIGlmIChH RVRfQ09ERSAob3AwKSA9PSBQTFVTKQogICAgICAgICAgICB7CgkgICAgICAvKiBBRERTIChhbmQg Q01OIGFsaWFzKS4gICovCiAgICAgICAgICAgICAgeCA9IG9wMDsKICAgICAgICAgICAgICBnb3Rv IGNvc3RfcGx1czsKICAgICAgICAgICAgfQoKICAgICAgICAgIGlmIChHRVRfQ09ERSAob3AwKSA9 PSBNSU5VUykKICAgICAgICAgICAgewoJICAgICAgLyogU1VCUy4gICovCiAgICAgICAgICAgICAg eCA9IG9wMDsKICAgICAgICAgICAgICBnb3RvIGNvc3RfbWludXM7CiAgICAgICAgICAgIH0KCgkg IGlmIChHRVRfQ09ERSAob3AwKSA9PSBaRVJPX0VYVFJBQ1QgJiYgb3AxID09IGNvbnN0MF9ydHgK CSAgICAgICYmIEdFVF9NT0RFICh4KSA9PSBDQ19OWm1vZGUgJiYgQ09OU1RfSU5UX1AgKFhFWFAg KG9wMCwgMSkpCgkgICAgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAob3AwLCAyKSkpCgkgICAgewoJ ICAgICAgLyogQ09NUEFSRSBvZiBaRVJPX0VYVFJBQ1QgZm9ybSBvZiBUU1QtaW1tZWRpYXRlLgoJ CSBIYW5kbGUgaXQgaGVyZSBkaXJlY3RseSByYXRoZXIgdGhhbiBnb2luZyB0byBjb3N0X2xvZ2lj CgkJIHNpbmNlIHdlIGtub3cgdGhlIGltbWVkaWF0ZSBnZW5lcmF0ZWQgZm9yIHRoZSBUU1QgaXMg dmFsaWQKCQkgc28gd2UgY2FuIGF2b2lkIGNyZWF0aW5nIGFuIGludGVybWVkaWF0ZSBydHggZm9y IGl0IG9ubHkKCQkgZm9yIGNvc3RpbmcgcHVycG9zZXMuICAqLwoJICAgICAgaWYgKHNwZWVkKQoJ CSpjb3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5sb2dpY2FsOwoKCSAgICAgICpjb3N0ICs9IHJ0eF9j b3N0IChYRVhQIChvcDAsIDApLCBHRVRfTU9ERSAob3AwKSwKCQkJCSBaRVJPX0VYVFJBQ1QsIDAs IHNwZWVkKTsKCSAgICAgIHJldHVybiB0cnVlOwoJICAgIH0KCiAgICAgICAgICBpZiAoR0VUX0NP REUgKG9wMSkgPT0gTkVHKQogICAgICAgICAgICB7CgkgICAgICAvKiBDTU4uICAqLwoJICAgICAg aWYgKHNwZWVkKQoJCSpjb3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5hcml0aDsKCgkgICAgICAqY29z dCArPSBydHhfY29zdCAob3AwLCBtb2RlLCBDT01QQVJFLCAwLCBzcGVlZCk7CgkgICAgICAqY29z dCArPSBydHhfY29zdCAoWEVYUCAob3AxLCAwKSwgbW9kZSwgTkVHLCAxLCBzcGVlZCk7CiAgICAg ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAvKiBDTVAuCgoJ ICAgICBDb21wYXJlIGNhbiBmcmVlbHkgc3dhcCB0aGUgb3JkZXIgb2Ygb3BlcmFuZHMsIGFuZAog ICAgICAgICAgICAgY2Fub25pY2FsaXphdGlvbiBwdXRzIHRoZSBtb3JlIGNvbXBsZXggb3BlcmF0 aW9uIGZpcnN0LgogICAgICAgICAgICAgQnV0IHRoZSBpbnRlZ2VyIE1JTlVTIGxvZ2ljIGV4cGVj dHMgdGhlIHNoaWZ0L2V4dGVuZAogICAgICAgICAgICAgb3BlcmF0aW9uIGluIG9wMS4gICovCiAg ICAgICAgICBpZiAoISAoUkVHX1AgKG9wMCkKCQkgfHwgKFNVQlJFR19QIChvcDApICYmIFJFR19Q IChTVUJSRUdfUkVHIChvcDApKSkpKQogICAgICAgICAgewogICAgICAgICAgICBvcDAgPSBYRVhQ ICh4LCAxKTsKICAgICAgICAgICAgb3AxID0gWEVYUCAoeCwgMCk7CiAgICAgICAgICB9CiAgICAg ICAgICBnb3RvIGNvc3RfbWludXM7CiAgICAgICAgfQoKICAgICAgaWYgKEdFVF9NT0RFX0NMQVNT IChHRVRfTU9ERSAob3AwKSkgPT0gTU9ERV9GTE9BVCkKICAgICAgICB7CgkgIC8qIEZDTVAuICAq LwoJICBpZiAoc3BlZWQpCgkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+ZnBbbW9kZSA9PSBERm1v ZGVdLmNvbXBhcmU7CgogICAgICAgICAgaWYgKENPTlNUX0RPVUJMRV9QIChvcDEpICYmIGFhcmNo NjRfZmxvYXRfY29uc3RfemVyb19ydHhfcCAob3AxKSkKICAgICAgICAgICAgewoJICAgICAgKmNv c3QgKz0gcnR4X2Nvc3QgKG9wMCwgVk9JRG1vZGUsIENPTVBBUkUsIDAsIHNwZWVkKTsKICAgICAg ICAgICAgICAvKiBGQ01QIHN1cHBvcnRzIGNvbnN0YW50IDAuMCBmb3Igbm8gZXh0cmEgY29zdC4g Ki8KICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgcmV0 dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgIGlmIChWRUNUT1JfTU9ERV9QIChtb2RlKSkKCXsK CSAgLyogVmVjdG9yIGNvbXBhcmUuICAqLwoJICBpZiAoc3BlZWQpCgkgICAgKmNvc3QgKz0gZXh0 cmFfY29zdC0+dmVjdC5hbHU7CgoJICBpZiAoYWFyY2g2NF9mbG9hdF9jb25zdF96ZXJvX3J0eF9w IChvcDEpKQoJICAgIHsKCSAgICAgIC8qIFZlY3RvciBjbSAoZXF8Z2V8Z3R8bHR8bGUpIHN1cHBv cnRzIGNvbnN0YW50IDAuMCBmb3Igbm8gZXh0cmEKCQkgY29zdC4gICovCgkgICAgICByZXR1cm4g dHJ1ZTsKCSAgICB9CgkgIHJldHVybiBmYWxzZTsKCX0KICAgICAgcmV0dXJuIGZhbHNlOwoKICAg IGNhc2UgTUlOVVM6CiAgICAgIHsKCW9wMCA9IFhFWFAgKHgsIDApOwoJb3AxID0gWEVYUCAoeCwg MSk7Cgpjb3N0X21pbnVzOgoJaWYgKFZFQ1RPUl9NT0RFX1AgKG1vZGUpKQoJICB7CgkgICAgdW5z aWduZWQgaW50IHZlY19mbGFncyA9IGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9yX21vZGUgKG1vZGUp OwoJICAgIGlmIChUQVJHRVRfU0lNRCAmJiAodmVjX2ZsYWdzICYgVkVDX0FEVlNJTUQpKQoJICAg ICAgewoJCS8qIFJlY29nbmlzZSB0aGUgU0FCRCBhbmQgVUFCRCBvcGVyYXRpb24gaGVyZS4KCQkg ICBSZWN1cnNpb24gZnJvbSB0aGUgUExVUyBjYXNlIHdpbGwgY2F0Y2ggdGhlIGFjY3VtdWxhdGlu ZwoJCSAgIGZvcm1zLiAgKi8KCQlpZiAoYWFyY2g2NF9hYmRfcnR4X3AgKHgpKQoJCSAgewoJCSAg ICBpZiAoc3BlZWQpCgkJICAgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+dmVjdC5hbHU7CgkJICAg IHJldHVybiB0cnVlOwoJCSAgfQoJCSAgLyogU1VCTDIgYW5kIFNVQlcyLgoJCSAgIFRoZSBzZWxl Y3Qtb3BlcmFuZC1oaWdoLWhhbGYgdmVyc2lvbnMgb2YgdGhlIHN1YiBpbnN0cnVjdGlvbgoJCSAg IGhhdmUgdGhlIHNhbWUgY29zdCBhcyB0aGUgcmVndWxhciB0aHJlZSB2ZWN0b3IgdmVyc2lvbiAt CgkJICAgZG9uJ3QgYWRkIHRoZSBjb3N0cyBvZiB0aGUgc2VsZWN0IGludG8gdGhlIGNvc3RzIG9m IHRoZSBzdWIuCgkJICAgKi8KCQlvcDAgPSBhYXJjaDY0X3N0cmlwX2V4dGVuZF92ZWNfaGFsZiAo b3AwKTsKCQlvcDEgPSBhYXJjaDY0X3N0cmlwX2V4dGVuZF92ZWNfaGFsZiAob3AxKTsKCSAgICAg IH0KCSAgfQoKCSpjb3N0ICs9IHJ0eF9jb3N0IChvcDAsIG1vZGUsIE1JTlVTLCAwLCBzcGVlZCk7 CgoJLyogRGV0ZWN0IHZhbGlkIGltbWVkaWF0ZXMuICAqLwoJaWYgKChHRVRfTU9ERV9DTEFTUyAo bW9kZSkgPT0gTU9ERV9JTlQKCSAgICAgfHwgKEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RF X0NDCgkJICYmIEdFVF9NT0RFX0NMQVNTIChHRVRfTU9ERSAob3AwKSkgPT0gTU9ERV9JTlQpKQoJ ICAgICYmIENPTlNUX0lOVF9QIChvcDEpCgkgICAgJiYgYWFyY2g2NF91aW1tMTJfc2hpZnQgKElO VFZBTCAob3AxKSkpCgkgIHsKCSAgICBpZiAoc3BlZWQpCgkgICAgICAvKiBTVUIoUykgKGltbWVk aWF0ZSkuICAqLwoJICAgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+YWx1LmFyaXRoOwoJICAgIHJl dHVybiB0cnVlOwoJICB9CgoJLyogTG9vayBmb3IgU1VCIChleHRlbmRlZCByZWdpc3RlcikuICAq LwoJaWYgKGlzX2EgPHNjYWxhcl9pbnRfbW9kZT4gKG1vZGUpCgkgICAgJiYgYWFyY2g2NF9ydHhf YXJpdGhfb3BfZXh0cmFjdF9wIChvcDEpKQoJICB7CgkgICAgaWYgKHNwZWVkKQoJICAgICAgKmNv c3QgKz0gZXh0cmFfY29zdC0+YWx1LmV4dGVuZF9hcml0aDsKCgkgICAgb3AxID0gYWFyY2g2NF9z dHJpcF9leHRlbmQgKG9wMSwgdHJ1ZSk7CgkgICAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMSwgVk9J RG1vZGUsCgkJCSAgICAgICAoZW51bSBydHhfY29kZSkgR0VUX0NPREUgKG9wMSksIDAsIHNwZWVk KTsKCSAgICByZXR1cm4gdHJ1ZTsKCSAgfQoKCXJ0eCBuZXdfb3AxID0gYWFyY2g2NF9zdHJpcF9l eHRlbmQgKG9wMSwgZmFsc2UpOwoKCS8qIENvc3QgdGhpcyBhcyBhbiBGTUEtYWxpa2Ugb3BlcmF0 aW9uLiAgKi8KCWlmICgoR0VUX0NPREUgKG5ld19vcDEpID09IE1VTFQKCSAgICAgfHwgYWFyY2g2 NF9zaGlmdF9wIChHRVRfQ09ERSAobmV3X29wMSkpKQoJICAgICYmIGNvZGUgIT0gQ09NUEFSRSkK CSAgewoJICAgICpjb3N0ICs9IGFhcmNoNjRfcnR4X211bHRfY29zdCAobmV3X29wMSwgTVVMVCwK CQkJCQkgICAgKGVudW0gcnR4X2NvZGUpIGNvZGUsCgkJCQkJICAgIHNwZWVkKTsKCSAgICByZXR1 cm4gdHJ1ZTsKCSAgfQoKCSpjb3N0ICs9IHJ0eF9jb3N0IChuZXdfb3AxLCBWT0lEbW9kZSwgTUlO VVMsIDEsIHNwZWVkKTsKCglpZiAoc3BlZWQpCgkgIHsKCSAgICBpZiAoVkVDVE9SX01PREVfUCAo bW9kZSkpCgkgICAgICB7CgkJLyogVmVjdG9yIFNVQi4gICovCgkJKmNvc3QgKz0gZXh0cmFfY29z dC0+dmVjdC5hbHU7CgkgICAgICB9CgkgICAgZWxzZSBpZiAoR0VUX01PREVfQ0xBU1MgKG1vZGUp ID09IE1PREVfSU5UKQoJICAgICAgewoJCS8qIFNVQihTKS4gICovCgkJKmNvc3QgKz0gZXh0cmFf Y29zdC0+YWx1LmFyaXRoOwoJICAgICAgfQoJICAgIGVsc2UgaWYgKEdFVF9NT0RFX0NMQVNTICht b2RlKSA9PSBNT0RFX0ZMT0FUKQoJICAgICAgewoJCS8qIEZTVUIuICAqLwoJCSpjb3N0ICs9IGV4 dHJhX2Nvc3QtPmZwW21vZGUgPT0gREZtb2RlXS5hZGRzdWI7CgkgICAgICB9CgkgIH0KCXJldHVy biB0cnVlOwogICAgICB9CgogICAgY2FzZSBQTFVTOgogICAgICB7CglydHggbmV3X29wMDsKCglv cDAgPSBYRVhQICh4LCAwKTsKCW9wMSA9IFhFWFAgKHgsIDEpOwoKY29zdF9wbHVzOgoJaWYgKFZF Q1RPUl9NT0RFX1AgKG1vZGUpKQoJICB7CgkgICAgLyogQURETDIgYW5kIEFERFcyLiAgKi8KCSAg ICB1bnNpZ25lZCBpbnQgdmVjX2ZsYWdzID0gYWFyY2g2NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAo bW9kZSk7CgkgICAgaWYgKFRBUkdFVF9TSU1EICYmICh2ZWNfZmxhZ3MgJiBWRUNfQURWU0lNRCkp CgkgICAgICB7CgkJLyogVGhlIHNlbGVjdC1vcGVyYW5kLWhpZ2gtaGFsZiB2ZXJzaW9ucyBvZiB0 aGUgYWRkIGluc3RydWN0aW9uCgkJICAgaGF2ZSB0aGUgc2FtZSBjb3N0IGFzIHRoZSByZWd1bGFy IHRocmVlIHZlY3RvciB2ZXJzaW9uIC0KCQkgICBkb24ndCBhZGQgdGhlIGNvc3RzIG9mIHRoZSBz ZWxlY3QgaW50byB0aGUgY29zdHMgb2YgdGhlIGFkZC4KCQkgICAqLwoJCW9wMCA9IGFhcmNoNjRf c3RyaXBfZXh0ZW5kX3ZlY19oYWxmIChvcDApOwoJCW9wMSA9IGFhcmNoNjRfc3RyaXBfZXh0ZW5k X3ZlY19oYWxmIChvcDEpOwoJICAgICAgfQoJICB9CgoJaWYgKEdFVF9SVFhfQ0xBU1MgKEdFVF9D T0RFIChvcDApKSA9PSBSVFhfQ09NUEFSRQoJICAgIHx8IEdFVF9SVFhfQ0xBU1MgKEdFVF9DT0RF IChvcDApKSA9PSBSVFhfQ09NTV9DT01QQVJFKQoJICB7CgkgICAgLyogQ1NJTkMuICAqLwoJICAg ICpjb3N0ICs9IHJ0eF9jb3N0IChYRVhQIChvcDAsIDApLCBtb2RlLCBQTFVTLCAwLCBzcGVlZCk7 CgkgICAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMSwgbW9kZSwgUExVUywgMSwgc3BlZWQpOwoJICAg IHJldHVybiB0cnVlOwoJICB9CgoJaWYgKEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX0lO VAoJICAgICYmIChhYXJjaDY0X3BsdXNfaW1tZWRpYXRlIChvcDEsIG1vZGUpCgkJfHwgYWFyY2g2 NF9zdmVfYWRkdmxfYWRkcGxfaW1tZWRpYXRlIChvcDEsIG1vZGUpKSkKCSAgewoJICAgICpjb3N0 ICs9IHJ0eF9jb3N0IChvcDAsIG1vZGUsIFBMVVMsIDAsIHNwZWVkKTsKCgkgICAgaWYgKHNwZWVk KQoJICAgICAgewoJCS8qIEFERCAoaW1tZWRpYXRlKS4gICovCgkJKmNvc3QgKz0gZXh0cmFfY29z dC0+YWx1LmFyaXRoOwoKCQkvKiBTb21lIHR1bmluZ3MgcHJlZmVyIHRvIG5vdCB1c2UgdGhlIFZM LWJhc2VkIHNjYWxhciBvcHMuCgkJICAgSW5jcmVhc2UgdGhlIGNvc3Qgb2YgdGhlIHBvbHkgaW1t ZWRpYXRlIHRvIHByZXZlbnQgdGhlaXIKCQkgICBmb3JtYXRpb24uICAqLwoJCWlmIChHRVRfQ09E RSAob3AxKSA9PSBDT05TVF9QT0xZX0lOVAoJCSAgICAmJiAoYWFyY2g2NF90dW5lX3BhcmFtcy5l eHRyYV90dW5pbmdfZmxhZ3MKCQkJJiBBQVJDSDY0X0VYVFJBX1RVTkVfQ1NFX1NWRV9WTF9DT05T VEFOVFMpKQoJCSAgKmNvc3QgKz0gQ09TVFNfTl9JTlNOUyAoMSk7CgkgICAgICB9CgkgICAgcmV0 dXJuIHRydWU7CgkgIH0KCglpZiAoYWFyY2g2NF9wbHVzbG9uZ19pbW1lZGlhdGUgKG9wMSwgbW9k ZSkpCgkgIHsKCSAgICAvKiAyNC1iaXQgYWRkIGluIDIgaW5zdHJ1Y3Rpb25zIG9yIDEyLWJpdCBz aGlmdGVkIGFkZC4gICovCgkgICAgaWYgKChJTlRWQUwgKG9wMSkgJiAweGZmZikgIT0gMCkKCSAg ICAgICpjb3N0ICs9IENPU1RTX05fSU5TTlMgKDEpOwoKCSAgICAqY29zdCArPSBydHhfY29zdCAo b3AwLCBtb2RlLCBQTFVTLCAwLCBzcGVlZCk7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0KCgkqY29z dCArPSBydHhfY29zdCAob3AxLCBtb2RlLCBQTFVTLCAxLCBzcGVlZCk7CgoJLyogTG9vayBmb3Ig QUREIChleHRlbmRlZCByZWdpc3RlcikuICAqLwoJaWYgKGlzX2EgPHNjYWxhcl9pbnRfbW9kZT4g KG1vZGUpCgkgICAgJiYgYWFyY2g2NF9ydHhfYXJpdGhfb3BfZXh0cmFjdF9wIChvcDApKQoJICB7 CgkgICAgaWYgKHNwZWVkKQoJICAgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+YWx1LmV4dGVuZF9h cml0aDsKCgkgICAgb3AwID0gYWFyY2g2NF9zdHJpcF9leHRlbmQgKG9wMCwgdHJ1ZSk7CgkgICAg KmNvc3QgKz0gcnR4X2Nvc3QgKG9wMCwgVk9JRG1vZGUsCgkJCSAgICAgICAoZW51bSBydHhfY29k ZSkgR0VUX0NPREUgKG9wMCksIDAsIHNwZWVkKTsKCSAgICByZXR1cm4gdHJ1ZTsKCSAgfQoKCS8q IFN0cmlwIGFueSBleHRlbmQsIGxlYXZlIHNoaWZ0cyBiZWhpbmQgYXMgd2Ugd2lsbAoJICAgY29z dCB0aGVtIHRocm91Z2ggbXVsdF9jb3N0LiAgKi8KCW5ld19vcDAgPSBhYXJjaDY0X3N0cmlwX2V4 dGVuZCAob3AwLCBmYWxzZSk7CgoJaWYgKEdFVF9DT0RFIChuZXdfb3AwKSA9PSBNVUxUCgkgICAg fHwgYWFyY2g2NF9zaGlmdF9wIChHRVRfQ09ERSAobmV3X29wMCkpKQoJICB7CgkgICAgKmNvc3Qg Kz0gYWFyY2g2NF9ydHhfbXVsdF9jb3N0IChuZXdfb3AwLCBNVUxULCBQTFVTLAoJCQkJCSAgICBz cGVlZCk7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0KCgkqY29zdCArPSBydHhfY29zdCAobmV3X29w MCwgVk9JRG1vZGUsIFBMVVMsIDAsIHNwZWVkKTsKCglpZiAoc3BlZWQpCgkgIHsKCSAgICBpZiAo VkVDVE9SX01PREVfUCAobW9kZSkpCgkgICAgICB7CgkJLyogVmVjdG9yIEFERC4gICovCgkJKmNv c3QgKz0gZXh0cmFfY29zdC0+dmVjdC5hbHU7CgkgICAgICB9CgkgICAgZWxzZSBpZiAoR0VUX01P REVfQ0xBU1MgKG1vZGUpID09IE1PREVfSU5UKQoJICAgICAgewoJCS8qIEFERC4gICovCgkJKmNv c3QgKz0gZXh0cmFfY29zdC0+YWx1LmFyaXRoOwoJICAgICAgfQoJICAgIGVsc2UgaWYgKEdFVF9N T0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX0ZMT0FUKQoJICAgICAgewoJCS8qIEZBREQuICAqLwoJ CSpjb3N0ICs9IGV4dHJhX2Nvc3QtPmZwW21vZGUgPT0gREZtb2RlXS5hZGRzdWI7CgkgICAgICB9 CgkgIH0KCXJldHVybiB0cnVlOwogICAgICB9CgogICAgY2FzZSBCU1dBUDoKICAgICAgKmNvc3Qg PSBDT1NUU19OX0lOU05TICgxKTsKCiAgICAgIGlmIChzcGVlZCkKCXsKCSAgaWYgKFZFQ1RPUl9N T0RFX1AgKG1vZGUpKQoJICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPnZlY3QuYWx1OwoJICBlbHNl CgkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+YWx1LnJldjsKCX0KICAgICAgcmV0dXJuIGZhbHNl OwoKICAgIGNhc2UgSU9SOgogICAgICBpZiAoYWFyY2hfcmV2MTZfcCAoeCkpCiAgICAgICAgewog ICAgICAgICAgKmNvc3QgPSBDT1NUU19OX0lOU05TICgxKTsKCgkgIGlmIChzcGVlZCkKCSAgICB7 CgkgICAgICBpZiAoVkVDVE9SX01PREVfUCAobW9kZSkpCgkJKmNvc3QgKz0gZXh0cmFfY29zdC0+ dmVjdC5hbHU7CgkgICAgICBlbHNlCgkJKmNvc3QgKz0gZXh0cmFfY29zdC0+YWx1LnJldjsKCSAg ICB9CgkgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgIGlmIChhYXJjaDY0X2V4dHJfcnR4 X3AgKHgsICZvcDAsICZvcDEpKQogICAgICAgIHsKCSAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMCwg bW9kZSwgSU9SLCAwLCBzcGVlZCk7CgkgICpjb3N0ICs9IHJ0eF9jb3N0IChvcDEsIG1vZGUsIElP UiwgMSwgc3BlZWQpOwogICAgICAgICAgaWYgKHNwZWVkKQogICAgICAgICAgICAqY29zdCArPSBl eHRyYV9jb3N0LT5hbHUuc2hpZnQ7CgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQog ICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KICAgIGNhc2UgWE9SOgogICAgY2FzZSBBTkQ6CiAgICBj b3N0X2xvZ2ljOgogICAgICBvcDAgPSBYRVhQICh4LCAwKTsKICAgICAgb3AxID0gWEVYUCAoeCwg MSk7CgogICAgICBpZiAoVkVDVE9SX01PREVfUCAobW9kZSkpCgl7CgkgIGlmIChzcGVlZCkKCSAg ICAqY29zdCArPSBleHRyYV9jb3N0LT52ZWN0LmFsdTsKCSAgcmV0dXJuIHRydWU7Cgl9CgogICAg ICBpZiAoY29kZSA9PSBBTkQKICAgICAgICAgICYmIEdFVF9DT0RFIChvcDApID09IE1VTFQKICAg ICAgICAgICYmIENPTlNUX0lOVF9QIChYRVhQIChvcDAsIDEpKQogICAgICAgICAgJiYgQ09OU1Rf SU5UX1AgKG9wMSkKICAgICAgICAgICYmIGFhcmNoNjRfdXh0X3NpemUgKGV4YWN0X2xvZzIgKElO VFZBTCAoWEVYUCAob3AwLCAxKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5U VkFMIChvcDEpKSAhPSAwKQogICAgICAgIHsKICAgICAgICAgIC8qIFRoaXMgaXMgYSBVQkZNL1NC Rk0uICAqLwoJICAqY29zdCArPSBydHhfY29zdCAoWEVYUCAob3AwLCAwKSwgbW9kZSwgWkVST19F WFRSQUNULCAwLCBzcGVlZCk7CgkgIGlmIChzcGVlZCkKCSAgICAqY29zdCArPSBleHRyYV9jb3N0 LT5hbHUuYmZ4OwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgaWYgKGlz X2ludF9tb2RlIChtb2RlLCAmaW50X21vZGUpKQoJewoJICBpZiAoQ09OU1RfSU5UX1AgKG9wMSkp CgkgICAgewoJICAgICAgLyogV2UgaGF2ZSBhIG1hc2sgKyBzaGlmdCB2ZXJzaW9uIG9mIGEgVUJG SVoKCQkgaS5lLiB0aGUgKmFuZGltX2FzaGlmdDxtb2RlPl9iZml6IHBhdHRlcm4uICAqLwoJICAg ICAgaWYgKEdFVF9DT0RFIChvcDApID09IEFTSElGVAoJCSAgJiYgYWFyY2g2NF9tYXNrX2FuZF9z aGlmdF9mb3JfdWJmaXpfcCAoaW50X21vZGUsIG9wMSwKCQkJCQkJCSBYRVhQIChvcDAsIDEpKSkK CQl7CgkJICAqY29zdCArPSBydHhfY29zdCAoWEVYUCAob3AwLCAwKSwgaW50X21vZGUsCgkJCQkg ICAgIChlbnVtIHJ0eF9jb2RlKSBjb2RlLCAwLCBzcGVlZCk7CgkJICBpZiAoc3BlZWQpCgkJICAg ICpjb3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5iZng7CgoJCSAgcmV0dXJuIHRydWU7CgkJfQoJICAg ICAgZWxzZSBpZiAoYWFyY2g2NF9iaXRtYXNrX2ltbSAoSU5UVkFMIChvcDEpLCBpbnRfbW9kZSkp CgkJewoJCS8qIFdlIHBvc3NpYmx5IGdldCB0aGUgaW1tZWRpYXRlIGZvciBmcmVlLCB0aGlzIGlz IG5vdAoJCSAgIG1vZGVsbGVkLiAgKi8KCQkgICpjb3N0ICs9IHJ0eF9jb3N0IChvcDAsIGludF9t b2RlLAoJCQkJICAgICAoZW51bSBydHhfY29kZSkgY29kZSwgMCwgc3BlZWQpOwoJCSAgaWYgKHNw ZWVkKQoJCSAgICAqY29zdCArPSBleHRyYV9jb3N0LT5hbHUubG9naWNhbDsKCgkJICByZXR1cm4g dHJ1ZTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcnR4IG5ld19vcDAgPSBvcDA7 CgoJICAgICAgLyogSGFuZGxlIE9STiwgRU9OLCBvciBCSUMuICAqLwoJICAgICAgaWYgKEdFVF9D T0RFIChvcDApID09IE5PVCkKCQlvcDAgPSBYRVhQIChvcDAsIDApOwoKCSAgICAgIG5ld19vcDAg PSBhYXJjaDY0X3N0cmlwX3NoaWZ0IChvcDApOwoKCSAgICAgIC8qIElmIHdlIGhhZCBhIHNoaWZ0 IG9uIG9wMCB0aGVuIHRoaXMgaXMgYSBsb2dpY2FsLXNoaWZ0LQoJCSBieS1yZWdpc3Rlci9pbW1l ZGlhdGUgb3BlcmF0aW9uLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIGp1c3QKCQkgYSBsb2dpY2FsIG9w ZXJhdGlvbi4gICovCgkgICAgICBpZiAoc3BlZWQpCgkJewoJCSAgaWYgKG5ld19vcDAgIT0gb3Aw KQoJCSAgICB7CgkJICAgICAgLyogU2hpZnQgYnkgaW1tZWRpYXRlLiAgKi8KCQkgICAgICBpZiAo Q09OU1RfSU5UX1AgKFhFWFAgKG9wMCwgMSkpKQoJCQkqY29zdCArPSBleHRyYV9jb3N0LT5hbHUu bG9nX3NoaWZ0OwoJCSAgICAgIGVsc2UKCQkJKmNvc3QgKz0gZXh0cmFfY29zdC0+YWx1LmxvZ19z aGlmdF9yZWc7CgkJICAgIH0KCQkgIGVsc2UKCQkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+YWx1 LmxvZ2ljYWw7CgkJfQoKCSAgICAgIC8qIEluIGJvdGggY2FzZXMgd2Ugd2FudCB0byBjb3N0IGJv dGggb3BlcmFuZHMuICAqLwoJICAgICAgKmNvc3QgKz0gcnR4X2Nvc3QgKG5ld19vcDAsIGludF9t b2RlLCAoZW51bSBydHhfY29kZSkgY29kZSwKCQkJCSAwLCBzcGVlZCk7CgkgICAgICAqY29zdCAr PSBydHhfY29zdCAob3AxLCBpbnRfbW9kZSwgKGVudW0gcnR4X2NvZGUpIGNvZGUsCgkJCQkgMSwg c3BlZWQpOwoKCSAgICAgIHJldHVybiB0cnVlOwoJICAgIH0KCX0KICAgICAgcmV0dXJuIGZhbHNl OwoKICAgIGNhc2UgTk9UOgogICAgICB4ID0gWEVYUCAoeCwgMCk7CiAgICAgIG9wMCA9IGFhcmNo NjRfc3RyaXBfc2hpZnQgKHgpOwoKICAgICAgaWYgKFZFQ1RPUl9NT0RFX1AgKG1vZGUpKQoJewoJ ICAvKiBWZWN0b3IgTk9ULiAgKi8KCSAgKmNvc3QgKz0gZXh0cmFfY29zdC0+dmVjdC5hbHU7Cgkg IHJldHVybiBmYWxzZTsKCX0KCiAgICAgIC8qIE1WTi1zaGlmdGVkLXJlZy4gICovCiAgICAgIGlm IChvcDAgIT0geCkKICAgICAgICB7CgkgICpjb3N0ICs9IHJ0eF9jb3N0IChvcDAsIG1vZGUsIChl bnVtIHJ0eF9jb2RlKSBjb2RlLCAwLCBzcGVlZCk7CgogICAgICAgICAgaWYgKHNwZWVkKQogICAg ICAgICAgICAqY29zdCArPSBleHRyYV9jb3N0LT5hbHUubG9nX3NoaWZ0OwoKICAgICAgICAgIHJl dHVybiB0cnVlOwogICAgICAgIH0KICAgICAgLyogRU9OIGNhbiBoYXZlIHR3byBmb3JtczogKHhv ciAobm90IGEpIGIpIGJ1dCBhbHNvIChub3QgKHhvciBhIGIpKS4KICAgICAgICAgSGFuZGxlIHRo ZSBzZWNvbmQgZm9ybSBoZXJlIHRha2luZyBjYXJlIHRoYXQgJ2EnIGluIHRoZSBhYm92ZSBjYW4K ICAgICAgICAgYmUgYSBzaGlmdC4gICovCiAgICAgIGVsc2UgaWYgKEdFVF9DT0RFIChvcDApID09 IFhPUikKICAgICAgICB7CiAgICAgICAgICBydHggbmV3b3AwID0gWEVYUCAob3AwLCAwKTsKICAg ICAgICAgIHJ0eCBuZXdvcDEgPSBYRVhQIChvcDAsIDEpOwogICAgICAgICAgcnR4IG9wMF9zdHJp cHBlZCA9IGFhcmNoNjRfc3RyaXBfc2hpZnQgKG5ld29wMCk7CgoJICAqY29zdCArPSBydHhfY29z dCAobmV3b3AxLCBtb2RlLCAoZW51bSBydHhfY29kZSkgY29kZSwgMSwgc3BlZWQpOwoJICAqY29z dCArPSBydHhfY29zdCAob3AwX3N0cmlwcGVkLCBtb2RlLCBYT1IsIDAsIHNwZWVkKTsKCiAgICAg ICAgICBpZiAoc3BlZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAob3AwX3N0cmlw cGVkICE9IG5ld29wMCkKICAgICAgICAgICAgICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5s b2dfc2hpZnQ7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgKmNvc3QgKz0gZXh0 cmFfY29zdC0+YWx1LmxvZ2ljYWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdHJ1 ZTsKICAgICAgICB9CiAgICAgIC8qIE1WTi4gICovCiAgICAgIGlmIChzcGVlZCkKCSpjb3N0ICs9 IGV4dHJhX2Nvc3QtPmFsdS5sb2dpY2FsOwoKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhc2Ug WkVST19FWFRFTkQ6CgogICAgICBvcDAgPSBYRVhQICh4LCAwKTsKICAgICAgLyogSWYgYSB2YWx1 ZSBpcyB3cml0dGVuIGluIFNJIG1vZGUsIHRoZW4gemVybyBleHRlbmRlZCB0byBESQoJIG1vZGUs IHRoZSBvcGVyYXRpb24gd2lsbCBpbiBnZW5lcmFsIGJlIGZyZWUgYXMgYSB3cml0ZSB0bwoJIGEg J3cnIHJlZ2lzdGVyIGltcGxpY2l0bHkgemVyb2VzIHRoZSB1cHBlciBiaXRzIG9mIGFuICd4JwoJ IHJlZ2lzdGVyLiAgSG93ZXZlciwgaWYgdGhpcyBpcwoKCSAgIChzZXQgKHJlZykgKHplcm9fZXh0 ZW5kIChyZWcpKSkKCgkgd2UgbXVzdCBjb3N0IHRoZSBleHBsaWNpdCByZWdpc3RlciBtb3ZlLiAg Ki8KICAgICAgaWYgKG1vZGUgPT0gREltb2RlCgkgICYmIEdFVF9NT0RFIChvcDApID09IFNJbW9k ZSkKCXsKCSAgaW50IG9wX2Nvc3QgPSBydHhfY29zdCAob3AwLCBWT0lEbW9kZSwgWkVST19FWFRF TkQsIDAsIHNwZWVkKTsKCgkvKiBJZiBPUF9DT1NUIGlzIG5vbi16ZXJvLCB0aGVuIHRoZSBjb3N0 IG9mIHRoZSB6ZXJvIGV4dGVuZAoJICAgaXMgZWZmZWN0aXZlbHkgdGhlIGNvc3Qgb2YgdGhlIGlu bmVyIG9wZXJhdGlvbi4gIE90aGVyd2lzZQoJICAgd2UgaGF2ZSBhIE1PViBpbnN0cnVjdGlvbiBh bmQgd2UgdGFrZSB0aGUgY29zdCBmcm9tIHRoZSBNT1YKCSAgIGl0c2VsZi4gIFRoaXMgaXMgdHJ1 ZSBpbmRlcGVuZGVudGx5IG9mIHdoZXRoZXIgd2UgYXJlCgkgICBvcHRpbWl6aW5nIGZvciBzcGFj ZSBvciB0aW1lLiAgKi8KCSAgaWYgKG9wX2Nvc3QpCgkgICAgKmNvc3QgPSBvcF9jb3N0OwoKCSAg cmV0dXJuIHRydWU7Cgl9CiAgICAgIGVsc2UgaWYgKE1FTV9QIChvcDApKQoJewoJICAvKiBBbGwg bG9hZHMgY2FuIHplcm8gZXh0ZW5kIHRvIGFueSBzaXplIGZvciBmcmVlLiAgKi8KCSAgKmNvc3Qg PSBydHhfY29zdCAob3AwLCBWT0lEbW9kZSwgWkVST19FWFRFTkQsIHBhcmFtLCBzcGVlZCk7Cgkg IHJldHVybiB0cnVlOwoJfQoKICAgICAgb3AwID0gYWFyY2g2NF9leHRlbmRfYml0ZmllbGRfcGF0 dGVybl9wICh4KTsKICAgICAgaWYgKG9wMCkKCXsKCSAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMCwg bW9kZSwgWkVST19FWFRFTkQsIDAsIHNwZWVkKTsKCSAgaWYgKHNwZWVkKQoJICAgICpjb3N0ICs9 IGV4dHJhX2Nvc3QtPmFsdS5iZng7CgkgIHJldHVybiB0cnVlOwoJfQoKICAgICAgaWYgKHNwZWVk KQoJewoJICBpZiAoVkVDVE9SX01PREVfUCAobW9kZSkpCgkgICAgewoJICAgICAgLyogVU1PVi4g ICovCgkgICAgICAqY29zdCArPSBleHRyYV9jb3N0LT52ZWN0LmFsdTsKCSAgICB9CgkgIGVsc2UK CSAgICB7CgkgICAgICAvKiBXZSBnZW5lcmF0ZSBhbiBBTkQgaW5zdGVhZCBvZiBVWFRCL1VYVEgu ICAqLwoJICAgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+YWx1LmxvZ2ljYWw7CgkgICAgfQoJfQog ICAgICByZXR1cm4gZmFsc2U7CgogICAgY2FzZSBTSUdOX0VYVEVORDoKICAgICAgaWYgKE1FTV9Q IChYRVhQICh4LCAwKSkpCgl7CgkgIC8qIExEUlNILiAgKi8KCSAgaWYgKHNwZWVkKQoJICAgIHsK CSAgICAgIHJ0eCBhZGRyZXNzID0gWEVYUCAoWEVYUCAoeCwgMCksIDApOwoJICAgICAgKmNvc3Qg Kz0gZXh0cmFfY29zdC0+bGRzdC5sb2FkX3NpZ25fZXh0ZW5kOwoKCSAgICAgICpjb3N0ICs9CgkJ Q09TVFNfTl9JTlNOUyAoYWFyY2g2NF9hZGRyZXNzX2Nvc3QgKGFkZHJlc3MsIG1vZGUsCgkJCQkJ CSAgICAgMCwgc3BlZWQpKTsKCSAgICB9CgkgIHJldHVybiB0cnVlOwoJfQoKICAgICAgb3AwID0g YWFyY2g2NF9leHRlbmRfYml0ZmllbGRfcGF0dGVybl9wICh4KTsKICAgICAgaWYgKG9wMCkKCXsK CSAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMCwgbW9kZSwgU0lHTl9FWFRFTkQsIDAsIHNwZWVkKTsK CSAgaWYgKHNwZWVkKQoJICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5iZng7CgkgIHJldHVy biB0cnVlOwoJfQoKICAgICAgaWYgKHNwZWVkKQoJewoJICBpZiAoVkVDVE9SX01PREVfUCAobW9k ZSkpCgkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+dmVjdC5hbHU7CgkgIGVsc2UKCSAgICAqY29z dCArPSBleHRyYV9jb3N0LT5hbHUuZXh0ZW5kOwoJfQogICAgICByZXR1cm4gZmFsc2U7CgogICAg Y2FzZSBST1RBVEU6CiAgICBjYXNlIFJPVEFURVJUOgogICAgY2FzZSBMU0hJRlRSVDoKICAgIGNh c2UgQVNISUZUUlQ6CiAgICBjYXNlIEFTSElGVDoKICAgICAgb3AwID0gWEVYUCAoeCwgMCk7CiAg ICAgIG9wMSA9IFhFWFAgKHgsIDEpOwoKICAgICAgaWYgKENPTlNUX0lOVF9QIChvcDEpKQogICAg ICAgIHsKCSAgaWYgKHNwZWVkKQoJICAgIHsKCSAgICAgIGlmIChWRUNUT1JfTU9ERV9QIChtb2Rl KSkKCQl7CgkJICAvKiBWZWN0b3Igc2hpZnQgKGltbWVkaWF0ZSkuICAqLwoJCSAgKmNvc3QgKz0g ZXh0cmFfY29zdC0+dmVjdC5hbHU7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgIC8qIExTTCAoaW1t ZWRpYXRlKSwgQVNSIChpbW1lZGlhdGUpLCBVQk1GLCBVQkZJWiBhbmQgZnJpZW5kcy4KCQkgICAg IFRoZXNlIGFyZSBhbGwgYWxpYXNlcy4gICovCgkJICAqY29zdCArPSBleHRyYV9jb3N0LT5hbHUu c2hpZnQ7CgkJfQoJICAgIH0KCiAgICAgICAgICAvKiBXZSBjYW4gaW5jb3Jwb3JhdGUgemVyby9z aWduIGV4dGVuZCBmb3IgZnJlZS4gICovCiAgICAgICAgICBpZiAoR0VUX0NPREUgKG9wMCkgPT0g WkVST19FWFRFTkQKICAgICAgICAgICAgICB8fCBHRVRfQ09ERSAob3AwKSA9PSBTSUdOX0VYVEVO RCkKICAgICAgICAgICAgb3AwID0gWEVYUCAob3AwLCAwKTsKCgkgICpjb3N0ICs9IHJ0eF9jb3N0 IChvcDAsIFZPSURtb2RlLCBBU0hJRlQsIDAsIHNwZWVkKTsKICAgICAgICAgIHJldHVybiB0cnVl OwogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHsKCSAgaWYgKFZFQ1RPUl9NT0RFX1AgKG1v ZGUpKQoJICAgIHsKCSAgICAgIGlmIChzcGVlZCkKCQkvKiBWZWN0b3Igc2hpZnQgKHJlZ2lzdGVy KS4gICovCgkJKmNvc3QgKz0gZXh0cmFfY29zdC0+dmVjdC5hbHU7CgkgICAgfQoJICBlbHNlCgkg ICAgewoJICAgICAgaWYgKHNwZWVkKQoJCS8qIExTTFYsIEFTUlYuICAqLwoJCSpjb3N0ICs9IGV4 dHJhX2Nvc3QtPmFsdS5zaGlmdF9yZWc7CgoJICAgICAgIC8qIFRoZSByZWdpc3RlciBzaGlmdCBh bW91bnQgbWF5IGJlIGluIGEgc2hvcnRlciBtb2RlIGV4cHJlc3NlZAoJCSAgYXMgYSBsb3dwYXJ0 IFNVQlJFRy4gIEZvciBjb3N0aW5nIHB1cnBvc2VzIGp1c3QgbG9vayBpbnNpZGUuICAqLwoJICAg ICAgaWYgKFNVQlJFR19QIChvcDEpICYmIHN1YnJlZ19sb3dwYXJ0X3AgKG9wMSkpCgkJb3AxID0g U1VCUkVHX1JFRyAob3AxKTsKCSAgICAgIGlmIChHRVRfQ09ERSAob3AxKSA9PSBBTkQgJiYgUkVH X1AgKFhFWFAgKG9wMSwgMCkpCgkJICAmJiBDT05TVF9JTlRfUCAoWEVYUCAob3AxLCAxKSkKCQkg ICYmIGtub3duX2VxIChJTlRWQUwgKFhFWFAgKG9wMSwgMSkpLAoJCQkgICAgICAgR0VUX01PREVf QklUU0laRSAobW9kZSkgLSAxKSkKCQl7CgkJICAqY29zdCArPSBydHhfY29zdCAob3AwLCBtb2Rl LCAocnR4X2NvZGUpIGNvZGUsIDAsIHNwZWVkKTsKCQkgIC8qIFdlIGFscmVhZHkgZGVtYW5kZWQg WEVYUCAob3AxLCAwKSB0byBiZSBSRUdfUCwgc28KCQkgICAgIGRvbid0IHJlY3Vyc2UgaW50byBp dC4gICovCgkJICByZXR1cm4gdHJ1ZTsKCQl9CgkgICAgfQoJICByZXR1cm4gZmFsc2U7ICAvKiBB bGwgYXJndW1lbnRzIG5lZWQgdG8gYmUgaW4gcmVnaXN0ZXJzLiAgKi8KICAgICAgICB9CgogICAg Y2FzZSBTWU1CT0xfUkVGOgoKICAgICAgaWYgKGFhcmNoNjRfY21vZGVsID09IEFBUkNINjRfQ01P REVMX0xBUkdFCgkgIHx8IGFhcmNoNjRfY21vZGVsID09IEFBUkNINjRfQ01PREVMX1NNQUxMX1NQ SUMpCgl7CgkgIC8qIExEUi4gICovCgkgIGlmIChzcGVlZCkKCSAgICAqY29zdCArPSBleHRyYV9j b3N0LT5sZHN0LmxvYWQ7Cgl9CiAgICAgIGVsc2UgaWYgKGFhcmNoNjRfY21vZGVsID09IEFBUkNI NjRfQ01PREVMX1NNQUxMCgkgICAgICAgfHwgYWFyY2g2NF9jbW9kZWwgPT0gQUFSQ0g2NF9DTU9E RUxfU01BTExfUElDKQoJewoJICAvKiBBRFJQLCBmb2xsb3dlZCBieSBBREQuICAqLwoJICAqY29z dCArPSBDT1NUU19OX0lOU05TICgxKTsKCSAgaWYgKHNwZWVkKQoJICAgICpjb3N0ICs9IDIgKiBl eHRyYV9jb3N0LT5hbHUuYXJpdGg7Cgl9CiAgICAgIGVsc2UgaWYgKGFhcmNoNjRfY21vZGVsID09 IEFBUkNINjRfQ01PREVMX1RJTlkKCSAgICAgICB8fCBhYXJjaDY0X2Ntb2RlbCA9PSBBQVJDSDY0 X0NNT0RFTF9USU5ZX1BJQykKCXsKCSAgLyogQURSLiAgKi8KCSAgaWYgKHNwZWVkKQoJICAgICpj b3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5hcml0aDsKCX0KCiAgICAgIGlmIChmbGFnX3BpYykKCXsK CSAgLyogT25lIGV4dHJhIGxvYWQgaW5zdHJ1Y3Rpb24sIGFmdGVyIGFjY2Vzc2luZyB0aGUgR09U LiAgKi8KCSAgKmNvc3QgKz0gQ09TVFNfTl9JTlNOUyAoMSk7CgkgIGlmIChzcGVlZCkKCSAgICAq Y29zdCArPSBleHRyYV9jb3N0LT5sZHN0LmxvYWQ7Cgl9CiAgICAgIHJldHVybiB0cnVlOwoKICAg IGNhc2UgSElHSDoKICAgIGNhc2UgTE9fU1VNOgogICAgICAvKiBBRFJQL0FERCAoaW1tZWRpYXRl KS4gICovCiAgICAgIGlmIChzcGVlZCkKCSpjb3N0ICs9IGV4dHJhX2Nvc3QtPmFsdS5hcml0aDsK ICAgICAgcmV0dXJuIHRydWU7CgogICAgY2FzZSBaRVJPX0VYVFJBQ1Q6CiAgICBjYXNlIFNJR05f RVhUUkFDVDoKICAgICAgLyogVUJGWC9TQkZYLiAgKi8KICAgICAgaWYgKHNwZWVkKQoJewoJICBp ZiAoVkVDVE9SX01PREVfUCAobW9kZSkpCgkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+dmVjdC5h bHU7CgkgIGVsc2UKCSAgICAqY29zdCArPSBleHRyYV9jb3N0LT5hbHUuYmZ4OwoJfQoKICAgICAg LyogV2UgY2FuIHRydXN0IHRoYXQgdGhlIGltbWVkaWF0ZXMgdXNlZCB3aWxsIGJlIGNvcnJlY3Qg KHRoZXJlCgkgYXJlIG5vIGJ5LXJlZ2lzdGVyIGZvcm1zKSwgc28gd2UgbmVlZCBvbmx5IGNvc3Qg b3AwLiAgKi8KICAgICAgKmNvc3QgKz0gcnR4X2Nvc3QgKFhFWFAgKHgsIDApLCBWT0lEbW9kZSwg KGVudW0gcnR4X2NvZGUpIGNvZGUsIDAsIHNwZWVkKTsKICAgICAgcmV0dXJuIHRydWU7CgogICAg Y2FzZSBNVUxUOgogICAgICAqY29zdCArPSBhYXJjaDY0X3J0eF9tdWx0X2Nvc3QgKHgsIE1VTFQs IDAsIHNwZWVkKTsKICAgICAgLyogYWFyY2g2NF9ydHhfbXVsdF9jb3N0IGFsd2F5cyBoYW5kbGVz IHJlY3Vyc2lvbiB0byBpdHMKCSBvcGVyYW5kcy4gICovCiAgICAgIHJldHVybiB0cnVlOwoKICAg IGNhc2UgTU9EOgogICAgLyogV2UgY2FuIGV4cGFuZCBzaWduZWQgbW9kIGJ5IHBvd2VyIG9mIDIg dXNpbmcgYSBORUdTLCB0d28gcGFyYWxsZWwKICAgICAgIEFORHMgYW5kIGEgQ1NORUcuICBBc3N1 bWUgaGVyZSB0aGF0IENTTkVHIGlzIHRoZSBzYW1lIGFzIHRoZSBjb3N0IG9mCiAgICAgICBhbiB1 bmNvbmRpdGlvbmFsIG5lZ2F0ZS4gIFRoaXMgY2FzZSBzaG91bGQgb25seSBldmVyIGJlIHJlYWNo ZWQgdGhyb3VnaAogICAgICAgdGhlIHNldF9zbW9kX3BvdzJfY2hlYXAgY2hlY2sgaW4gZXhwbWVk LmNjLiAgKi8KICAgICAgaWYgKENPTlNUX0lOVF9QIChYRVhQICh4LCAxKSkKCSAgJiYgZXhhY3Rf bG9nMiAoSU5UVkFMIChYRVhQICh4LCAxKSkpID4gMAoJICAmJiAobW9kZSA9PSBTSW1vZGUgfHwg bW9kZSA9PSBESW1vZGUpKQoJewoJICAvKiBXZSBleHBhbmQgdG8gNCBpbnN0cnVjdGlvbnMuICBS ZXNldCB0aGUgYmFzZWxpbmUuICAqLwoJICAqY29zdCA9IENPU1RTX05fSU5TTlMgKDQpOwoKCSAg aWYgKHNwZWVkKQoJICAgICpjb3N0ICs9IDIgKiBleHRyYV9jb3N0LT5hbHUubG9naWNhbAoJCSAg ICAgKyAyICogZXh0cmFfY29zdC0+YWx1LmFyaXRoOwoKCSAgcmV0dXJuIHRydWU7Cgl9CgogICAg LyogRmFsbC10aHJvdWdoLiAgKi8KICAgIGNhc2UgVU1PRDoKICAgICAgaWYgKHNwZWVkKQoJewoJ ICAvKiBTbGlnaGx5IHByZWZlciBVTU9EIG92ZXIgU01PRC4gICovCgkgIGlmIChWRUNUT1JfTU9E RV9QIChtb2RlKSkKCSAgICAqY29zdCArPSBleHRyYV9jb3N0LT52ZWN0LmFsdTsKCSAgZWxzZSBp ZiAoR0VUX01PREVfQ0xBU1MgKG1vZGUpID09IE1PREVfSU5UKQoJICAgICpjb3N0ICs9IChleHRy YV9jb3N0LT5tdWx0W21vZGUgPT0gREltb2RlXS5hZGQKCQkgICAgICArIGV4dHJhX2Nvc3QtPm11 bHRbbW9kZSA9PSBESW1vZGVdLmlkaXYKCQkgICAgICArIChjb2RlID09IE1PRCA/IDEgOiAwKSk7 Cgl9CiAgICAgIHJldHVybiBmYWxzZTsgIC8qIEFsbCBhcmd1bWVudHMgbmVlZCB0byBiZSBpbiBy ZWdpc3RlcnMuICAqLwoKICAgIGNhc2UgRElWOgogICAgY2FzZSBVRElWOgogICAgY2FzZSBTUVJU OgogICAgICBpZiAoc3BlZWQpCgl7CgkgIGlmIChWRUNUT1JfTU9ERV9QIChtb2RlKSkKCSAgICAq Y29zdCArPSBleHRyYV9jb3N0LT52ZWN0LmFsdTsKCSAgZWxzZSBpZiAoR0VUX01PREVfQ0xBU1Mg KG1vZGUpID09IE1PREVfSU5UKQoJICAgIC8qIFRoZXJlIGlzIG5vIGludGVnZXIgU1FSVCwgc28g b25seSBESVYgYW5kIFVESVYgY2FuIGdldAoJICAgICAgIGhlcmUuICAqLwoJICAgICpjb3N0ICs9 IChleHRyYV9jb3N0LT5tdWx0W21vZGUgPT0gREltb2RlXS5pZGl2CgkJICAgICAvKiBTbGlnaGx5 IHByZWZlciBVRElWIG92ZXIgU0RJVi4gICovCgkJICAgICArIChjb2RlID09IERJViA/IDEgOiAw KSk7CgkgIGVsc2UKCSAgICAqY29zdCArPSBleHRyYV9jb3N0LT5mcFttb2RlID09IERGbW9kZV0u ZGl2OwoJfQogICAgICByZXR1cm4gZmFsc2U7ICAvKiBBbGwgYXJndW1lbnRzIG5lZWQgdG8gYmUg aW4gcmVnaXN0ZXJzLiAgKi8KCiAgICBjYXNlIElGX1RIRU5fRUxTRToKICAgICAgcmV0dXJuIGFh cmNoNjRfaWZfdGhlbl9lbHNlX2Nvc3RzIChYRVhQICh4LCAwKSwgWEVYUCAoeCwgMSksCgkJCQkJ IFhFWFAgKHgsIDIpLCBjb3N0LCBzcGVlZCk7CgogICAgY2FzZSBFUToKICAgIGNhc2UgTkU6CiAg ICBjYXNlIEdUOgogICAgY2FzZSBHVFU6CiAgICBjYXNlIExUOgogICAgY2FzZSBMVFU6CiAgICBj YXNlIEdFOgogICAgY2FzZSBHRVU6CiAgICBjYXNlIExFOgogICAgY2FzZSBMRVU6CgogICAgICBy ZXR1cm4gZmFsc2U7IC8qIEFsbCBhcmd1bWVudHMgbXVzdCBiZSBpbiByZWdpc3RlcnMuICAqLwoK ICAgIGNhc2UgRk1BOgogICAgICBvcDAgPSBYRVhQICh4LCAwKTsKICAgICAgb3AxID0gWEVYUCAo eCwgMSk7CiAgICAgIG9wMiA9IFhFWFAgKHgsIDIpOwoKICAgICAgaWYgKHNwZWVkKQoJewoJICBp ZiAoVkVDVE9SX01PREVfUCAobW9kZSkpCgkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+dmVjdC5h bHU7CgkgIGVsc2UKCSAgICAqY29zdCArPSBleHRyYV9jb3N0LT5mcFttb2RlID09IERGbW9kZV0u Zm1hOwoJfQoKICAgICAgLyogRk1TVUIsIEZOTUFERCwgYW5kIEZOTVNVQiBhcmUgZnJlZS4gICov CiAgICAgIGlmIChHRVRfQ09ERSAob3AwKSA9PSBORUcpCiAgICAgICAgb3AwID0gWEVYUCAob3Aw LCAwKTsKCiAgICAgIGlmIChHRVRfQ09ERSAob3AyKSA9PSBORUcpCiAgICAgICAgb3AyID0gWEVY UCAob3AyLCAwKTsKCiAgICAgIC8qIGFhcmNoNjRfZm5tYTRfZWx0X3RvXzY0djJkZiBoYXMgdGhl IE5FRyBhcyBvcGVyYW5kIDEsCgkgYW5kIHRoZSBieS1lbGVtZW50IG9wZXJhbmQgYXMgb3BlcmFu ZCAwLiAgKi8KICAgICAgaWYgKEdFVF9DT0RFIChvcDEpID09IE5FRykKICAgICAgICBvcDEgPSBY RVhQIChvcDEsIDApOwoKICAgICAgLyogQ2F0Y2ggdmVjdG9yLWJ5LWVsZW1lbnQgb3BlcmF0aW9u cy4gIFRoZSBieS1lbGVtZW50IG9wZXJhbmQgY2FuCgkgZWl0aGVyIGJlICh2ZWNfZHVwbGljYXRl ICh2ZWNfc2VsZWN0ICh4KSkpIG9yIGp1c3QKCSAodmVjX3NlbGVjdCAoeCkpLCBkZXBlbmRpbmcg b24gd2hldGhlciB3ZSBhcmUgbXVsdGlwbHlpbmcgYnkKCSBhIHZlY3RvciBvciBhIHNjYWxhci4K CgkgQ2Fub25pY2FsaXphdGlvbiBpcyBub3QgdmVyeSBnb29kIGluIHRoZXNlIGNhc2VzLCBGTUE0 IHdpbGwgcHV0IHRoZQoJIGJ5LWVsZW1lbnQgb3BlcmFuZCBhcyBvcGVyYW5kIDAsIEZOTUE0IHdp bGwgaGF2ZSBpdCBhcyBvcGVyYW5kIDEuICAqLwogICAgICBpZiAoR0VUX0NPREUgKG9wMCkgPT0g VkVDX0RVUExJQ0FURSkKCW9wMCA9IFhFWFAgKG9wMCwgMCk7CiAgICAgIGVsc2UgaWYgKEdFVF9D T0RFIChvcDEpID09IFZFQ19EVVBMSUNBVEUpCglvcDEgPSBYRVhQIChvcDEsIDApOwoKICAgICAg aWYgKEdFVF9DT0RFIChvcDApID09IFZFQ19TRUxFQ1QpCglvcDAgPSBYRVhQIChvcDAsIDApOwog ICAgICBlbHNlIGlmIChHRVRfQ09ERSAob3AxKSA9PSBWRUNfU0VMRUNUKQoJb3AxID0gWEVYUCAo b3AxLCAwKTsKCiAgICAgIC8qIElmIHRoZSByZW1haW5pbmcgcGFyYW1ldGVycyBhcmUgbm90IHJl Z2lzdGVycywKICAgICAgICAgZ2V0IHRoZSBjb3N0IHRvIHB1dCB0aGVtIGludG8gcmVnaXN0ZXJz LiAgKi8KICAgICAgKmNvc3QgKz0gcnR4X2Nvc3QgKG9wMCwgbW9kZSwgRk1BLCAwLCBzcGVlZCk7 CiAgICAgICpjb3N0ICs9IHJ0eF9jb3N0IChvcDEsIG1vZGUsIEZNQSwgMSwgc3BlZWQpOwogICAg ICAqY29zdCArPSBydHhfY29zdCAob3AyLCBtb2RlLCBGTUEsIDIsIHNwZWVkKTsKICAgICAgcmV0 dXJuIHRydWU7CgogICAgY2FzZSBGTE9BVDoKICAgIGNhc2UgVU5TSUdORURfRkxPQVQ6CiAgICAg IGlmIChzcGVlZCkKCSpjb3N0ICs9IGV4dHJhX2Nvc3QtPmZwW21vZGUgPT0gREZtb2RlXS5mcm9t aW50OwogICAgICByZXR1cm4gZmFsc2U7CgogICAgY2FzZSBGTE9BVF9FWFRFTkQ6CiAgICAgIGlm IChzcGVlZCkKCXsKCSAgaWYgKFZFQ1RPUl9NT0RFX1AgKG1vZGUpKQoJICAgIHsKCSAgICAgIC8q VmVjdG9yIHRydW5jYXRlLiAgKi8KCSAgICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPnZlY3QuYWx1 OwoJICAgIH0KCSAgZWxzZQoJICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPmZwW21vZGUgPT0gREZt b2RlXS53aWRlbjsKCX0KICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhc2UgRkxPQVRfVFJVTkNB VEU6CiAgICAgIGlmIChzcGVlZCkKCXsKCSAgaWYgKFZFQ1RPUl9NT0RFX1AgKG1vZGUpKQoJICAg IHsKCSAgICAgIC8qVmVjdG9yIGNvbnZlcnNpb24uICAqLwoJICAgICAgKmNvc3QgKz0gZXh0cmFf Y29zdC0+dmVjdC5hbHU7CgkgICAgfQoJICBlbHNlCgkgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+ ZnBbbW9kZSA9PSBERm1vZGVdLm5hcnJvdzsKCX0KICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNh c2UgRklYOgogICAgY2FzZSBVTlNJR05FRF9GSVg6CiAgICAgIHggPSBYRVhQICh4LCAwKTsKICAg ICAgLyogU3RyaXAgdGhlIHJvdW5kaW5nIHBhcnQuICBUaGV5IHdpbGwgYWxsIGJlIGltcGxlbWVu dGVkCiAgICAgICAgIGJ5IHRoZSBmY3Z0KiBmYW1pbHkgb2YgaW5zdHJ1Y3Rpb25zIGFueXdheS4g ICovCiAgICAgIGlmIChHRVRfQ09ERSAoeCkgPT0gVU5TUEVDKQogICAgICAgIHsKICAgICAgICAg IHVuc2lnbmVkIGludCB1bnNfY29kZSA9IFhJTlQgKHgsIDEpOwoKICAgICAgICAgIGlmICh1bnNf Y29kZSA9PSBVTlNQRUNfRlJJTlRBCiAgICAgICAgICAgICAgfHwgdW5zX2NvZGUgPT0gVU5TUEVD X0ZSSU5UTQogICAgICAgICAgICAgIHx8IHVuc19jb2RlID09IFVOU1BFQ19GUklOVE4KICAgICAg ICAgICAgICB8fCB1bnNfY29kZSA9PSBVTlNQRUNfRlJJTlRQCiAgICAgICAgICAgICAgfHwgdW5z X2NvZGUgPT0gVU5TUEVDX0ZSSU5UWikKICAgICAgICAgICAgeCA9IFhWRUNFWFAgKHgsIDAsIDAp OwogICAgICAgIH0KCiAgICAgIGlmIChzcGVlZCkKCXsKCSAgaWYgKFZFQ1RPUl9NT0RFX1AgKG1v ZGUpKQoJICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPnZlY3QuYWx1OwoJICBlbHNlCgkgICAgKmNv c3QgKz0gZXh0cmFfY29zdC0+ZnBbR0VUX01PREUgKHgpID09IERGbW9kZV0udG9pbnQ7Cgl9Cgog ICAgICAvKiBXZSBjYW4gY29tYmluZSBmbXVsIGJ5IGEgcG93ZXIgb2YgMiBmb2xsb3dlZCBieSBh IGZjdnQgaW50byBhIHNpbmdsZQoJIGZpeGVkLXBvaW50IGZjdnQuICAqLwogICAgICBpZiAoR0VU X0NPREUgKHgpID09IE1VTFQKCSAgJiYgKChWRUNUT1JfTU9ERV9QIChtb2RlKQoJICAgICAgICYm IGFhcmNoNjRfdmVjX2ZwY29uc3RfcG93X29mXzIgKFhFWFAgKHgsIDEpKSA+IDApCgkgICAgICB8 fCBhYXJjaDY0X2ZwY29uc3RfcG93X29mXzIgKFhFWFAgKHgsIDEpKSA+IDApKQoJewoJICAqY29z dCArPSBydHhfY29zdCAoWEVYUCAoeCwgMCksIFZPSURtb2RlLCAocnR4X2NvZGUpIGNvZGUsCgkJ CSAgICAgMCwgc3BlZWQpOwoJICByZXR1cm4gdHJ1ZTsKCX0KCiAgICAgICpjb3N0ICs9IHJ0eF9j b3N0ICh4LCBWT0lEbW9kZSwgKGVudW0gcnR4X2NvZGUpIGNvZGUsIDAsIHNwZWVkKTsKICAgICAg cmV0dXJuIHRydWU7CgogICAgY2FzZSBBQlM6CiAgICAgIGlmIChWRUNUT1JfTU9ERV9QIChtb2Rl KSkKCXsKCSAgLyogQUJTICh2ZWN0b3IpLiAgKi8KCSAgaWYgKHNwZWVkKQoJICAgICpjb3N0ICs9 IGV4dHJhX2Nvc3QtPnZlY3QuYWx1OwoJfQogICAgICBlbHNlIGlmIChHRVRfTU9ERV9DTEFTUyAo bW9kZSkgPT0gTU9ERV9GTE9BVCkKCXsKCSAgb3AwID0gWEVYUCAoeCwgMCk7CgoJICAvKiBGQUJE LCB3aGljaCBpcyBhbmFsb2dvdXMgdG8gRkFERC4gICovCgkgIGlmIChHRVRfQ09ERSAob3AwKSA9 PSBNSU5VUykKCSAgICB7CgkgICAgICAqY29zdCArPSBydHhfY29zdCAoWEVYUCAob3AwLCAwKSwg bW9kZSwgTUlOVVMsIDAsIHNwZWVkKTsKCSAgICAgICpjb3N0ICs9IHJ0eF9jb3N0IChYRVhQIChv cDAsIDEpLCBtb2RlLCBNSU5VUywgMSwgc3BlZWQpOwoJICAgICAgaWYgKHNwZWVkKQoJCSpjb3N0 ICs9IGV4dHJhX2Nvc3QtPmZwW21vZGUgPT0gREZtb2RlXS5hZGRzdWI7CgoJICAgICAgcmV0dXJu IHRydWU7CgkgICAgfQoJICAvKiBTaW1wbGUgRkFCUyBpcyBhbmFsb2dvdXMgdG8gRk5FRy4gICov CgkgIGlmIChzcGVlZCkKCSAgICAqY29zdCArPSBleHRyYV9jb3N0LT5mcFttb2RlID09IERGbW9k ZV0ubmVnOwoJfQogICAgICBlbHNlCgl7CgkgIC8qIEludGVnZXIgQUJTIHdpbGwgZWl0aGVyIGJl IHNwbGl0IHRvCgkgICAgIHR3byBhcml0aG1ldGljIGluc3RydWN0aW9ucywgb3Igd2lsbCBiZSBh biBBQlMKCSAgICAgKHNjYWxhciksIHdoaWNoIHdlIGRvbid0IG1vZGVsLiAgKi8KCSAgKmNvc3Qg PSBDT1NUU19OX0lOU05TICgyKTsKCSAgaWYgKHNwZWVkKQoJICAgICpjb3N0ICs9IDIgKiBleHRy YV9jb3N0LT5hbHUuYXJpdGg7Cgl9CiAgICAgIHJldHVybiBmYWxzZTsKCiAgICBjYXNlIFNNQVg6 CiAgICBjYXNlIFNNSU46CiAgICAgIGlmIChzcGVlZCkKCXsKCSAgaWYgKFZFQ1RPUl9NT0RFX1Ag KG1vZGUpKQoJICAgICpjb3N0ICs9IGV4dHJhX2Nvc3QtPnZlY3QuYWx1OwoJICBlbHNlCgkgICAg ewoJICAgICAgLyogRk1BWE5NL0ZNSU5OTS9GTUFYL0ZNSU4uCgkgICAgICAgICBUT0RPOiBUaGlz IG1heSBub3QgYmUgYWNjdXJhdGUgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMsIGJ1dAoJICAgICAg ICAgd2UgZG8gbm90IG1vZGVsIHRoaXMgaW4gdGhlIGNvc3QgdGFibGVzLiAgKi8KCSAgICAgICpj b3N0ICs9IGV4dHJhX2Nvc3QtPmZwW21vZGUgPT0gREZtb2RlXS5hZGRzdWI7CgkgICAgfQoJfQog ICAgICByZXR1cm4gZmFsc2U7CgogICAgY2FzZSBVTlNQRUM6CiAgICAgIC8qIFRoZSBmbG9hdGlu ZyBwb2ludCByb3VuZCB0byBpbnRlZ2VyIGZyaW50KiBpbnN0cnVjdGlvbnMuICAqLwogICAgICBp ZiAoYWFyY2g2NF9mcmludF91bnNwZWNfcCAoWElOVCAoeCwgMSkpKQogICAgICAgIHsKICAgICAg ICAgIGlmIChzcGVlZCkKICAgICAgICAgICAgKmNvc3QgKz0gZXh0cmFfY29zdC0+ZnBbbW9kZSA9 PSBERm1vZGVdLnJvdW5kaW50OwoKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9Cgog ICAgICBpZiAoWElOVCAoeCwgMSkgPT0gVU5TUEVDX1JCSVQpCiAgICAgICAgewogICAgICAgICAg aWYgKHNwZWVkKQogICAgICAgICAgICAqY29zdCArPSBleHRyYV9jb3N0LT5hbHUucmV2OwoKICAg ICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgVFJV TkNBVEU6CgogICAgICAvKiBEZWNvbXBvc2UgPHN1Pm11bGRpM19oaWdocGFydC4gICovCiAgICAg IGlmICgvKiAodHJ1bmNhdGU6REkgICovCgkgIG1vZGUgPT0gREltb2RlCgkgIC8qICAgKGxzaGlm dHJ0OlRJICAqLwogICAgICAgICAgJiYgR0VUX01PREUgKFhFWFAgKHgsIDApKSA9PSBUSW1vZGUK ICAgICAgICAgICYmIEdFVF9DT0RFIChYRVhQICh4LCAwKSkgPT0gTFNISUZUUlQKCSAgLyogICAg ICAobXVsdDpUSSAgKi8KICAgICAgICAgICYmIEdFVF9DT0RFIChYRVhQIChYRVhQICh4LCAwKSwg MCkpID09IE1VTFQKCSAgLyogICAgICAgIChBTllfRVhURU5EOlRJIChyZWc6REkpKQoJICAgICAg ICAgICAgKEFOWV9FWFRFTkQ6VEkgKHJlZzpESSkpKSAgKi8KICAgICAgICAgICYmICgoR0VUX0NP REUgKFhFWFAgKFhFWFAgKFhFWFAgKHgsIDApLCAwKSwgMCkpID09IFpFUk9fRVhURU5ECiAgICAg ICAgICAgICAgICYmIEdFVF9DT0RFIChYRVhQIChYRVhQIChYRVhQICh4LCAwKSwgMCksIDEpKSA9 PSBaRVJPX0VYVEVORCkKICAgICAgICAgICAgICB8fCAoR0VUX0NPREUgKFhFWFAgKFhFWFAgKFhF WFAgKHgsIDApLCAwKSwgMCkpID09IFNJR05fRVhURU5ECiAgICAgICAgICAgICAgICAgICYmIEdF VF9DT0RFIChYRVhQIChYRVhQIChYRVhQICh4LCAwKSwgMCksIDEpKSA9PSBTSUdOX0VYVEVORCkp CiAgICAgICAgICAmJiBHRVRfTU9ERSAoWEVYUCAoWEVYUCAoWEVYUCAoWEVYUCAoeCwgMCksIDAp LCAwKSwgMCkpID09IERJbW9kZQogICAgICAgICAgJiYgR0VUX01PREUgKFhFWFAgKFhFWFAgKFhF WFAgKFhFWFAgKHgsIDApLCAwKSwgMSksIDApKSA9PSBESW1vZGUKCSAgLyogICAgIChjb25zdF9p bnQgNjQpICAqLwogICAgICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKHgsIDApLCAx KSkKICAgICAgICAgICYmIFVJTlRWQUwgKFhFWFAgKFhFWFAgKHgsIDApLCAxKSkgPT0gNjQpCiAg ICAgICAgewogICAgICAgICAgLyogVU1VTEgvU01VTEguICAqLwoJICBpZiAoc3BlZWQpCgkgICAg KmNvc3QgKz0gZXh0cmFfY29zdC0+bXVsdFttb2RlID09IERJbW9kZV0uZXh0ZW5kOwoJICAqY29z dCArPSBydHhfY29zdCAoWEVYUCAoWEVYUCAoWEVYUCAoWEVYUCAoeCwgMCksIDApLCAwKSwgMCks CgkJCSAgICAgbW9kZSwgTVVMVCwgMCwgc3BlZWQpOwoJICAqY29zdCArPSBydHhfY29zdCAoWEVY UCAoWEVYUCAoWEVYUCAoWEVYUCAoeCwgMCksIDApLCAxKSwgMCksCgkJCSAgICAgbW9kZSwgTVVM VCwgMSwgc3BlZWQpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoJYnJlYWs7CiAg ICBjYXNlIENPTlNUX1ZFQ1RPUjoKCXsKCSAgLyogTG9hZCB1c2luZyBNT1ZJL01WTkkuICAqLwoJ ICBpZiAoYWFyY2g2NF9zaW1kX3ZhbGlkX2ltbWVkaWF0ZSAoeCwgTlVMTCkpCgkgICAgKmNvc3Qg PSBleHRyYV9jb3N0LT52ZWN0Lm1vdmk7CgkgIGVsc2UgLyogTG9hZCB1c2luZyBjb25zdGFudCBw b29sLiAgKi8KCSAgICAqY29zdCA9IGV4dHJhX2Nvc3QtPmxkc3QubG9hZDsKCSAgYnJlYWs7Cgl9 CiAgICBjYXNlIFZFQ19DT05DQVQ6CgkvKiBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdGlvbiwgZWl0 aGVyIERVUCBvciBJTlMuCgkgICBGb3Igbm93LCBrZWVwIGRlZmF1bHQgY29zdGluZy4gICovCgli cmVhazsKICAgIGNhc2UgVkVDX0RVUExJQ0FURToKCS8qIExvYWQgdXNpbmcgYSBEVVAuICAqLwoJ KmNvc3QgPSBleHRyYV9jb3N0LT52ZWN0LmR1cDsKCXJldHVybiBmYWxzZTsKICAgIGNhc2UgVkVD X1NFTEVDVDoKCXsKCSAgcnR4IG9wMCA9IFhFWFAgKHgsIDApOwoJICAqY29zdCA9IHJ0eF9jb3N0 IChvcDAsIEdFVF9NT0RFIChvcDApLCBWRUNfU0VMRUNULCAwLCBzcGVlZCk7CgoJICAvKiBjb3N0 IHN1YnJlZyBvZiAwIGFzIGZyZWUsIG90aGVyd2lzZSBhcyBEVVAgKi8KCSAgcnR4IG9wMSA9IFhF WFAgKHgsIDEpOwoJICBpZiAodmVjX3Nlcmllc19sb3dwYXJ0X3AgKG1vZGUsIEdFVF9NT0RFIChv cDEpLCBvcDEpKQoJICAgIDsKCSAgZWxzZSBpZiAodmVjX3Nlcmllc19oaWdocGFydF9wIChtb2Rl LCBHRVRfTU9ERSAob3AxKSwgb3AxKSkKCSAgICAqY29zdCA9IGV4dHJhX2Nvc3QtPnZlY3QuZHVw OwoJICBlbHNlCgkgICAgKmNvc3QgPSBleHRyYV9jb3N0LT52ZWN0LmV4dHJhY3Q7CgkgIHJldHVy biB0cnVlOwoJfQogICAgZGVmYXVsdDoKICAgICAgYnJlYWs7CiAgICB9CgogIGlmIChkdW1wX2Zp bGUKICAgICAgJiYgZmxhZ19hYXJjaDY0X3ZlcmJvc2VfY29zdCkKICAgIGZwcmludGYgKGR1bXBf ZmlsZSwKICAgICAgIlxuRmFpbGVkIHRvIGNvc3QgUlRYLiAgQXNzdW1pbmcgZGVmYXVsdCBjb3N0 LlxuIik7CgogIHJldHVybiB0cnVlOwp9CgovKiBXcmFwcGVyIGFyb3VuZCBhYXJjaDY0X3J0eF9j b3N0cywgZHVtcHMgdGhlIHBhcnRpYWwsIG9yIHRvdGFsIGNvc3QKICAgY2FsY3VsYXRlZCBmb3Ig WC4gIFRoaXMgY29zdCBpcyBzdG9yZWQgaW4gKkNPU1QuICBSZXR1cm5zIHRydWUKICAgaWYgdGhl IHRvdGFsIGNvc3Qgb2YgWCB3YXMgY2FsY3VsYXRlZC4gICovCnN0YXRpYyBib29sCmFhcmNoNjRf cnR4X2Nvc3RzX3dyYXBwZXIgKHJ0eCB4LCBtYWNoaW5lX21vZGUgbW9kZSwgaW50IG91dGVyLAoJ CSAgIGludCBwYXJhbSwgaW50ICpjb3N0LCBib29sIHNwZWVkKQp7CiAgYm9vbCByZXN1bHQgPSBh YXJjaDY0X3J0eF9jb3N0cyAoeCwgbW9kZSwgb3V0ZXIsIHBhcmFtLCBjb3N0LCBzcGVlZCk7Cgog IGlmIChkdW1wX2ZpbGUKICAgICAgJiYgZmxhZ19hYXJjaDY0X3ZlcmJvc2VfY29zdCkKICAgIHsK ICAgICAgcHJpbnRfcnRsX3NpbmdsZSAoZHVtcF9maWxlLCB4KTsKICAgICAgZnByaW50ZiAoZHVt cF9maWxlLCAiXG4lcyBjb3N0OiAlZCAoJXMpXG4iLAoJICAgICAgIHNwZWVkID8gIkhvdCIgOiAi Q29sZCIsCgkgICAgICAgKmNvc3QsIHJlc3VsdCA/ICJmaW5hbCIgOiAicGFydGlhbCIpOwogICAg fQoKICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgaW50CmFhcmNoNjRfcmVnaXN0ZXJfbW92ZV9j b3N0IChtYWNoaW5lX21vZGUgbW9kZSwKCQkJICAgIHJlZ19jbGFzc190IGZyb21faSwgcmVnX2Ns YXNzX3QgdG9faSkKewogIGVudW0gcmVnX2NsYXNzIGZyb20gPSAoZW51bSByZWdfY2xhc3MpIGZy b21faTsKICBlbnVtIHJlZ19jbGFzcyB0byA9IChlbnVtIHJlZ19jbGFzcykgdG9faTsKICBjb25z dCBzdHJ1Y3QgY3B1X3JlZ21vdmVfY29zdCAqcmVnbW92ZV9jb3N0CiAgICA9IGFhcmNoNjRfdHVu ZV9wYXJhbXMucmVnbW92ZV9jb3N0OwoKICAvKiBDYWxsZXIgc2F2ZSBhbmQgcG9pbnRlciByZWdz IGFyZSBlcXVpdmFsZW50IHRvIEdFTkVSQUxfUkVHUy4gICovCiAgaWYgKHRvID09IFRBSUxDQUxM X0FERFJfUkVHUyB8fCB0byA9PSBQT0lOVEVSX1JFR1MKICAgICAgfHwgdG8gPT0gU1RVQl9SRUdT KQogICAgdG8gPSBHRU5FUkFMX1JFR1M7CgogIGlmIChmcm9tID09IFRBSUxDQUxMX0FERFJfUkVH UyB8fCBmcm9tID09IFBPSU5URVJfUkVHUwogICAgICB8fCBmcm9tID09IFNUVUJfUkVHUykKICAg IGZyb20gPSBHRU5FUkFMX1JFR1M7CgogIC8qIE1ha2UgUkRGRlIgdmVyeSBleHBlbnNpdmUuICBJ biBwYXJ0aWN1bGFyLCBpZiB3ZSBrbm93IHRoYXQgdGhlIEZGUgogICAgIGNvbnRhaW5zIGEgUFRS VUUgKGUuZy4gYWZ0ZXIgYSBTRVRGRlIpLCB3ZSBtdXN0IG5ldmVyIHVzZSBSREZGUgogICAgIGFz IGEgd2F5IG9mIG9idGFpbmluZyBhIFBUUlVFLiAgKi8KICBpZiAoR0VUX01PREVfQ0xBU1MgKG1v ZGUpID09IE1PREVfVkVDVE9SX0JPT0wKICAgICAgJiYgaGFyZF9yZWdfc2V0X3N1YnNldF9wIChy ZWdfY2xhc3NfY29udGVudHNbZnJvbV9pXSwKCQkJCXJlZ19jbGFzc19jb250ZW50c1tGRlJfUkVH U10pKQogICAgcmV0dXJuIDgwOwoKICAvKiBNb3ZpbmcgYmV0d2VlbiBHUFIgYW5kIHN0YWNrIGNv c3QgaXMgdGhlIHNhbWUgYXMgR1AyR1AuICAqLwogIGlmICgoZnJvbSA9PSBHRU5FUkFMX1JFR1Mg JiYgdG8gPT0gU1RBQ0tfUkVHKQogICAgICB8fCAodG8gPT0gR0VORVJBTF9SRUdTICYmIGZyb20g PT0gU1RBQ0tfUkVHKSkKICAgIHJldHVybiByZWdtb3ZlX2Nvc3QtPkdQMkdQOwoKICAvKiBUby9G cm9tIHRoZSBzdGFjayByZWdpc3Rlciwgd2UgbW92ZSB2aWEgdGhlIGdwcnMuICAqLwogIGlmICh0 byA9PSBTVEFDS19SRUcgfHwgZnJvbSA9PSBTVEFDS19SRUcpCiAgICByZXR1cm4gYWFyY2g2NF9y ZWdpc3Rlcl9tb3ZlX2Nvc3QgKG1vZGUsIGZyb20sIEdFTkVSQUxfUkVHUykKICAgICAgICAgICAg KyBhYXJjaDY0X3JlZ2lzdGVyX21vdmVfY29zdCAobW9kZSwgR0VORVJBTF9SRUdTLCB0byk7Cgog IHVuc2lnbmVkIGludCB2ZWNfZmxhZ3MgPSBhYXJjaDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlICht b2RlKTsKICBpZiAodmVjX2ZsYWdzICE9IChWRUNfQURWU0lNRCB8IFZFQ19TVFJVQ1QgfCBWRUNf UEFSVElBTCkKICAgICAgJiYga25vd25fZXEgKEdFVF9NT0RFX1NJWkUgKG1vZGUpLCAxNikpCiAg ICB7CiAgICAgIC8qIDEyOC1iaXQgb3BlcmF0aW9ucyBvbiBnZW5lcmFsIHJlZ2lzdGVycyByZXF1 aXJlIDIgaW5zdHJ1Y3Rpb25zLiAgKi8KICAgICAgaWYgKGZyb20gPT0gR0VORVJBTF9SRUdTICYm IHRvID09IEdFTkVSQUxfUkVHUykKCXJldHVybiByZWdtb3ZlX2Nvc3QtPkdQMkdQICogMjsKICAg ICAgZWxzZSBpZiAoZnJvbSA9PSBHRU5FUkFMX1JFR1MpCglyZXR1cm4gcmVnbW92ZV9jb3N0LT5H UDJGUCAqIDI7CiAgICAgIGVsc2UgaWYgKHRvID09IEdFTkVSQUxfUkVHUykKCXJldHVybiByZWdt b3ZlX2Nvc3QtPkZQMkdQICogMjsKCiAgICAgIC8qIFdoZW4gQWR2U0lNRCBpbnN0cnVjdGlvbnMg YXJlIGRpc2FibGVkIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb3ZlCgkgYSAxMjgtYml0IHZhbHVl IGRpcmVjdGx5IGJldHdlZW4gUSByZWdpc3RlcnMuICBUaGlzIGlzIGhhbmRsZWQgaW4KCSBzZWNv bmRhcnkgcmVsb2FkLiAgQSBnZW5lcmFsIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYSBzY3JhdGNoIHRv IG1vdmUKCSB0aGUgdXBwZXIgREkgdmFsdWUgYW5kIHRoZSBsb3dlciBESSB2YWx1ZSBpcyBtb3Zl ZCBkaXJlY3RseSwKCSBoZW5jZSB0aGUgY29zdCBpcyB0aGUgc3VtIG9mIHRocmVlIG1vdmVzLiAq LwogICAgICBpZiAoISBUQVJHRVRfU0lNRCkKCXJldHVybiByZWdtb3ZlX2Nvc3QtPkdQMkZQICsg cmVnbW92ZV9jb3N0LT5GUDJHUCArIHJlZ21vdmVfY29zdC0+RlAyRlA7CgogICAgICByZXR1cm4g cmVnbW92ZV9jb3N0LT5GUDJGUDsKICAgIH0KCiAgaWYgKGZyb20gPT0gR0VORVJBTF9SRUdTICYm IHRvID09IEdFTkVSQUxfUkVHUykKICAgIHJldHVybiByZWdtb3ZlX2Nvc3QtPkdQMkdQOwogIGVs c2UgaWYgKGZyb20gPT0gR0VORVJBTF9SRUdTKQogICAgcmV0dXJuIHJlZ21vdmVfY29zdC0+R1Ay RlA7CiAgZWxzZSBpZiAodG8gPT0gR0VORVJBTF9SRUdTKQogICAgcmV0dXJuIHJlZ21vdmVfY29z dC0+RlAyR1A7CgogIGlmICghVEFSR0VUX1NJTUQgJiYgdmVjX2ZsYWdzID09IChWRUNfQURWU0lN RCB8IFZFQ19TVFJVQ1QpKQogICAgewogICAgICAvKiBOZWVkcyBhIHJvdW5kLXRyaXAgdGhyb3Vn aCBtZW1vcnksIHdoaWNoIGNhbiB1c2UgTERQL1NUUCBmb3IgcGFpcnMuCgkgVGhlIGNvc3QgbXVz dCBiZSBncmVhdGVyIHRoYW4gMiB1bml0cyB0byBpbmRpY2F0ZSB0aGF0IGRpcmVjdAoJIG1vdmVz IGFyZW4ndCBwb3NzaWJsZS4gICovCiAgICAgIGF1dG8gcGVyX3ZlY3RvciA9IChhYXJjaDY0X3R1 bmVfcGFyYW1zLm1lbW1vdl9jb3N0LmxvYWRfZnAKCQkJICsgYWFyY2g2NF90dW5lX3BhcmFtcy5t ZW1tb3ZfY29zdC5zdG9yZV9mcCk7CiAgICAgIHJldHVybiBNSU4gKENFSUwgKHBlcl92ZWN0b3Is IDIpLCA0KTsKICAgIH0KCiAgcmV0dXJuIHJlZ21vdmVfY29zdC0+RlAyRlA7Cn0KCi8qIEltcGxl bWVudHMgVEFSR0VUX01FTU9SWV9NT1ZFX0NPU1QuICAqLwpzdGF0aWMgaW50CmFhcmNoNjRfbWVt b3J5X21vdmVfY29zdCAobWFjaGluZV9tb2RlIG1vZGUsIHJlZ19jbGFzc190IHJjbGFzc19pLCBi b29sIGluKQp7CiAgZW51bSByZWdfY2xhc3MgcmNsYXNzID0gKGVudW0gcmVnX2NsYXNzKSByY2xh c3NfaTsKICBpZiAoR0VUX01PREVfQ0xBU1MgKG1vZGUpID09IE1PREVfVkVDVE9SX0JPT0wKICAg ICAgPyByZWdfY2xhc3Nlc19pbnRlcnNlY3RfcCAocmNsYXNzLCBQUl9SRUdTKQogICAgICA6IHJl Z19jbGFzc19zdWJzZXRfcCAocmNsYXNzLCBQUl9SRUdTKSkKICAgIHJldHVybiAoaW4KCSAgICA/ IGFhcmNoNjRfdHVuZV9wYXJhbXMubWVtbW92X2Nvc3QubG9hZF9wcmVkCgkgICAgOiBhYXJjaDY0 X3R1bmVfcGFyYW1zLm1lbW1vdl9jb3N0LnN0b3JlX3ByZWQpOwoKICBpZiAoVkVDVE9SX01PREVf UCAobW9kZSkgfHwgRkxPQVRfTU9ERV9QIChtb2RlKQogICAgICA/IHJlZ19jbGFzc2VzX2ludGVy c2VjdF9wIChyY2xhc3MsIEZQX1JFR1MpCiAgICAgIDogcmVnX2NsYXNzX3N1YnNldF9wIChyY2xh c3MsIEZQX1JFR1MpKQogICAgcmV0dXJuIChpbgoJICAgID8gYWFyY2g2NF90dW5lX3BhcmFtcy5t ZW1tb3ZfY29zdC5sb2FkX2ZwCgkgICAgOiBhYXJjaDY0X3R1bmVfcGFyYW1zLm1lbW1vdl9jb3N0 LnN0b3JlX2ZwKTsKCiAgcmV0dXJuIChpbgoJICA/IGFhcmNoNjRfdHVuZV9wYXJhbXMubWVtbW92 X2Nvc3QubG9hZF9pbnQKCSAgOiBhYXJjaDY0X3R1bmVfcGFyYW1zLm1lbW1vdl9jb3N0LnN0b3Jl X2ludCk7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfSU5JVF9CVUlMVElOUy4gICovCnN0YXRpYyB2 b2lkCmFhcmNoNjRfaW5pdF9idWlsdGlucyAoKQp7CiAgYWFyY2g2NF9nZW5lcmFsX2luaXRfYnVp bHRpbnMgKCk7CiAgYWFyY2g2NF9zdmU6OmluaXRfYnVpbHRpbnMgKCk7CiNpZmRlZiBTVUJUQVJH RVRfSU5JVF9CVUlMVElOUwogIFNVQlRBUkdFVF9JTklUX0JVSUxUSU5TOwojZW5kaWYKfQoKLyog SW1wbGVtZW50IFRBUkdFVF9GT0xEX0JVSUxUSU4uICAqLwpzdGF0aWMgdHJlZQphYXJjaDY0X2Zv bGRfYnVpbHRpbiAodHJlZSBmbmRlY2wsIGludCBuYXJncywgdHJlZSAqYXJncywgYm9vbCkKewog IHVuc2lnbmVkIGludCBjb2RlID0gREVDTF9NRF9GVU5DVElPTl9DT0RFIChmbmRlY2wpOwogIHVu c2lnbmVkIGludCBzdWJjb2RlID0gY29kZSA+PiBBQVJDSDY0X0JVSUxUSU5fU0hJRlQ7CiAgdHJl ZSB0eXBlID0gVFJFRV9UWVBFIChUUkVFX1RZUEUgKGZuZGVjbCkpOwogIHN3aXRjaCAoY29kZSAm IEFBUkNINjRfQlVJTFRJTl9DTEFTUykKICAgIHsKICAgIGNhc2UgQUFSQ0g2NF9CVUlMVElOX0dF TkVSQUw6CiAgICAgIHJldHVybiBhYXJjaDY0X2dlbmVyYWxfZm9sZF9idWlsdGluIChzdWJjb2Rl LCB0eXBlLCBuYXJncywgYXJncyk7CgogICAgY2FzZSBBQVJDSDY0X0JVSUxUSU5fU1ZFOgogICAg ICByZXR1cm4gTlVMTF9UUkVFOwogICAgfQogIGdjY191bnJlYWNoYWJsZSAoKTsKfQoKLyogSW1w bGVtZW50IFRBUkdFVF9HSU1QTEVfRk9MRF9CVUlMVElOLiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2 NF9naW1wbGVfZm9sZF9idWlsdGluIChnaW1wbGVfc3RtdF9pdGVyYXRvciAqZ3NpKQp7CiAgZ2Nh bGwgKnN0bXQgPSBhc19hIDxnY2FsbCAqPiAoZ3NpX3N0bXQgKCpnc2kpKTsKICB0cmVlIGZuZGVj bCA9IGdpbXBsZV9jYWxsX2ZuZGVjbCAoc3RtdCk7CiAgdW5zaWduZWQgaW50IGNvZGUgPSBERUNM X01EX0ZVTkNUSU9OX0NPREUgKGZuZGVjbCk7CiAgdW5zaWduZWQgaW50IHN1YmNvZGUgPSBjb2Rl ID4+IEFBUkNINjRfQlVJTFRJTl9TSElGVDsKICBnaW1wbGUgKm5ld19zdG10ID0gTlVMTDsKICBz d2l0Y2ggKGNvZGUgJiBBQVJDSDY0X0JVSUxUSU5fQ0xBU1MpCiAgICB7CiAgICBjYXNlIEFBUkNI NjRfQlVJTFRJTl9HRU5FUkFMOgogICAgICBuZXdfc3RtdCA9IGFhcmNoNjRfZ2VuZXJhbF9naW1w bGVfZm9sZF9idWlsdGluIChzdWJjb2RlLCBzdG10LCBnc2kpOwogICAgICBicmVhazsKCiAgICBj YXNlIEFBUkNINjRfQlVJTFRJTl9TVkU6CiAgICAgIG5ld19zdG10ID0gYWFyY2g2NF9zdmU6Omdp bXBsZV9mb2xkX2J1aWx0aW4gKHN1YmNvZGUsIGdzaSwgc3RtdCk7CiAgICAgIGJyZWFrOwogICAg fQoKICBpZiAoIW5ld19zdG10KQogICAgcmV0dXJuIGZhbHNlOwoKICBnc2lfcmVwbGFjZSAoZ3Np LCBuZXdfc3RtdCwgZmFsc2UpOwogIHJldHVybiB0cnVlOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VU X0VYUEFORF9CVUlMVElOLiAgKi8Kc3RhdGljIHJ0eAphYXJjaDY0X2V4cGFuZF9idWlsdGluICh0 cmVlIGV4cCwgcnR4IHRhcmdldCwgcnR4LCBtYWNoaW5lX21vZGUsIGludCBpZ25vcmUpCnsKICB0 cmVlIGZuZGVjbCA9IFRSRUVfT1BFUkFORCAoQ0FMTF9FWFBSX0ZOIChleHApLCAwKTsKICB1bnNp Z25lZCBpbnQgY29kZSA9IERFQ0xfTURfRlVOQ1RJT05fQ09ERSAoZm5kZWNsKTsKICB1bnNpZ25l ZCBpbnQgc3ViY29kZSA9IGNvZGUgPj4gQUFSQ0g2NF9CVUlMVElOX1NISUZUOwogIHN3aXRjaCAo Y29kZSAmIEFBUkNINjRfQlVJTFRJTl9DTEFTUykKICAgIHsKICAgIGNhc2UgQUFSQ0g2NF9CVUlM VElOX0dFTkVSQUw6CiAgICAgIHJldHVybiBhYXJjaDY0X2dlbmVyYWxfZXhwYW5kX2J1aWx0aW4g KHN1YmNvZGUsIGV4cCwgdGFyZ2V0LCBpZ25vcmUpOwoKICAgIGNhc2UgQUFSQ0g2NF9CVUlMVElO X1NWRToKICAgICAgcmV0dXJuIGFhcmNoNjRfc3ZlOjpleHBhbmRfYnVpbHRpbiAoc3ViY29kZSwg ZXhwLCB0YXJnZXQpOwogICAgfQogIGdjY191bnJlYWNoYWJsZSAoKTsKfQoKLyogSW1wbGVtZW50 IFRBUkdFVF9CVUlMVElOX0RFQ0wuICAqLwpzdGF0aWMgdHJlZQphYXJjaDY0X2J1aWx0aW5fZGVj bCAodW5zaWduZWQgaW50IGNvZGUsIGJvb2wgaW5pdGlhbGl6ZV9wKQp7CiAgdW5zaWduZWQgaW50 IHN1YmNvZGUgPSBjb2RlID4+IEFBUkNINjRfQlVJTFRJTl9TSElGVDsKICBzd2l0Y2ggKGNvZGUg JiBBQVJDSDY0X0JVSUxUSU5fQ0xBU1MpCiAgICB7CiAgICBjYXNlIEFBUkNINjRfQlVJTFRJTl9H RU5FUkFMOgogICAgICByZXR1cm4gYWFyY2g2NF9nZW5lcmFsX2J1aWx0aW5fZGVjbCAoc3ViY29k ZSwgaW5pdGlhbGl6ZV9wKTsKCiAgICBjYXNlIEFBUkNINjRfQlVJTFRJTl9TVkU6CiAgICAgIHJl dHVybiBhYXJjaDY0X3N2ZTo6YnVpbHRpbl9kZWNsIChzdWJjb2RlLCBpbml0aWFsaXplX3ApOwog ICAgfQogIGdjY191bnJlYWNoYWJsZSAoKTsKfQoKLyogUmV0dXJuIHRydWUgaWYgaXQgaXMgc2Fm ZSBhbmQgYmVuZWZpY2lhbCB0byB1c2UgdGhlIGFwcHJveGltYXRlIHJzcXJ0IG9wdGFicwogICB0 byBvcHRpbWl6ZSAxLjAvc3FydC4gICovCgpzdGF0aWMgYm9vbAp1c2VfcnNxcnRfcCAobWFjaGlu ZV9tb2RlIG1vZGUpCnsKICByZXR1cm4gKCFmbGFnX3RyYXBwaW5nX21hdGgKCSAgJiYgZmxhZ191 bnNhZmVfbWF0aF9vcHRpbWl6YXRpb25zCgkgICYmICgoYWFyY2g2NF90dW5lX3BhcmFtcy5hcHBy b3hfbW9kZXMtPnJlY2lwX3NxcnQKCSAgICAgICAmIEFBUkNINjRfQVBQUk9YX01PREUgKG1vZGUp KQoJICAgICAgfHwgZmxhZ19tcmVjaXBfbG93X3ByZWNpc2lvbl9zcXJ0KSk7Cn0KCi8qIEZ1bmN0 aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHVzZSB0aGUgYXBwcm94aW1hdGUgcmVjaXByb2NhbCBzcXVh cmUgcm9vdAogICBidWlsdGluLiAgKi8KCnN0YXRpYyB0cmVlCmFhcmNoNjRfYnVpbHRpbl9yZWNp cHJvY2FsICh0cmVlIGZuZGVjbCkKewogIG1hY2hpbmVfbW9kZSBtb2RlID0gVFlQRV9NT0RFIChU UkVFX1RZUEUgKGZuZGVjbCkpOwoKICBpZiAoIXVzZV9yc3FydF9wIChtb2RlKSkKICAgIHJldHVy biBOVUxMX1RSRUU7CiAgdW5zaWduZWQgaW50IGNvZGUgPSBERUNMX01EX0ZVTkNUSU9OX0NPREUg KGZuZGVjbCk7CiAgdW5zaWduZWQgaW50IHN1YmNvZGUgPSBjb2RlID4+IEFBUkNINjRfQlVJTFRJ Tl9TSElGVDsKICBzd2l0Y2ggKGNvZGUgJiBBQVJDSDY0X0JVSUxUSU5fQ0xBU1MpCiAgICB7CiAg ICBjYXNlIEFBUkNINjRfQlVJTFRJTl9HRU5FUkFMOgogICAgICByZXR1cm4gYWFyY2g2NF9nZW5l cmFsX2J1aWx0aW5fcnNxcnQgKHN1YmNvZGUpOwoKICAgIGNhc2UgQUFSQ0g2NF9CVUlMVElOX1NW RToKICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0KICBnY2NfdW5yZWFjaGFibGUgKCk7Cn0K Ci8qIEVtaXQgY29kZSB0byBwZXJmb3JtIHRoZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb246Cgog ICAgIERTVCA9IFNSQzEgKiBTUkMyCgogICB3aGVyZSBhbGwgdGhyZWUgb3BlcmFuZHMgYXJlIGFs cmVhZHkga25vd24gdG8gYmUgcmVnaXN0ZXJzLgogICBJZiB0aGUgb3BlcmF0aW9uIGlzIGFuIFNW RSBvbmUsIFBUUlVFIGlzIGEgc3VpdGFibGUgYWxsLXRydWUKICAgcHJlZGljYXRlLiAgKi8KCnN0 YXRpYyB2b2lkCmFhcmNoNjRfZW1pdF9tdWx0IChydHggZHN0LCBydHggcHRydWUsIHJ0eCBzcmMx LCBydHggc3JjMikKewogIGlmIChwdHJ1ZSkKICAgIGVtaXRfaW5zbiAoZ2VuX2FhcmNoNjRfcHJl ZCAoVU5TUEVDX0NPTkRfRk1VTCwgR0VUX01PREUgKGRzdCksCgkJCQkgZHN0LCBwdHJ1ZSwgc3Jj MSwgc3JjMiwKCQkJCSBnZW5faW50X21vZGUgKFNWRV9SRUxBWEVEX0dQLCBTSW1vZGUpKSk7CiAg ZWxzZQogICAgZW1pdF9zZXRfaW5zbiAoZHN0LCBnZW5fcnR4X01VTFQgKEdFVF9NT0RFIChkc3Qp LCBzcmMxLCBzcmMyKSk7Cn0KCi8qIEVtaXQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdG8gY29tcHV0 ZSBlaXRoZXIgdGhlIGFwcHJveGltYXRlIHNxdWFyZSByb290CiAgIG9yIGl0cyBhcHByb3hpbWF0 ZSByZWNpcHJvY2FsLCBkZXBlbmRpbmcgb24gdGhlIGZsYWcgUkVDUCwgYW5kIHJldHVybgogICB3 aGV0aGVyIHRoZSBzZXF1ZW5jZSB3YXMgZW1pdHRlZCBvciBub3QuICAqLwoKYm9vbAphYXJjaDY0 X2VtaXRfYXBwcm94X3NxcnQgKHJ0eCBkc3QsIHJ0eCBzcmMsIGJvb2wgcmVjcCkKewogIG1hY2hp bmVfbW9kZSBtb2RlID0gR0VUX01PREUgKGRzdCk7CgogIGlmIChHRVRfTU9ERV9JTk5FUiAobW9k ZSkgPT0gSEZtb2RlKQogICAgewogICAgICBnY2NfYXNzZXJ0ICghcmVjcCk7CiAgICAgIHJldHVy biBmYWxzZTsKICAgIH0KCiAgaWYgKCFyZWNwKQogICAgewogICAgICBpZiAoIShmbGFnX21sb3df cHJlY2lzaW9uX3NxcnQKCSAgICB8fCAoYWFyY2g2NF90dW5lX3BhcmFtcy5hcHByb3hfbW9kZXMt PnNxcnQKCQkmIEFBUkNINjRfQVBQUk9YX01PREUgKG1vZGUpKSkpCglyZXR1cm4gZmFsc2U7Cgog ICAgICBpZiAoIWZsYWdfZmluaXRlX21hdGhfb25seQoJICB8fCBmbGFnX3RyYXBwaW5nX21hdGgK CSAgfHwgIWZsYWdfdW5zYWZlX21hdGhfb3B0aW1pemF0aW9ucwoJICB8fCBvcHRpbWl6ZV9mdW5j dGlvbl9mb3Jfc2l6ZV9wIChjZnVuKSkKCXJldHVybiBmYWxzZTsKICAgIH0KICBlbHNlCiAgICAv KiBDYWxsZXIgYXNzdW1lcyB3ZSBjYW5ub3QgZmFpbC4gICovCiAgICBnY2NfYXNzZXJ0ICh1c2Vf cnNxcnRfcCAobW9kZSkpOwoKICBydHggcGcgPSBOVUxMX1JUWDsKICBpZiAoYWFyY2g2NF9zdmVf bW9kZV9wIChtb2RlKSkKICAgIHBnID0gYWFyY2g2NF9wdHJ1ZV9yZWcgKGFhcmNoNjRfc3ZlX3By ZWRfbW9kZSAobW9kZSkpOwogIG1hY2hpbmVfbW9kZSBtbXNrID0gKFZFQ1RPUl9NT0RFX1AgKG1v ZGUpCgkJICAgICAgID8gcmVsYXRlZF9pbnRfdmVjdG9yX21vZGUgKG1vZGUpLnJlcXVpcmUgKCkK CQkgICAgICAgOiBpbnRfbW9kZV9mb3JfbW9kZSAobW9kZSkucmVxdWlyZSAoKSk7CiAgcnR4IHht c2sgPSBOVUxMX1JUWDsKICBpZiAoIXJlY3ApCiAgICB7CiAgICAgIC8qIFdoZW4gY2FsY3VsYXRp bmcgdGhlIGFwcHJveGltYXRlIHNxdWFyZSByb290LCBjb21wYXJlIHRoZQoJIGFyZ3VtZW50IHdp dGggMC4wIGFuZCBjcmVhdGUgYSBtYXNrLiAgKi8KICAgICAgcnR4IHplcm8gPSBDT05TVDBfUlRY IChtb2RlKTsKICAgICAgaWYgKHBnKQoJewoJICB4bXNrID0gZ2VuX3JlZ19ydHggKEdFVF9NT0RF IChwZykpOwoJICBydHggaGludCA9IGdlbl9pbnRfbW9kZSAoU1ZFX0tOT1dOX1BUUlVFLCBTSW1v ZGUpOwoJICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X3ByZWRfZmNtIChVTlNQRUNfQ09ORF9GQ01O RSwgbW9kZSwKCQkJCQkgICB4bXNrLCBwZywgaGludCwgc3JjLCB6ZXJvKSk7Cgl9CiAgICAgIGVs c2UKCXsKCSAgeG1zayA9IGdlbl9yZWdfcnR4IChtbXNrKTsKCSAgZW1pdF9pbnNuIChnZW5fcnR4 X1NFVCAoeG1zaywKCQkJCSAgZ2VuX3J0eF9ORUcgKG1tc2ssCgkJCQkJICAgICAgIGdlbl9ydHhf RVEgKG1tc2ssIHNyYywgemVybykpKSk7Cgl9CiAgICB9CgogIC8qIEVzdGltYXRlIHRoZSBhcHBy b3hpbWF0ZSByZWNpcHJvY2FsIHNxdWFyZSByb290LiAgKi8KICBydHggeGRzdCA9IGdlbl9yZWdf cnR4IChtb2RlKTsKICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X3JzcXJ0ZSAobW9kZSwgeGRzdCwg c3JjKSk7CgogIC8qIEl0ZXJhdGUgb3ZlciB0aGUgc2VyaWVzIHR3aWNlIGZvciBTRiBhbmQgdGhy aWNlIGZvciBERi4gICovCiAgaW50IGl0ZXJhdGlvbnMgPSAoR0VUX01PREVfSU5ORVIgKG1vZGUp ID09IERGbW9kZSkgPyAzIDogMjsKCiAgLyogT3B0aW9uYWxseSBpdGVyYXRlIG92ZXIgdGhlIHNl cmllcyBvbmNlIGxlc3MgZm9yIGZhc3RlciBwZXJmb3JtYW5jZQogICAgIHdoaWxlIHNhY3JpZmlj aW5nIHRoZSBhY2N1cmFjeS4gICovCiAgaWYgKChyZWNwICYmIGZsYWdfbXJlY2lwX2xvd19wcmVj aXNpb25fc3FydCkKICAgICAgfHwgKCFyZWNwICYmIGZsYWdfbWxvd19wcmVjaXNpb25fc3FydCkp CiAgICBpdGVyYXRpb25zLS07CgogIC8qIEl0ZXJhdGUgb3ZlciB0aGUgc2VyaWVzIHRvIGNhbGN1 bGF0ZSB0aGUgYXBwcm94aW1hdGUgcmVjaXByb2NhbCBzcXVhcmUKICAgICByb290LiAgKi8KICBy dHggeDEgPSBnZW5fcmVnX3J0eCAobW9kZSk7CiAgd2hpbGUgKGl0ZXJhdGlvbnMtLSkKICAgIHsK ICAgICAgcnR4IHgyID0gZ2VuX3JlZ19ydHggKG1vZGUpOwogICAgICBhYXJjaDY0X2VtaXRfbXVs dCAoeDIsIHBnLCB4ZHN0LCB4ZHN0KTsKCiAgICAgIGVtaXRfaW5zbiAoZ2VuX2FhcmNoNjRfcnNx cnRzIChtb2RlLCB4MSwgc3JjLCB4MikpOwoKICAgICAgaWYgKGl0ZXJhdGlvbnMgPiAwKQoJYWFy Y2g2NF9lbWl0X211bHQgKHhkc3QsIHBnLCB4ZHN0LCB4MSk7CiAgICB9CgogIGlmICghcmVjcCkK ICAgIHsKICAgICAgaWYgKHBnKQoJLyogTXVsdGlwbHkgbm9uemVybyBzb3VyY2UgdmFsdWVzIGJ5 IHRoZSBjb3JyZXNwb25kaW5nIGludGVybWVkaWF0ZQoJICAgcmVzdWx0IGVsZW1lbnRzLCBzbyB0 aGF0IHRoZSBmaW5hbCBjYWxjdWxhdGlvbiBpcyB0aGUgYXBwcm94aW1hdGUKCSAgIHNxdWFyZSBy b290IHJhdGhlciB0aGFuIGl0cyByZWNpcHJvY2FsLiAgU2VsZWN0IGEgemVybyByZXN1bHQgZm9y CgkgICB6ZXJvIHNvdXJjZSB2YWx1ZXMsIHRvIGF2b2lkIHRoZSBJbmYgKiAwIC0+IE5hTiB0aGF0 IHdlJ2QgZ2V0CgkgICBvdGhlcndpc2UuICAqLwoJZW1pdF9pbnNuIChnZW5fY29uZCAoVU5TUEVD X0NPTkRfRk1VTCwgbW9kZSwKCQkJICAgICB4ZHN0LCB4bXNrLCB4ZHN0LCBzcmMsIENPTlNUMF9S VFggKG1vZGUpKSk7CiAgICAgIGVsc2UKCXsKCSAgLyogUXVhbGlmeSB0aGUgYXBwcm94aW1hdGUg cmVjaXByb2NhbCBzcXVhcmUgcm9vdCB3aGVuIHRoZQoJICAgICBhcmd1bWVudCBpcyAwLjAgYnkg c3F1YXNoaW5nIHRoZSBpbnRlcm1lZGlhcnkgcmVzdWx0IHRvIDAuMC4gICovCgkgIHJ0eCB4dG1w ID0gZ2VuX3JlZ19ydHggKG1tc2spOwoJICBlbWl0X3NldF9pbnNuICh4dG1wLCBnZW5fcnR4X0FO RCAobW1zaywgZ2VuX3J0eF9OT1QgKG1tc2ssIHhtc2spLAoJCQkJCSAgICBnZW5fcnR4X1NVQlJF RyAobW1zaywgeGRzdCwgMCkpKTsKCSAgZW1pdF9tb3ZlX2luc24gKHhkc3QsIGdlbl9ydHhfU1VC UkVHIChtb2RlLCB4dG1wLCAwKSk7CgoJICAvKiBDYWxjdWxhdGUgdGhlIGFwcHJveGltYXRlIHNx dWFyZSByb290LiAgKi8KCSAgYWFyY2g2NF9lbWl0X211bHQgKHhkc3QsIHBnLCB4ZHN0LCBzcmMp OwoJfQogICAgfQoKICAvKiBGaW5hbGl6ZSB0aGUgYXBwcm94aW1hdGlvbi4gICovCiAgYWFyY2g2 NF9lbWl0X211bHQgKGRzdCwgcGcsIHhkc3QsIHgxKTsKCiAgcmV0dXJuIHRydWU7Cn0KCi8qIEVt aXQgdGhlIGluc3RydWN0aW9uIHNlcXVlbmNlIHRvIGNvbXB1dGUgdGhlIGFwcHJveGltYXRpb24g Zm9yIHRoZSBkaXZpc2lvbgogICBvZiBOVU0gYnkgREVOIGluIFFVTyBhbmQgcmV0dXJuIHdoZXRo ZXIgdGhlIHNlcXVlbmNlIHdhcyBlbWl0dGVkIG9yIG5vdC4gICovCgpib29sCmFhcmNoNjRfZW1p dF9hcHByb3hfZGl2IChydHggcXVvLCBydHggbnVtLCBydHggZGVuKQp7CiAgbWFjaGluZV9tb2Rl IG1vZGUgPSBHRVRfTU9ERSAocXVvKTsKCiAgaWYgKEdFVF9NT0RFX0lOTkVSIChtb2RlKSA9PSBI Rm1vZGUpCiAgICByZXR1cm4gZmFsc2U7CgogIGJvb2wgdXNlX2FwcHJveF9kaXZpc2lvbl9wID0g KGZsYWdfbWxvd19wcmVjaXNpb25fZGl2CgkJCSAgICAgICAgfHwgKGFhcmNoNjRfdHVuZV9wYXJh bXMuYXBwcm94X21vZGVzLT5kaXZpc2lvbgoJCQkJICAgICYgQUFSQ0g2NF9BUFBST1hfTU9ERSAo bW9kZSkpKTsKCiAgaWYgKCFmbGFnX2Zpbml0ZV9tYXRoX29ubHkKICAgICAgfHwgZmxhZ190cmFw cGluZ19tYXRoCiAgICAgIHx8ICFmbGFnX3Vuc2FmZV9tYXRoX29wdGltaXphdGlvbnMKICAgICAg fHwgb3B0aW1pemVfZnVuY3Rpb25fZm9yX3NpemVfcCAoY2Z1bikKICAgICAgfHwgIXVzZV9hcHBy b3hfZGl2aXNpb25fcCkKICAgIHJldHVybiBmYWxzZTsKCiAgaWYgKCFUQVJHRVRfU0lNRCAmJiBW RUNUT1JfTU9ERV9QIChtb2RlKSkKICAgIHJldHVybiBmYWxzZTsKCiAgcnR4IHBnID0gTlVMTF9S VFg7CiAgaWYgKGFhcmNoNjRfc3ZlX21vZGVfcCAobW9kZSkpCiAgICBwZyA9IGFhcmNoNjRfcHRy dWVfcmVnIChhYXJjaDY0X3N2ZV9wcmVkX21vZGUgKG1vZGUpKTsKCiAgLyogRXN0aW1hdGUgdGhl IGFwcHJveGltYXRlIHJlY2lwcm9jYWwuICAqLwogIHJ0eCB4cmNwID0gZ2VuX3JlZ19ydHggKG1v ZGUpOwogIGVtaXRfaW5zbiAoZ2VuX2FhcmNoNjRfZnJlY3BlIChtb2RlLCB4cmNwLCBkZW4pKTsK CiAgLyogSXRlcmF0ZSBvdmVyIHRoZSBzZXJpZXMgdHdpY2UgZm9yIFNGIGFuZCB0aHJpY2UgZm9y IERGLiAgKi8KICBpbnQgaXRlcmF0aW9ucyA9IChHRVRfTU9ERV9JTk5FUiAobW9kZSkgPT0gREZt b2RlKSA/IDMgOiAyOwoKICAvKiBPcHRpb25hbGx5IGl0ZXJhdGUgb3ZlciB0aGUgc2VyaWVzIGxl c3MgZm9yIGZhc3RlciBwZXJmb3JtYW5jZSwKICAgICB3aGlsZSBzYWNyaWZpY2luZyB0aGUgYWNj dXJhY3kuICBUaGUgZGVmYXVsdCBpcyAyIGZvciBERiBhbmQgMSBmb3IgU0YuICAqLwogIGlmIChm bGFnX21sb3dfcHJlY2lzaW9uX2RpdikKICAgIGl0ZXJhdGlvbnMgPSAoR0VUX01PREVfSU5ORVIg KG1vZGUpID09IERGbW9kZQoJCSAgPyBhYXJjaDY0X2RvdWJsZV9yZWNwX3ByZWNpc2lvbgoJCSAg OiBhYXJjaDY0X2Zsb2F0X3JlY3BfcHJlY2lzaW9uKTsKCiAgLyogSXRlcmF0ZSBvdmVyIHRoZSBz ZXJpZXMgdG8gY2FsY3VsYXRlIHRoZSBhcHByb3hpbWF0ZSByZWNpcHJvY2FsLiAgKi8KICBydHgg eHRtcCA9IGdlbl9yZWdfcnR4IChtb2RlKTsKICB3aGlsZSAoaXRlcmF0aW9ucy0tKQogICAgewog ICAgICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X2ZyZWNwcyAobW9kZSwgeHRtcCwgeHJjcCwgZGVu KSk7CgogICAgICBpZiAoaXRlcmF0aW9ucyA+IDApCglhYXJjaDY0X2VtaXRfbXVsdCAoeHJjcCwg cGcsIHhyY3AsIHh0bXApOwogICAgfQoKICBpZiAobnVtICE9IENPTlNUMV9SVFggKG1vZGUpKQog ICAgewogICAgICAvKiBBcyB0aGUgYXBwcm94aW1hdGUgcmVjaXByb2NhbCBvZiBERU4gaXMgYWxy ZWFkeSBjYWxjdWxhdGVkLCBvbmx5CgkgY2FsY3VsYXRlIHRoZSBhcHByb3hpbWF0ZSBkaXZpc2lv biB3aGVuIE5VTSBpcyBub3QgMS4wLiAgKi8KICAgICAgcnR4IHhudW0gPSBmb3JjZV9yZWcgKG1v ZGUsIG51bSk7CiAgICAgIGFhcmNoNjRfZW1pdF9tdWx0ICh4cmNwLCBwZywgeHJjcCwgeG51bSk7 CiAgICB9CgogIC8qIEZpbmFsaXplIHRoZSBhcHByb3hpbWF0aW9uLiAgKi8KICBhYXJjaDY0X2Vt aXRfbXVsdCAocXVvLCBwZywgeHJjcCwgeHRtcCk7CiAgcmV0dXJuIHRydWU7Cn0KCi8qIFJldHVy biB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBpc3N1ZWQgcGVyIGN5Y2xl LiAgKi8Kc3RhdGljIGludAphYXJjaDY0X3NjaGVkX2lzc3VlX3JhdGUgKHZvaWQpCnsKICByZXR1 cm4gYWFyY2g2NF90dW5lX3BhcmFtcy5pc3N1ZV9yYXRlOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VU X1NDSEVEX1ZBUklBQkxFX0lTU1VFLiAgKi8Kc3RhdGljIGludAphYXJjaDY0X3NjaGVkX3Zhcmlh YmxlX2lzc3VlIChGSUxFICosIGludCwgcnR4X2luc24gKmluc24sIGludCBtb3JlKQp7CiAgaWYg KERFQlVHX0lOU05fUCAoaW5zbikpCiAgICByZXR1cm4gbW9yZTsKCiAgcnR4X2NvZGUgY29kZSA9 IEdFVF9DT0RFIChQQVRURVJOIChpbnNuKSk7CiAgaWYgKGNvZGUgPT0gVVNFIHx8IGNvZGUgPT0g Q0xPQkJFUikKICAgIHJldHVybiBtb3JlOwoKICBpZiAoZ2V0X2F0dHJfdHlwZSAoaW5zbikgPT0g VFlQRV9OT19JTlNOKQogICAgcmV0dXJuIG1vcmU7CgogIHJldHVybiBtb3JlIC0gMTsKfQoKc3Rh dGljIGludAphYXJjaDY0X3NjaGVkX2ZpcnN0X2N5Y2xlX211bHRpcGFzc19kZmFfbG9va2FoZWFk ICh2b2lkKQp7CiAgaW50IGlzc3VlX3JhdGUgPSBhYXJjaDY0X3NjaGVkX2lzc3VlX3JhdGUgKCk7 CgogIHJldHVybiBpc3N1ZV9yYXRlID4gMSAmJiAhc2NoZWRfZnVzaW9uID8gaXNzdWVfcmF0ZSA6 IDA7Cn0KCgovKiBJbXBsZW1lbnQgVEFSR0VUX1NDSEVEX0ZJUlNUX0NZQ0xFX01VTFRJUEFTU19E RkFfTE9PS0FIRUFEX0dVQVJEIGFzCiAgIGF1dG9wcmVmX211bHRpcGFzc19kZmFfbG9va2FoZWFk X2d1YXJkIGZyb20gaGFpZmEtc2NoZWQuY2MuICBJdCBvbmx5CiAgIGhhcyBhbiBlZmZlY3QgaWYg UEFSQU1fU0NIRURfQVVUT1BSRUZfUVVFVUVfREVQVEggPiAwLiAgKi8KCnN0YXRpYyBpbnQKYWFy Y2g2NF9maXJzdF9jeWNsZV9tdWx0aXBhc3NfZGZhX2xvb2thaGVhZF9ndWFyZCAocnR4X2luc24g Kmluc24sCgkJCQkJCSAgICBpbnQgcmVhZHlfaW5kZXgpCnsKICByZXR1cm4gYXV0b3ByZWZfbXVs dGlwYXNzX2RmYV9sb29rYWhlYWRfZ3VhcmQgKGluc24sIHJlYWR5X2luZGV4KTsKfQoKCi8qIFZl Y3Rvcml6ZXIgY29zdCBtb2RlbCB0YXJnZXQgaG9va3MuICAqLwoKLyogSWYgYSB2bGQxIGZyb20g YWRkcmVzcyBBRERSIHNob3VsZCBiZSByZWNvcmRlZCBpbiB2ZWN0b3JfbG9hZF9kZWNscywKICAg cmV0dXJuIHRoZSBkZWNsIHRoYXQgc2hvdWxkIGJlIHJlY29yZGVkLiAgUmV0dXJuIG51bGwgb3Ro ZXJ3aXNlLiAgKi8KdHJlZQphYXJjaDY0X3ZlY3Rvcl9sb2FkX2RlY2wgKHRyZWUgYWRkcikKewog IGlmIChUUkVFX0NPREUgKGFkZHIpICE9IEFERFJfRVhQUikKICAgIHJldHVybiBOVUxMX1RSRUU7 CiAgdHJlZSBiYXNlID0gZ2V0X2Jhc2VfYWRkcmVzcyAoVFJFRV9PUEVSQU5EIChhZGRyLCAwKSk7 CiAgaWYgKFRSRUVfQ09ERSAoYmFzZSkgIT0gVkFSX0RFQ0wpCiAgICByZXR1cm4gTlVMTF9UUkVF OwogIHJldHVybiBiYXNlOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBTVE1UX0lORk8gYWNjZXNzZXMg YSBkZWNsIHRoYXQgaXMga25vd24gdG8gYmUgdGhlCiAgIGFyZ3VtZW50IHRvIGEgdmxkMSBpbiB0 aGUgc2FtZSBmdW5jdGlvbi4gICovCnN0YXRpYyBib29sCmFhcmNoNjRfYWNjZXNzZXNfdmVjdG9y X2xvYWRfZGVjbF9wIChzdG10X3ZlY19pbmZvIHN0bXRfaW5mbykKewogIGlmICghY2Z1bi0+bWFj aGluZS0+dmVjdG9yX2xvYWRfZGVjbHMpCiAgICByZXR1cm4gZmFsc2U7CiAgYXV0byBkciA9IFNU TVRfVklORk9fREFUQV9SRUYgKHN0bXRfaW5mbyk7CiAgaWYgKCFkcikKICAgIHJldHVybiBmYWxz ZTsKICB0cmVlIGRlY2wgPSBhYXJjaDY0X3ZlY3Rvcl9sb2FkX2RlY2wgKERSX0JBU0VfQUREUkVT UyAoZHIpKTsKICByZXR1cm4gZGVjbCAmJiBjZnVuLT5tYWNoaW5lLT52ZWN0b3JfbG9hZF9kZWNs cy0+Y29udGFpbnMgKGRlY2wpOwp9CgovKiBJbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIENQVSB3 b3VsZCBpc3N1ZSB0aGUgc2NhbGFyLCBBZHZhbmNlZCBTSU1ECiAgIG9yIFNWRSB2ZXJzaW9uIG9m IGEgdmVjdG9yIGxvb3AsIHVzaW5nIHRoZSBzY2hlbWUgZGVmaW5lZCBieSB0aGUKICAgYWFyY2g2 NF9iYXNlX3ZlY19pc3N1ZV9pbmZvIGhpZXJhcmNoeSBvZiBzdHJ1Y3R1cmVzLiAgKi8KY2xhc3Mg YWFyY2g2NF92ZWNfb3BfY291bnQKewpwdWJsaWM6CiAgYWFyY2g2NF92ZWNfb3BfY291bnQgKCkg PSBkZWZhdWx0OwogIGFhcmNoNjRfdmVjX29wX2NvdW50IChjb25zdCBhYXJjaDY0X3ZlY19pc3N1 ZV9pbmZvICosIHVuc2lnbmVkIGludCwKCQkJdW5zaWduZWQgaW50ID0gMSk7CgogIHVuc2lnbmVk IGludCB2ZWNfZmxhZ3MgKCkgY29uc3QgeyByZXR1cm4gbV92ZWNfZmxhZ3M7IH0KICB1bnNpZ25l ZCBpbnQgdmZfZmFjdG9yICgpIGNvbnN0IHsgcmV0dXJuIG1fdmZfZmFjdG9yOyB9CgogIGNvbnN0 IGFhcmNoNjRfYmFzZV92ZWNfaXNzdWVfaW5mbyAqYmFzZV9pc3N1ZV9pbmZvICgpIGNvbnN0Owog IGNvbnN0IGFhcmNoNjRfc2ltZF92ZWNfaXNzdWVfaW5mbyAqc2ltZF9pc3N1ZV9pbmZvICgpIGNv bnN0OwogIGNvbnN0IGFhcmNoNjRfc3ZlX3ZlY19pc3N1ZV9pbmZvICpzdmVfaXNzdWVfaW5mbyAo KSBjb25zdDsKCiAgZnJhY3Rpb25hbF9jb3N0IHJlbmFtZV9jeWNsZXNfcGVyX2l0ZXIgKCkgY29u c3Q7CiAgZnJhY3Rpb25hbF9jb3N0IG1pbl9ub25wcmVkX2N5Y2xlc19wZXJfaXRlciAoKSBjb25z dDsKICBmcmFjdGlvbmFsX2Nvc3QgbWluX3ByZWRfY3ljbGVzX3Blcl9pdGVyICgpIGNvbnN0Owog IGZyYWN0aW9uYWxfY29zdCBtaW5fY3ljbGVzX3Blcl9pdGVyICgpIGNvbnN0OwoKICB2b2lkIGR1 bXAgKCkgY29uc3Q7CgogIC8qIFRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbCAiZ2VuZXJhbCIgb3Bl cmF0aW9ucy4gIFNlZSB0aGUgY29tbWVudHMKICAgICBpbiBhYXJjaDY0X2Jhc2VfdmVjX2lzc3Vl X2luZm8gZm9yIGRldGFpbHMuICAqLwogIHVuc2lnbmVkIGludCBnZW5lcmFsX29wcyA9IDA7Cgog IC8qIFRoZSBudW1iZXIgb2YgbG9hZCBhbmQgc3RvcmUgb3BlcmF0aW9ucywgdW5kZXIgdGhlIHNh bWUgc2NoZW1lCiAgICAgYXMgYWJvdmUuICAqLwogIHVuc2lnbmVkIGludCBsb2FkcyA9IDA7CiAg dW5zaWduZWQgaW50IHN0b3JlcyA9IDA7CgogIC8qIFRoZSBtaW5pbXVtIG51bWJlciBvZiBjeWNs ZXMgbmVlZGVkIHRvIGV4ZWN1dGUgYWxsIGxvb3AtY2FycmllZAogICAgIG9wZXJhdGlvbnMsIHdo aWNoIGluIHRoZSB2ZWN0b3IgY29kZSBiZWNvbWUgYXNzb2NpYXRlZCB3aXRoCiAgICAgcmVkdWN0 aW9ucy4gICovCiAgdW5zaWduZWQgaW50IHJlZHVjdGlvbl9sYXRlbmN5ID0gMDsKCiAgLyogVGhl IG51bWJlciBvZiBpbmRpdmlkdWFsIHByZWRpY2F0ZSBvcGVyYXRpb25zLiAgU2VlIHRoZSBjb21t ZW50cwogICAgIGluIGFhcmNoNjRfc3ZlX3ZlY19pc3N1ZV9pbmZvIGZvciBkZXRhaWxzLiAgKi8K ICB1bnNpZ25lZCBpbnQgcHJlZF9vcHMgPSAwOwoKcHJpdmF0ZToKICAvKiBUaGUgaXNzdWUgaW5m b3JtYXRpb24gZm9yIHRoZSBjb3JlLiAgKi8KICBjb25zdCBhYXJjaDY0X3ZlY19pc3N1ZV9pbmZv ICptX2lzc3VlX2luZm8gPSBudWxscHRyOwoKICAvKiAtIElmIE1fVkVDX0ZMQUdTIGlzIHplcm8g dGhlbiB0aGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgc2NhbGFyIGNvZGUKICAgICAtIElmIE1fVkVD X0ZMQUdTICYgVkVDX0FEVlNJTUQgaXMgbm9uemVybyB0aGVuIHRoaXMgc3RydWN0dXJlIGRlc2Ny aWJlcwogICAgICAgQWR2YW5jZWQgU0lNRCBjb2RlLgogICAgIC0gSWYgTV9WRUNfRkxBR1MgJiBW RUNfQU5ZX1NWRSBpcyBub256ZXJvIHRoZW4gdGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzCiAgICAg ICBTVkUgY29kZS4gICovCiAgdW5zaWduZWQgaW50IG1fdmVjX2ZsYWdzID0gMDsKCiAgLyogQXNz dW1lIHRoYXQsIHdoZW4gdGhlIGNvZGUgaXMgZXhlY3V0aW5nIG9uIHRoZSBjb3JlIGRlc2NyaWJl ZAogICAgIGJ5IE1fSVNTVUVfSU5GTywgb25lIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aWxsIGhh bmRsZSBNX1ZGX0ZBQ1RPUgogICAgIHRpbWVzIG1vcmUgZGF0YSB0aGFuIHRoZSB2ZWN0b3JpemVy IGFudGljaXBhdGVzLgoKICAgICBUaGlzIGlzIG9ubHkgZXZlciBkaWZmZXJlbnQgZnJvbSAxIGZv ciBTVkUuICBJdCBhbGxvd3MgdXMgdG8gY29uc2lkZXIKICAgICB3aGF0IHdvdWxkIGhhcHBlbiBv biBhIDI1Ni1iaXQgU1ZFIHRhcmdldCBldmVuIHdoZW4gdGhlIC1tdHVuZQogICAgIHBhcmFtZXRl cnMgc2F5IHRoYXQgdGhlIOKAnGxpa2VseeKAnSBTVkUgbGVuZ3RoIGlzIDEyOCBiaXRzLiAgKi8K ICB1bnNpZ25lZCBpbnQgbV92Zl9mYWN0b3IgPSAxOwp9OwoKYWFyY2g2NF92ZWNfb3BfY291bnQ6 OgphYXJjaDY0X3ZlY19vcF9jb3VudCAoY29uc3QgYWFyY2g2NF92ZWNfaXNzdWVfaW5mbyAqaXNz dWVfaW5mbywKCQkgICAgICB1bnNpZ25lZCBpbnQgdmVjX2ZsYWdzLCB1bnNpZ25lZCBpbnQgdmZf ZmFjdG9yKQogIDogbV9pc3N1ZV9pbmZvIChpc3N1ZV9pbmZvKSwKICAgIG1fdmVjX2ZsYWdzICh2 ZWNfZmxhZ3MpLAogICAgbV92Zl9mYWN0b3IgKHZmX2ZhY3RvcikKewp9CgovKiBSZXR1cm4gdGhl IGJhc2UgaXNzdWUgaW5mb3JtYXRpb24gKGkuZS4gdGhlIHBhcnRzIHRoYXQgbWFrZSBzZW5zZQog ICBmb3IgYm90aCBzY2FsYXIgYW5kIHZlY3RvciBjb2RlKS4gIFJldHVybiBudWxsIGlmIHdlIGhh dmUgbm8gaXNzdWUKICAgaW5mb3JtYXRpb24uICAqLwpjb25zdCBhYXJjaDY0X2Jhc2VfdmVjX2lz c3VlX2luZm8gKgphYXJjaDY0X3ZlY19vcF9jb3VudDo6YmFzZV9pc3N1ZV9pbmZvICgpIGNvbnN0 CnsKICBpZiAoYXV0byAqcmV0ID0gc2ltZF9pc3N1ZV9pbmZvICgpKQogICAgcmV0dXJuIHJldDsK ICByZXR1cm4gbV9pc3N1ZV9pbmZvLT5zY2FsYXI7Cn0KCi8qIElmIHRoZSBzdHJ1Y3R1cmUgZGVz Y3JpYmVzIHZlY3RvciBjb2RlIGFuZCB3ZSBoYXZlIGFzc29jaWF0ZWQgaXNzdWUKICAgaW5mb3Jt YXRpb24sIHJldHVybiB0aGF0IGlzc3VlIGluZm9ybWF0aW9uLCBvdGhlcndpc2UgcmV0dXJuIG51 bGwuICAqLwpjb25zdCBhYXJjaDY0X3NpbWRfdmVjX2lzc3VlX2luZm8gKgphYXJjaDY0X3ZlY19v cF9jb3VudDo6c2ltZF9pc3N1ZV9pbmZvICgpIGNvbnN0CnsKICBpZiAoYXV0byAqcmV0ID0gc3Zl X2lzc3VlX2luZm8gKCkpCiAgICByZXR1cm4gcmV0OwogIGlmIChtX3ZlY19mbGFncykKICAgIHJl dHVybiBtX2lzc3VlX2luZm8tPmFkdnNpbWQ7CiAgcmV0dXJuIG51bGxwdHI7Cn0KCi8qIElmIHRo ZSBzdHJ1Y3R1cmUgZGVzY3JpYmVzIFNWRSBjb2RlIGFuZCB3ZSBoYXZlIGFzc29jaWF0ZWQgaXNz dWUKICAgaW5mb3JtYXRpb24sIHJldHVybiB0aGF0IGlzc3VlIGluZm9ybWF0aW9uLCBvdGhlcndp c2UgcmV0dXJuIG51bGwuICAqLwpjb25zdCBhYXJjaDY0X3N2ZV92ZWNfaXNzdWVfaW5mbyAqCmFh cmNoNjRfdmVjX29wX2NvdW50OjpzdmVfaXNzdWVfaW5mbyAoKSBjb25zdAp7CiAgaWYgKG1fdmVj X2ZsYWdzICYgVkVDX0FOWV9TVkUpCiAgICByZXR1cm4gbV9pc3N1ZV9pbmZvLT5zdmU7CiAgcmV0 dXJuIG51bGxwdHI7Cn0KCi8qIEVzdGltYXRlIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjeWNsZXMg cGVyIGl0ZXJhdGlvbiBuZWVkZWQgdG8gcmVuYW1lCiAgIHRoZSBpbnN0cnVjdGlvbnMuCgogICA/ Pz8gRm9yIG5vdyB0aGlzIGlzIGRvbmUgaW5saW5lIHJhdGhlciB0aGFuIHZpYSBjb3N0IHRhYmxl cywgc2luY2UgaXQKICAgaXNuJ3QgY2xlYXIgaG93IGl0IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVk IGZvciB0aGUgZ2VuZXJhbCBjYXNlLiAgKi8KZnJhY3Rpb25hbF9jb3N0CmFhcmNoNjRfdmVjX29w X2NvdW50OjpyZW5hbWVfY3ljbGVzX3Blcl9pdGVyICgpIGNvbnN0CnsKICBpZiAoc3ZlX2lzc3Vl X2luZm8gKCkgPT0gJm5lb3ZlcnNlNTEydHZiX3N2ZV9pc3N1ZV9pbmZvCiAgICAgIHx8IHN2ZV9p c3N1ZV9pbmZvICgpID09ICZuZW92ZXJzZW4yX3N2ZV9pc3N1ZV9pbmZvCiAgICAgIHx8IHN2ZV9p c3N1ZV9pbmZvICgpID09ICZuZW92ZXJzZXYyX3N2ZV9pc3N1ZV9pbmZvKQogICAgLyogKyAxIGZv ciBhbiBhZGRpdGlvbi4gIFdlJ3ZlIGFscmVhZHkgY291bnRlZCBhIGdlbmVyYWwgb3AgZm9yIGVh Y2gKICAgICAgIHN0b3JlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGFjY291bnQgZm9yIHN0b3JlcyBz ZXBhcmF0ZWx5LiAgVGhlIGJyYW5jaAogICAgICAgcmVhZHMgbm8gcmVnaXN0ZXJzIGFuZCBzbyBk b2VzIG5vdCBuZWVkIHRvIGJlIGNvdW50ZWQgZWl0aGVyLgoKICAgICAgID8/PyBUaGlzIHZhbHVl IGlzIHZlcnkgbXVjaCBvbiB0aGUgcGVzc2ltaXN0aWMgc2lkZSwgYnV0IHNlZW1zIHRvIHdvcmsK ICAgICAgIHByZXR0eSB3ZWxsIGluIHByYWN0aWNlLiAgKi8KICAgIHJldHVybiB7IGdlbmVyYWxf b3BzICsgbG9hZHMgKyBwcmVkX29wcyArIDEsIDUgfTsKCiAgcmV0dXJuIDA7Cn0KCi8qIExpa2Ug bWluX2N5Y2xlc19wZXJfaXRlciwgYnV0IGV4Y2x1ZGluZyBwcmVkaWNhdGUgb3BlcmF0aW9ucy4g ICovCmZyYWN0aW9uYWxfY29zdAphYXJjaDY0X3ZlY19vcF9jb3VudDo6bWluX25vbnByZWRfY3lj bGVzX3Blcl9pdGVyICgpIGNvbnN0CnsKICBhdXRvICppc3N1ZV9pbmZvID0gYmFzZV9pc3N1ZV9p bmZvICgpOwoKICBmcmFjdGlvbmFsX2Nvc3QgY3ljbGVzID0gTUFYIChyZWR1Y3Rpb25fbGF0ZW5j eSwgMSk7CiAgY3ljbGVzID0gc3RkOjptYXggKGN5Y2xlcywgeyBzdG9yZXMsIGlzc3VlX2luZm8t PnN0b3Jlc19wZXJfY3ljbGUgfSk7CiAgY3ljbGVzID0gc3RkOjptYXggKGN5Y2xlcywgeyBsb2Fk cyArIHN0b3JlcywKCQkJICAgICAgIGlzc3VlX2luZm8tPmxvYWRzX3N0b3Jlc19wZXJfY3ljbGUg fSk7CiAgY3ljbGVzID0gc3RkOjptYXggKGN5Y2xlcywgeyBnZW5lcmFsX29wcywKCQkJICAgICAg IGlzc3VlX2luZm8tPmdlbmVyYWxfb3BzX3Blcl9jeWNsZSB9KTsKICBjeWNsZXMgPSBzdGQ6Om1h eCAoY3ljbGVzLCByZW5hbWVfY3ljbGVzX3Blcl9pdGVyICgpKTsKICByZXR1cm4gY3ljbGVzOwp9 CgovKiBMaWtlIG1pbl9jeWNsZXNfcGVyX2l0ZXIsIGJ1dCBpbmNsdWRpbmcgb25seSB0aGUgcHJl ZGljYXRlIG9wZXJhdGlvbnMuICAqLwpmcmFjdGlvbmFsX2Nvc3QKYWFyY2g2NF92ZWNfb3BfY291 bnQ6Om1pbl9wcmVkX2N5Y2xlc19wZXJfaXRlciAoKSBjb25zdAp7CiAgaWYgKGF1dG8gKmlzc3Vl X2luZm8gPSBzdmVfaXNzdWVfaW5mbyAoKSkKICAgIHJldHVybiB7IHByZWRfb3BzLCBpc3N1ZV9p bmZvLT5wcmVkX29wc19wZXJfY3ljbGUgfTsKICByZXR1cm4gMDsKfQoKLyogRXN0aW1hdGUgdGhl IG1pbmltdW0gbnVtYmVyIG9mIGN5Y2xlcyBuZWVkZWQgdG8gaXNzdWUgdGhlIG9wZXJhdGlvbnMu CiAgIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsaXN0aWMgbW9kZWwhICAqLwpmcmFjdGlvbmFsX2Nvc3QK YWFyY2g2NF92ZWNfb3BfY291bnQ6Om1pbl9jeWNsZXNfcGVyX2l0ZXIgKCkgY29uc3QKewogIHJl dHVybiBzdGQ6Om1heCAobWluX25vbnByZWRfY3ljbGVzX3Blcl9pdGVyICgpLAoJCSAgIG1pbl9w cmVkX2N5Y2xlc19wZXJfaXRlciAoKSk7Cn0KCi8qIER1bXAgaW5mb3JtYXRpb24gYWJvdXQgdGhl IHN0cnVjdHVyZS4gICovCnZvaWQKYWFyY2g2NF92ZWNfb3BfY291bnQ6OmR1bXAgKCkgY29uc3QK ewogIGR1bXBfcHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRpb24sCgkJICAgIiAgbG9h ZCBvcGVyYXRpb25zID0gJWRcbiIsIGxvYWRzKTsKICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RF LCB2ZWN0X2xvY2F0aW9uLAoJCSAgICIgIHN0b3JlIG9wZXJhdGlvbnMgPSAlZFxuIiwgc3RvcmVz KTsKICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAoJCSAgICIgIGdl bmVyYWwgb3BlcmF0aW9ucyA9ICVkXG4iLCBnZW5lcmFsX29wcyk7CiAgaWYgKHN2ZV9pc3N1ZV9p bmZvICgpKQogICAgZHVtcF9wcmludGZfbG9jIChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKCQkg ICAgICIgIHByZWRpY2F0ZSBvcGVyYXRpb25zID0gJWRcbiIsIHByZWRfb3BzKTsKICBkdW1wX3By aW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAoJCSAgICIgIHJlZHVjdGlvbiBsYXRl bmN5ID0gJWRcbiIsIHJlZHVjdGlvbl9sYXRlbmN5KTsKICBpZiAoYXV0byByY3BpID0gcmVuYW1l X2N5Y2xlc19wZXJfaXRlciAoKSkKICAgIGR1bXBfcHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3Rf bG9jYXRpb24sCgkJICAgICAiICBlc3RpbWF0ZWQgY3ljbGVzIHBlciBpdGVyYXRpb24gdG8gcmVu YW1lID0gJWZcbiIsCgkJICAgICByY3BpLmFzX2RvdWJsZSAoKSk7CiAgaWYgKGF1dG8gcHJlZF9j cGkgPSBtaW5fcHJlZF9jeWNsZXNfcGVyX2l0ZXIgKCkpCiAgICB7CiAgICAgIGR1bXBfcHJpbnRm X2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRpb24sCgkJICAgICAgICIgIGVzdGltYXRlZCBtaW4g Y3ljbGVzIHBlciBpdGVyYXRpb24iCgkJICAgICAgICIgd2l0aG91dCBwcmVkaWNhdGlvbiA9ICVm XG4iLAoJCSAgICAgICBtaW5fbm9ucHJlZF9jeWNsZXNfcGVyX2l0ZXIgKCkuYXNfZG91YmxlICgp KTsKICAgICAgZHVtcF9wcmludGZfbG9jIChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKCQkgICAg ICAgIiAgZXN0aW1hdGVkIG1pbiBjeWNsZXMgcGVyIGl0ZXJhdGlvbiIKCQkgICAgICAgIiBmb3Ig cHJlZGljYXRpb24gPSAlZlxuIiwgcHJlZF9jcGkuYXNfZG91YmxlICgpKTsKICAgIH0KICBpZiAo YXV0byBjcGkgPSBtaW5fY3ljbGVzX3Blcl9pdGVyICgpKQogICAgZHVtcF9wcmludGZfbG9jIChN U0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKCQkgICAgICIgIGVzdGltYXRlZCBtaW4gY3ljbGVzIHBl ciBpdGVyYXRpb24gPSAlZlxuIiwKCQkgICAgIGNwaS5hc19kb3VibGUgKCkpOwp9CgovKiBJbmZv cm1hdGlvbiBhYm91dCB2ZWN0b3IgY29kZSB0aGF0IHdlJ3JlIGluIHRoZSBwcm9jZXNzIG9mIGNv c3RpbmcuICAqLwpjbGFzcyBhYXJjaDY0X3ZlY3Rvcl9jb3N0cyA6IHB1YmxpYyB2ZWN0b3JfY29z dHMKewpwdWJsaWM6CiAgYWFyY2g2NF92ZWN0b3JfY29zdHMgKHZlY19pbmZvICosIGJvb2wpOwoK ICB1bnNpZ25lZCBpbnQgYWRkX3N0bXRfY29zdCAoaW50IGNvdW50LCB2ZWN0X2Nvc3RfZm9yX3N0 bXQga2luZCwKCQkJICAgICAgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8sIHNscF90cmVlLCB0cmVl IHZlY3R5cGUsCgkJCSAgICAgIGludCBtaXNhbGlnbiwKCQkJICAgICAgdmVjdF9jb3N0X21vZGVs X2xvY2F0aW9uIHdoZXJlKSBvdmVycmlkZTsKICB2b2lkIGZpbmlzaF9jb3N0IChjb25zdCB2ZWN0 b3JfY29zdHMgKikgb3ZlcnJpZGU7CiAgYm9vbCBiZXR0ZXJfbWFpbl9sb29wX3RoYW5fcCAoY29u c3QgdmVjdG9yX2Nvc3RzICpvdGhlcikgY29uc3Qgb3ZlcnJpZGU7Cgpwcml2YXRlOgogIHZvaWQg cmVjb3JkX3BvdGVudGlhbF9hZHZzaW1kX3Vucm9sbGluZyAobG9vcF92ZWNfaW5mbyk7CiAgdm9p ZCBhbmFseXplX2xvb3BfdmluZm8gKGxvb3BfdmVjX2luZm8pOwogIHZvaWQgY291bnRfb3BzICh1 bnNpZ25lZCBpbnQsIHZlY3RfY29zdF9mb3Jfc3RtdCwgc3RtdF92ZWNfaW5mbywKCQkgIGFhcmNo NjRfdmVjX29wX2NvdW50ICopOwogIGZyYWN0aW9uYWxfY29zdCBhZGp1c3RfYm9keV9jb3N0X3N2 ZSAoY29uc3QgYWFyY2g2NF92ZWNfb3BfY291bnQgKiwKCQkJCQlmcmFjdGlvbmFsX2Nvc3QsIHVu c2lnbmVkIGludCwKCQkJCQl1bnNpZ25lZCBpbnQgKiwgYm9vbCAqKTsKICB1bnNpZ25lZCBpbnQg YWRqdXN0X2JvZHlfY29zdCAobG9vcF92ZWNfaW5mbywgY29uc3QgYWFyY2g2NF92ZWN0b3JfY29z dHMgKiwKCQkJCSB1bnNpZ25lZCBpbnQpOwogIGJvb2wgcHJlZmVyX3Vucm9sbGVkX2xvb3AgKCkg Y29uc3Q7CiAgdW5zaWduZWQgaW50IGRldGVybWluZV9zdWdnZXN0ZWRfdW5yb2xsX2ZhY3RvciAo KTsKCiAgLyogVHJ1ZSBpZiB3ZSBoYXZlIHBlcmZvcm1lZCBvbmUtdGltZSBpbml0aWFsaXphdGlv biBiYXNlZCBvbiB0aGUKICAgICB2ZWNfaW5mby4gICovCiAgYm9vbCBtX2FuYWx5emVkX3ZpbmZv ID0gZmFsc2U7CgogIC8qIFRoaXMgbG9vcCB1c2VzIGFuIGF2ZXJhZ2Ugb3BlcmF0aW9uIHRoYXQg aXMgbm90IHN1cHBvcnRlZCBieSBTVkUsIGJ1dCBpcwogICAgIHN1cHBvcnRlZCBieSBBZHZhbmNl ZCBTSU1EIGFuZCBTVkUyLiAgKi8KICBib29sIG1faGFzX2F2ZyA9IGZhbHNlOwoKICAvKiBUcnVl IGlmIHRoZSB2ZWN0b3IgYm9keSBjb250YWlucyBhIHN0b3JlIHRvIGEgZGVjbCBhbmQgaWYgdGhl CiAgICAgZnVuY3Rpb24gaXMga25vd24gdG8gaGF2ZSBhIHZsZDEgZnJvbSB0aGUgc2FtZSBkZWNs LgoKICAgICBJbiB0aGUgQWR2YW5jZWQgU0lNRCBBQ0xFLCB0aGUgcmVjb21tZW5kZWQgZW5kaWFu LWFnbm9zdGljIHdheSBvZgogICAgIGluaXRpYWxpemluZyBhIHZlY3RvciBpczoKCiAgICAgICBm bG9hdCBmWzRdID0geyBlbHRzIH07CiAgICAgICBmbG9hdDMyeDRfdCB4ID0gdmxkMXFfZjMyKGYp OwoKICAgICBXZSBzaG91bGQgc3Ryb25nbHkgcHJlZmVyIHZlY3Rvcml6YXRpb24gb2YgdGhlIGlu aXRpYWxpemF0aW9uIG9mIGYsCiAgICAgc28gdGhhdCB0aGUgc3RvcmUgdG8gZiBhbmQgdGhlIGxv YWQgYmFjayBjYW4gYmUgb3B0aW1pemVkIGF3YXksCiAgICAgbGVhdmluZyBhIHZlY3Rvcml6YXRp b24gb2YgeyBlbHRzIH0uICAqLwogIGJvb2wgbV9zdG9yZXNfdG9fdmVjdG9yX2xvYWRfZGVjbCA9 IGZhbHNlOwoKICAvKiAtIElmIE1fVkVDX0ZMQUdTIGlzIHplcm8gdGhlbiB3ZSdyZSBjb3N0aW5n IHRoZSBvcmlnaW5hbCBzY2FsYXIgY29kZS4KICAgICAtIElmIE1fVkVDX0ZMQUdTICYgVkVDX0FE VlNJTUQgaXMgbm9uemVybyB0aGVuIHdlJ3JlIGNvc3RpbmcgQWR2YW5jZWQKICAgICAgIFNJTUQg Y29kZS4KICAgICAtIElmIE1fVkVDX0ZMQUdTICYgVkVDX0FOWV9TVkUgaXMgbm9uemVybyB0aGVu IHdlJ3JlIGNvc3RpbmcgU1ZFIGNvZGUuICAqLwogIHVuc2lnbmVkIGludCBtX3ZlY19mbGFncyA9 IDA7CgogIC8qIEF0IHRoZSBtb21lbnQsIHdlIGRvIG5vdCBtb2RlbCBMRFAgYW5kIFNUUCBpbiB0 aGUgdmVjdG9yIGFuZCBzY2FsYXIgY29zdHMuCiAgICAgVGhpcyBtZWFucyB0aGF0IGNvZGUgc3Vj aCBhczoKCglhWzBdID0geDsKCWFbMV0gPSB4OwoKICAgICB3aWxsIGJlIGNvc3RlZCBhcyB0d28g c2NhbGFyIGluc3RydWN0aW9ucyBhbmQgdHdvIHZlY3RvciBpbnN0cnVjdGlvbnMKICAgICAoYSBz Y2FsYXJfdG9fdmVjIGFuZCBhbiB1bmFsaWduZWRfc3RvcmUpLiAgRm9yIFNMUCwgdGhlIHZlY3Rv ciBmb3JtCiAgICAgd2lucyBpZiB0aGUgY29zdHMgYXJlIGVxdWFsLCBiZWNhdXNlIG9mIHRoZSBm YWN0IHRoYXQgdGhlIHZlY3RvciBjb3N0cwogICAgIGluY2x1ZGUgY29uc3RhbnQgaW5pdGlhbGl6 YXRpb25zIHdoZXJlYXMgdGhlIHNjYWxhciBjb3N0cyBkb24ndC4KICAgICBXZSB3b3VsZCB0aGVy ZWZvcmUgdGVuZCB0byB2ZWN0b3JpemUgdGhlIGNvZGUgYWJvdmUsIGV2ZW4gdGhvdWdoCiAgICAg dGhlIHNjYWxhciB2ZXJzaW9uIGNhbiB1c2UgYSBzaW5nbGUgU1RQLgoKICAgICBXZSBzaG91bGQg ZXZlbnR1YWxseSBmaXggdGhpcyBhbmQgbW9kZWwgTERQIGFuZCBTVFAgaW4gdGhlIG1haW4gY29z dHM7CiAgICAgc2VlIHRoZSBjb21tZW50IGluIGFhcmNoNjRfc3ZlX2FkanVzdF9zdG10X2Nvc3Qg Zm9yIHNvbWUgb2YgdGhlIHByb2JsZW1zLgogICAgIFVudGlsIHRoZW4sIHdlIGxvb2sgc3BlY2lm aWNhbGx5IGZvciBjb2RlIHRoYXQgZG9lcyBub3RoaW5nIG1vcmUgdGhhbgogICAgIFNUUC1saWtl IG9wZXJhdGlvbnMuICBXZSBjb3N0IHRoZW0gb24gdGhhdCBiYXNpcyBpbiBhZGRpdGlvbiB0byB0 aGUKICAgICBub3JtYWwgbGF0ZW5jeS1iYXNlZCBjb3N0cy4KCiAgICAgSWYgdGhlIHNjYWxhciBv ciB2ZWN0b3IgY29kZSBjb3VsZCBiZSBhIHNlcXVlbmNlIG9mIFNUUHMgKwogICAgIGluaXRpYWxp emF0aW9uLCB0aGlzIHZhcmlhYmxlIGNvdW50cyB0aGUgY29zdCBvZiB0aGUgc2VxdWVuY2UsCiAg ICAgd2l0aCAyIHVuaXRzIHBlciBpbnN0cnVjdGlvbi4gIFRoZSB2YXJpYWJsZSBpcyB+MFUgZm9y IG90aGVyCiAgICAga2luZHMgb2YgY29kZS4gICovCiAgdW5zaWduZWQgaW50IG1fc3RwX3NlcXVl bmNlX2Nvc3QgPSAwOwoKICAvKiBPbiBzb21lIENQVXMsIFNWRSBhbmQgQWR2YW5jZWQgU0lNRCBw cm92aWRlIHRoZSBzYW1lIHRoZW9yZXRpY2FsIHZlY3RvcgogICAgIHRocm91Z2hwdXQsIHN1Y2gg YXMgNHgxMjggQWR2YW5jZWQgU0lNRCB2cy4gMngyNTYgU1ZFLiAgSW4gdGhvc2UKICAgICBzaXR1 YXRpb25zLCB3ZSB0cnkgdG8gcHJlZGljdCB3aGV0aGVyIGFuIEFkdmFuY2VkIFNJTUQgaW1wbGVt ZW50YXRpb24KICAgICBvZiB0aGUgbG9vcCBjb3VsZCBiZSBjb21wbGV0ZWx5IHVucm9sbGVkIGFu ZCBiZWNvbWUgc3RyYWlnaHQtbGluZSBjb2RlLgogICAgIElmIHNvLCBpdCBpcyBnZW5lcmFsbHkg YmV0dGVyIHRvIHVzZSB0aGUgQWR2YW5jZWQgU0lNRCB2ZXJzaW9uIHJhdGhlcgogICAgIHRoYW4g bGVuZ3RoLWFnbm9zdGljIFNWRSwgc2luY2UgdGhlIFNWRSBsb29wIHdvdWxkIGV4ZWN1dGUgYW4g dW5rbm93bgogICAgIG51bWJlciBvZiB0aW1lcyBhbmQgc28gY291bGQgbm90IGJlIGNvbXBsZXRl bHkgdW5yb2xsZWQgaW4gdGhlIHNhbWUgd2F5LgoKICAgICBJZiB3ZSdyZSBhcHBseWluZyB0aGlz IGhldXJpc3RpYywgTV9VTlJPTExFRF9BRFZTSU1EX05JVEVSUyBpcyB0aGUKICAgICBudW1iZXIg b2YgQWR2YW5jZWQgU0lNRCBsb29wIGl0ZXJhdGlvbnMgdGhhdCB3b3VsZCBiZSB1bnJvbGxlZCBh bmQKICAgICBNX1VOUk9MTEVEX0FEVlNJTURfU1RNVFMgZXN0aW1hdGVzIHRoZSB0b3RhbCBudW1i ZXIgb2Ygc3RhdGVtZW50cwogICAgIGluIHRoZSB1bnJvbGxlZCBsb29wLiAgQm90aCB2YWx1ZXMg YXJlIHplcm8gaWYgd2UncmUgbm90IGFwcGx5aW5nCiAgICAgdGhlIGhldXJpc3RpYy4gICovCiAg dW5zaWduZWQgSE9TVF9XSURFX0lOVCBtX3Vucm9sbGVkX2FkdnNpbWRfbml0ZXJzID0gMDsKICB1 bnNpZ25lZCBIT1NUX1dJREVfSU5UIG1fdW5yb2xsZWRfYWR2c2ltZF9zdG10cyA9IDA7CgogIC8q IElmIHdlJ3JlIHZlY3Rvcml6aW5nIGEgbG9vcCB0aGF0IGV4ZWN1dGVzIGEgY29uc3RhbnQgbnVt YmVyIG9mIHRpbWVzLAogICAgIHRoaXMgdmFyaWFibGUgZ2l2ZXMgdGhlIG51bWJlciBvZiB0aW1l cyB0aGF0IHRoZSB2ZWN0b3IgbG9vcCB3b3VsZAogICAgIGl0ZXJhdGUsIG90aGVyd2lzZSBpdCBp cyB6ZXJvLiAgKi8KICB1aW50NjRfdCBtX251bV92ZWN0b3JfaXRlcmF0aW9ucyA9IDA7CgogIC8q IFVzZWQgb25seSB3aGVuIHZlY3Rvcml6aW5nIGxvb3BzLiAgRXN0aW1hdGVzIHRoZSBudW1iZXIg YW5kIGtpbmQgb2YKICAgICBvcGVyYXRpb25zIHRoYXQgd291bGQgYmUgbmVlZGVkIGJ5IG9uZSBp dGVyYXRpb24gb2YgdGhlIHNjYWxhcgogICAgIG9yIHZlY3RvciBsb29wLiAgVGhlcmUgaXMgb25l IGVudHJ5IGZvciBlYWNoIHR1bmluZyBvcHRpb24gb2YKICAgICBpbnRlcmVzdC4gICovCiAgYXV0 b192ZWM8YWFyY2g2NF92ZWNfb3BfY291bnQsIDI+IG1fb3BzOwp9OwoKYWFyY2g2NF92ZWN0b3Jf Y29zdHM6OmFhcmNoNjRfdmVjdG9yX2Nvc3RzICh2ZWNfaW5mbyAqdmluZm8sCgkJCQkJICAgIGJv b2wgY29zdGluZ19mb3Jfc2NhbGFyKQogIDogdmVjdG9yX2Nvc3RzICh2aW5mbywgY29zdGluZ19m b3Jfc2NhbGFyKSwKICAgIG1fdmVjX2ZsYWdzIChjb3N0aW5nX2Zvcl9zY2FsYXIgPyAwCgkJIDog YWFyY2g2NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAodmluZm8tPnZlY3Rvcl9tb2RlKSkKewogIGlm IChhdXRvICppc3N1ZV9pbmZvID0gYWFyY2g2NF90dW5lX3BhcmFtcy52ZWNfY29zdHMtPmlzc3Vl X2luZm8pCiAgICB7CiAgICAgIG1fb3BzLnF1aWNrX3B1c2ggKHsgaXNzdWVfaW5mbywgbV92ZWNf ZmxhZ3MgfSk7CiAgICAgIGlmIChhYXJjaDY0X3R1bmVfcGFyYW1zLnZlY19jb3N0cyA9PSAmbmVv dmVyc2U1MTJ0dmJfdmVjdG9yX2Nvc3QpCgl7CgkgIHVuc2lnbmVkIGludCB2Zl9mYWN0b3IgPSAo bV92ZWNfZmxhZ3MgJiBWRUNfQU5ZX1NWRSkgPyAyIDogMTsKCSAgbV9vcHMucXVpY2tfcHVzaCAo eyAmbmVvdmVyc2V2MV92ZWNfaXNzdWVfaW5mbywgbV92ZWNfZmxhZ3MsCgkJCSAgICAgIHZmX2Zh Y3RvciB9KTsKCX0KICAgIH0KfQoKLyogSW1wbGVtZW50IFRBUkdFVF9WRUNUT1JJWkVfQ1JFQVRF X0NPU1RTLiAgKi8KdmVjdG9yX2Nvc3RzICoKYWFyY2g2NF92ZWN0b3JpemVfY3JlYXRlX2Nvc3Rz ICh2ZWNfaW5mbyAqdmluZm8sIGJvb2wgY29zdGluZ19mb3Jfc2NhbGFyKQp7CiAgcmV0dXJuIG5l dyBhYXJjaDY0X3ZlY3Rvcl9jb3N0cyAodmluZm8sIGNvc3RpbmdfZm9yX3NjYWxhcik7Cn0KCi8q IFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IENQVSBzaG91bGQgdXNlIHRoZSBuZXcgY29zdHMg ZGVmaW5lZAogICBpbiBHQ0MgMTEuICBUaGlzIHNob3VsZCBiZSByZW1vdmVkIGZvciBHQ0MgMTIg YW5kIGFib3ZlLCB3aXRoIHRoZQogICBjb3N0cyBhcHBseWluZyB0byBhbGwgQ1BVcyBpbnN0ZWFk LiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2NF91c2VfbmV3X3ZlY3Rvcl9jb3N0c19wICgpCnsKICBy ZXR1cm4gKGFhcmNoNjRfdHVuZV9wYXJhbXMuZXh0cmFfdHVuaW5nX2ZsYWdzCgkgICYgQUFSQ0g2 NF9FWFRSQV9UVU5FX1VTRV9ORVdfVkVDVE9SX0NPU1RTKTsKfQoKLyogUmV0dXJuIHRoZSBhcHBy b3ByaWF0ZSBTSU1EIGNvc3RzIGZvciB2ZWN0b3JzIG9mIHR5cGUgVkVDVFlQRS4gICovCnN0YXRp YyBjb25zdCBzaW1kX3ZlY19jb3N0ICoKYWFyY2g2NF9zaW1kX3ZlY19jb3N0cyAodHJlZSB2ZWN0 eXBlKQp7CiAgY29uc3QgY3B1X3ZlY3Rvcl9jb3N0ICpjb3N0cyA9IGFhcmNoNjRfdHVuZV9wYXJh bXMudmVjX2Nvc3RzOwogIGlmICh2ZWN0eXBlICE9IE5VTEwKICAgICAgJiYgYWFyY2g2NF9zdmVf bW9kZV9wIChUWVBFX01PREUgKHZlY3R5cGUpKQogICAgICAmJiBjb3N0cy0+c3ZlICE9IE5VTEwp CiAgICByZXR1cm4gY29zdHMtPnN2ZTsKICByZXR1cm4gY29zdHMtPmFkdnNpbWQ7Cn0KCi8qIFJl dHVybiB0aGUgYXBwcm9wcmlhdGUgU0lNRCBjb3N0cyBmb3IgdmVjdG9ycyB3aXRoIFZFQ18qIGZs YWdzIEZMQUdTLiAgKi8Kc3RhdGljIGNvbnN0IHNpbWRfdmVjX2Nvc3QgKgphYXJjaDY0X3NpbWRf dmVjX2Nvc3RzX2Zvcl9mbGFncyAodW5zaWduZWQgaW50IGZsYWdzKQp7CiAgY29uc3QgY3B1X3Zl Y3Rvcl9jb3N0ICpjb3N0cyA9IGFhcmNoNjRfdHVuZV9wYXJhbXMudmVjX2Nvc3RzOwogIGlmICgo ZmxhZ3MgJiBWRUNfQU5ZX1NWRSkgJiYgY29zdHMtPnN2ZSkKICAgIHJldHVybiBjb3N0cy0+c3Zl OwogIHJldHVybiBjb3N0cy0+YWR2c2ltZDsKfQoKLyogSWYgU1RNVF9JTkZPIGlzIGEgbWVtb3J5 IHJlZmVyZW5jZSwgcmV0dXJuIHRoZSBzY2FsYXIgbWVtb3J5IHR5cGUsCiAgIG90aGVyd2lzZSBy ZXR1cm4gbnVsbC4gICovCnN0YXRpYyB0cmVlCmFhcmNoNjRfZHJfdHlwZSAoc3RtdF92ZWNfaW5m byBzdG10X2luZm8pCnsKICBpZiAoYXV0byBkciA9IFNUTVRfVklORk9fREFUQV9SRUYgKHN0bXRf aW5mbykpCiAgICByZXR1cm4gVFJFRV9UWVBFIChEUl9SRUYgKGRyKSk7CiAgcmV0dXJuIE5VTExf VFJFRTsKfQoKLyogRGVjaWRlIHdoZXRoZXIgdG8gdXNlIHRoZSB1bnJvbGxpbmcgaGV1cmlzdGlj IGRlc2NyaWJlZCBhYm92ZQogICBtX3Vucm9sbGVkX2FkdnNpbWRfbml0ZXJzLCB1cGRhdGluZyB0 aGF0IGZpZWxkIGlmIHNvLiAgTE9PUF9WSU5GTwogICBkZXNjcmliZXMgdGhlIGxvb3AgdGhhdCB3 ZSdyZSB2ZWN0b3JpemluZy4gICovCnZvaWQKYWFyY2g2NF92ZWN0b3JfY29zdHM6OgpyZWNvcmRf cG90ZW50aWFsX2FkdnNpbWRfdW5yb2xsaW5nIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8pCnsK ICAvKiBUaGUgaGV1cmlzdGljIG9ubHkgbWFrZXMgc2Vuc2Ugb24gdGFyZ2V0cyB0aGF0IGhhdmUg dGhlIHNhbWUKICAgICB2ZWN0b3IgdGhyb3VnaHB1dCBmb3IgU1ZFIGFuZCBBZHZhbmNlZCBTSU1E LiAgKi8KICBpZiAoIShhYXJjaDY0X3R1bmVfcGFyYW1zLmV4dHJhX3R1bmluZ19mbGFncwoJJiBB QVJDSDY0X0VYVFJBX1RVTkVfTUFUQ0hFRF9WRUNUT1JfVEhST1VHSFBVVCkpCiAgICByZXR1cm47 CgogIC8qIFdlIG9ubHkgd2FudCB0byBhcHBseSB0aGUgaGV1cmlzdGljIGlmIExPT1BfVklORk8g aXMgYmVpbmcKICAgICB2ZWN0b3JpemVkIGZvciBTVkUuICAqLwogIGlmICghKG1fdmVjX2ZsYWdz ICYgVkVDX0FOWV9TVkUpKQogICAgcmV0dXJuOwoKICAvKiBDaGVjayB3aGV0aGVyIGl0IGlzIHBv c3NpYmxlIGluIHByaW5jaXBsZSB0byB1c2UgQWR2YW5jZWQgU0lNRAogICAgIGluc3RlYWQuICAq LwogIGlmIChhYXJjaDY0X2F1dG92ZWNfcHJlZmVyZW5jZSA9PSAyKQogICAgcmV0dXJuOwoKICAv KiBXZSBkb24ndCB3YW50IHRvIGFwcGx5IHRoZSBoZXVyaXN0aWMgdG8gb3V0ZXIgbG9vcHMsIHNp bmNlIGl0J3MKICAgICBoYXJkZXIgdG8gdHJhY2sgdHdvIGxldmVscyBvZiB1bnJvbGxpbmcuICAq LwogIGlmIChMT09QX1ZJTkZPX0xPT1AgKGxvb3BfdmluZm8pLT5pbm5lcikKICAgIHJldHVybjsK CiAgLyogT25seSBoYW5kbGUgY2FzZXMgaW4gd2hpY2ggdGhlIG51bWJlciBvZiBBZHZhbmNlZCBT SU1EIGl0ZXJhdGlvbnMKICAgICB3b3VsZCBiZSBrbm93biBhdCBjb21waWxlIHRpbWUgYnV0IHRo ZSBudW1iZXIgb2YgU1ZFIGl0ZXJhdGlvbnMKICAgICB3b3VsZCBub3QuICAqLwogIGlmICghTE9P UF9WSU5GT19OSVRFUlNfS05PV05fUCAobG9vcF92aW5mbykKICAgICAgfHwgYWFyY2g2NF9zdmVf dmcuaXNfY29uc3RhbnQgKCkpCiAgICByZXR1cm47CgogIC8qIEd1ZXNzIGhvdyBtYW55IHRpbWVz IHRoZSBBZHZhbmNlZCBTSU1EIGxvb3Agd291bGQgaXRlcmF0ZSBhbmQgbWFrZQogICAgIHN1cmUg dGhhdCBpdCBpcyB3aXRoaW4gdGhlIGNvbXBsZXRlIHVucm9sbGluZyBsaW1pdC4gIEV2ZW4gaWYg dGhlCiAgICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaXMgc21hbGwgZW5vdWdoLCB0aGUgbnVtYmVy IG9mIHN0YXRlbWVudHMgbWlnaHQKICAgICBub3QgYmUsIHdoaWNoIGlzIHdoeSB3ZSBuZWVkIHRv IGVzdGltYXRlIHRoZSBudW1iZXIgb2Ygc3RhdGVtZW50cyB0b28uICAqLwogIHVuc2lnbmVkIGlu dCBlc3RpbWF0ZWRfdnEgPSBhYXJjaDY0X2VzdGltYXRlZF9zdmVfdnEgKCk7CiAgdW5zaWduZWQg aW50IGFkdnNpbWRfdmYgPSBDRUlMICh2ZWN0X3ZmX2Zvcl9jb3N0IChsb29wX3ZpbmZvKSwgZXN0 aW1hdGVkX3ZxKTsKICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHVucm9sbGVkX2FkdnNpbWRfbml0 ZXJzCiAgICA9IExPT1BfVklORk9fSU5UX05JVEVSUyAobG9vcF92aW5mbykgLyBhZHZzaW1kX3Zm OwogIGlmICh1bnJvbGxlZF9hZHZzaW1kX25pdGVycyA+ICh1bnNpZ25lZCBpbnQpIHBhcmFtX21h eF9jb21wbGV0ZWx5X3BlZWxfdGltZXMpCiAgICByZXR1cm47CgogIC8qIFJlY29yZCB0aGF0IHdl J3JlIGFwcGx5aW5nIHRoZSBoZXVyaXN0aWMgYW5kIHNob3VsZCB0cnkgdG8gZXN0aW1hdGUKICAg ICB0aGUgbnVtYmVyIG9mIHN0YXRlbWVudHMgaW4gdGhlIEFkdmFuY2VkIFNJTUQgbG9vcC4gICov CiAgbV91bnJvbGxlZF9hZHZzaW1kX25pdGVycyA9IHVucm9sbGVkX2FkdnNpbWRfbml0ZXJzOwp9 CgovKiBEbyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYWFyY2g2NF92ZWN0b3JfY29z dHMgZ2l2ZW4gdGhhdCB3ZSdyZQogICBjb3N0aW5nIHRoZSBsb29wIHZlY3Rvcml6YXRpb24gZGVz Y3JpYmVkIGJ5IExPT1BfVklORk8uICAqLwp2b2lkCmFhcmNoNjRfdmVjdG9yX2Nvc3RzOjphbmFs eXplX2xvb3BfdmluZm8gKGxvb3BfdmVjX2luZm8gbG9vcF92aW5mbykKewogIC8qIFJlY29yZCB0 aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIHZlY3RvciBsb29wIHdvdWxkIGV4ZWN1dGUsCiAg ICAgaWYga25vd24uICAqLwogIGNsYXNzIGxvb3AgKmxvb3AgPSBMT09QX1ZJTkZPX0xPT1AgKGxv b3BfdmluZm8pOwogIGF1dG8gc2NhbGFyX25pdGVycyA9IG1heF9zdG10X2V4ZWN1dGlvbnNfaW50 IChsb29wKTsKICBpZiAoc2NhbGFyX25pdGVycyA+PSAwKQogICAgewogICAgICB1bnNpZ25lZCBp bnQgdmYgPSB2ZWN0X3ZmX2Zvcl9jb3N0IChsb29wX3ZpbmZvKTsKICAgICAgaWYgKExPT1BfVklO Rk9fTUFTS1MgKGxvb3BfdmluZm8pLmlzX2VtcHR5ICgpKQoJbV9udW1fdmVjdG9yX2l0ZXJhdGlv bnMgPSBzY2FsYXJfbml0ZXJzIC8gdmY7CiAgICAgIGVsc2UKCW1fbnVtX3ZlY3Rvcl9pdGVyYXRp b25zID0gQ0VJTCAoc2NhbGFyX25pdGVycywgdmYpOwogICAgfQoKICAvKiBEZXRlY3Qgd2hldGhl ciB3ZSdyZSB2ZWN0b3JpemluZyBmb3IgU1ZFIGFuZCBzaG91bGQgYXBwbHkgdGhlIHVucm9sbGlu ZwogICAgIGhldXJpc3RpYyBkZXNjcmliZWQgYWJvdmUgbV91bnJvbGxlZF9hZHZzaW1kX25pdGVy cy4gICovCiAgcmVjb3JkX3BvdGVudGlhbF9hZHZzaW1kX3Vucm9sbGluZyAobG9vcF92aW5mbyk7 CgogIC8qIFJlY29yZCB0aGUgaXNzdWUgaW5mb3JtYXRpb24gZm9yIGFueSBTVkUgV0hJTEUgaW5z dHJ1Y3Rpb25zIHRoYXQgdGhlCiAgICAgbG9vcCBuZWVkcy4gICovCiAgaWYgKCFtX29wcy5pc19l bXB0eSAoKSAmJiAhTE9PUF9WSU5GT19NQVNLUyAobG9vcF92aW5mbykuaXNfZW1wdHkgKCkpCiAg ICB7CiAgICAgIHVuc2lnbmVkIGludCBudW1fbWFza3MgPSAwOwogICAgICByZ3JvdXBfY29udHJv bHMgKnJnbTsKICAgICAgdW5zaWduZWQgaW50IG51bV92ZWN0b3JzX20xOwogICAgICBGT1JfRUFD SF9WRUNfRUxUIChMT09QX1ZJTkZPX01BU0tTIChsb29wX3ZpbmZvKSwgbnVtX3ZlY3RvcnNfbTEs IHJnbSkKCWlmIChyZ20tPnR5cGUpCgkgIG51bV9tYXNrcyArPSBudW1fdmVjdG9yc19tMSArIDE7 CiAgICAgIGZvciAoYXV0byAmb3BzIDogbV9vcHMpCglpZiAoYXV0byAqaXNzdWUgPSBvcHMuc3Zl X2lzc3VlX2luZm8gKCkpCgkgIG9wcy5wcmVkX29wcyArPSBudW1fbWFza3MgKiBpc3N1ZS0+d2hp bGVfcHJlZF9vcHM7CiAgICB9Cn0KCi8qIEltcGxlbWVudCB0YXJnZXRtLnZlY3Rvcml6ZS5idWls dGluX3ZlY3Rvcml6YXRpb25fY29zdC4gICovCnN0YXRpYyBpbnQKYWFyY2g2NF9idWlsdGluX3Zl Y3Rvcml6YXRpb25fY29zdCAoZW51bSB2ZWN0X2Nvc3RfZm9yX3N0bXQgdHlwZV9vZl9jb3N0LAoJ CQkJICAgIHRyZWUgdmVjdHlwZSwKCQkJCSAgICBpbnQgbWlzYWxpZ24gQVRUUklCVVRFX1VOVVNF RCkKewogIHVuc2lnbmVkIGVsZW1lbnRzOwogIGNvbnN0IGNwdV92ZWN0b3JfY29zdCAqY29zdHMg PSBhYXJjaDY0X3R1bmVfcGFyYW1zLnZlY19jb3N0czsKICBib29sIGZwID0gZmFsc2U7CgogIGlm ICh2ZWN0eXBlICE9IE5VTEwpCiAgICBmcCA9IEZMT0FUX1RZUEVfUCAodmVjdHlwZSk7CgogIGNv bnN0IHNpbWRfdmVjX2Nvc3QgKnNpbWRfY29zdHMgPSBhYXJjaDY0X3NpbWRfdmVjX2Nvc3RzICh2 ZWN0eXBlKTsKCiAgc3dpdGNoICh0eXBlX29mX2Nvc3QpCiAgICB7CiAgICAgIGNhc2Ugc2NhbGFy X3N0bXQ6CglyZXR1cm4gZnAgPyBjb3N0cy0+c2NhbGFyX2ZwX3N0bXRfY29zdCA6IGNvc3RzLT5z Y2FsYXJfaW50X3N0bXRfY29zdDsKCiAgICAgIGNhc2Ugc2NhbGFyX2xvYWQ6CglyZXR1cm4gY29z dHMtPnNjYWxhcl9sb2FkX2Nvc3Q7CgogICAgICBjYXNlIHNjYWxhcl9zdG9yZToKCXJldHVybiBj b3N0cy0+c2NhbGFyX3N0b3JlX2Nvc3Q7CgogICAgICBjYXNlIHZlY3Rvcl9zdG10OgoJcmV0dXJu IGZwID8gc2ltZF9jb3N0cy0+ZnBfc3RtdF9jb3N0CgkJICA6IHNpbWRfY29zdHMtPmludF9zdG10 X2Nvc3Q7CgogICAgICBjYXNlIHZlY3Rvcl9sb2FkOgoJcmV0dXJuIHNpbWRfY29zdHMtPmFsaWdu X2xvYWRfY29zdDsKCiAgICAgIGNhc2UgdmVjdG9yX3N0b3JlOgoJcmV0dXJuIHNpbWRfY29zdHMt PnN0b3JlX2Nvc3Q7CgogICAgICBjYXNlIHZlY190b19zY2FsYXI6CglyZXR1cm4gc2ltZF9jb3N0 cy0+dmVjX3RvX3NjYWxhcl9jb3N0OwoKICAgICAgY2FzZSBzY2FsYXJfdG9fdmVjOgoJcmV0dXJu IHNpbWRfY29zdHMtPnNjYWxhcl90b192ZWNfY29zdDsKCiAgICAgIGNhc2UgdW5hbGlnbmVkX2xv YWQ6CiAgICAgIGNhc2UgdmVjdG9yX2dhdGhlcl9sb2FkOgoJcmV0dXJuIHNpbWRfY29zdHMtPnVu YWxpZ25fbG9hZF9jb3N0OwoKICAgICAgY2FzZSB1bmFsaWduZWRfc3RvcmU6CiAgICAgIGNhc2Ug dmVjdG9yX3NjYXR0ZXJfc3RvcmU6CglyZXR1cm4gc2ltZF9jb3N0cy0+dW5hbGlnbl9zdG9yZV9j b3N0OwoKICAgICAgY2FzZSBjb25kX2JyYW5jaF90YWtlbjoKCXJldHVybiBjb3N0cy0+Y29uZF90 YWtlbl9icmFuY2hfY29zdDsKCiAgICAgIGNhc2UgY29uZF9icmFuY2hfbm90X3Rha2VuOgoJcmV0 dXJuIGNvc3RzLT5jb25kX25vdF90YWtlbl9icmFuY2hfY29zdDsKCiAgICAgIGNhc2UgdmVjX3Bl cm06CglyZXR1cm4gc2ltZF9jb3N0cy0+cGVybXV0ZV9jb3N0OwoKICAgICAgY2FzZSB2ZWNfcHJv bW90ZV9kZW1vdGU6CglyZXR1cm4gZnAgPyBzaW1kX2Nvc3RzLT5mcF9zdG10X2Nvc3QKCQkgIDog c2ltZF9jb3N0cy0+aW50X3N0bXRfY29zdDsKCiAgICAgIGNhc2UgdmVjX2NvbnN0cnVjdDoKCWVs ZW1lbnRzID0gZXN0aW1hdGVkX3BvbHlfdmFsdWUgKFRZUEVfVkVDVE9SX1NVQlBBUlRTICh2ZWN0 eXBlKSk7CglyZXR1cm4gZWxlbWVudHMgLyAyICsgMTsKCiAgICAgIGRlZmF1bHQ6CglnY2NfdW5y ZWFjaGFibGUgKCk7CiAgICB9Cn0KCi8qIFJldHVybiB0cnVlIGlmIGFuIGFjY2VzcyBvZiBraW5k IEtJTkQgZm9yIFNUTVRfSU5GTyByZXByZXNlbnRzIG9uZQogICB2ZWN0b3Igb2YgYW4gTERbMjM0 XSBvciBTVFsyMzRdIG9wZXJhdGlvbi4gIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mCiAgIHZl Y3RvcnMgKDIsIDMgb3IgNCkgaWYgc28sIG90aGVyd2lzZSByZXR1cm4gYSB2YWx1ZSBvdXRzaWRl IHRoYXQgcmFuZ2UuICAqLwpzdGF0aWMgaW50CmFhcmNoNjRfbGQyMzRfc3QyMzRfdmVjdG9ycyAo dmVjdF9jb3N0X2Zvcl9zdG10IGtpbmQsIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvKQp7CiAgaWYg KChraW5kID09IHZlY3Rvcl9sb2FkCiAgICAgICB8fCBraW5kID09IHVuYWxpZ25lZF9sb2FkCiAg ICAgICB8fCBraW5kID09IHZlY3Rvcl9zdG9yZQogICAgICAgfHwga2luZCA9PSB1bmFsaWduZWRf c3RvcmUpCiAgICAgICYmIFNUTVRfVklORk9fREFUQV9SRUYgKHN0bXRfaW5mbykpCiAgICB7CiAg ICAgIHN0bXRfaW5mbyA9IERSX0dST1VQX0ZJUlNUX0VMRU1FTlQgKHN0bXRfaW5mbyk7CiAgICAg IGlmIChzdG10X2luZm8KCSAgJiYgU1RNVF9WSU5GT19NRU1PUllfQUNDRVNTX1RZUEUgKHN0bXRf aW5mbykgPT0gVk1BVF9MT0FEX1NUT1JFX0xBTkVTKQoJcmV0dXJuIERSX0dST1VQX1NJWkUgKHN0 bXRfaW5mbyk7CiAgICB9CiAgcmV0dXJuIDA7Cn0KCi8qIFJldHVybiB0cnVlIGlmIGNyZWF0aW5n IG11bHRpcGxlIGNvcGllcyBvZiBTVE1UX0lORk8gZm9yIEFkdmFuY2VkIFNJTUQKICAgdmVjdG9y cyB3b3VsZCBwcm9kdWNlIGEgc2VyaWVzIG9mIExEUCBvciBTVFAgb3BlcmF0aW9ucy4gIEtJTkQg aXMgdGhlCiAgIGtpbmQgb2Ygc3RhdGVtZW50IHRoYXQgU1RNVF9JTkZPIHJlcHJlc2VudHMuICAq LwpzdGF0aWMgYm9vbAphYXJjaDY0X2FkdnNpbWRfbGRwX3N0cF9wIChlbnVtIHZlY3RfY29zdF9m b3Jfc3RtdCBraW5kLAoJCQkgICBzdG10X3ZlY19pbmZvIHN0bXRfaW5mbykKewogIHN3aXRjaCAo a2luZCkKICAgIHsKICAgIGNhc2UgdmVjdG9yX2xvYWQ6CiAgICBjYXNlIHZlY3Rvcl9zdG9yZToK ICAgIGNhc2UgdW5hbGlnbmVkX2xvYWQ6CiAgICBjYXNlIHVuYWxpZ25lZF9zdG9yZToKICAgICAg YnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICBpZiAoYWFy Y2g2NF90dW5lX3BhcmFtcy5leHRyYV90dW5pbmdfZmxhZ3MKICAgICAgJiBBQVJDSDY0X0VYVFJB X1RVTkVfTk9fTERQX1NUUF9RUkVHUykKICAgIHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIGlzX2dp bXBsZV9hc3NpZ24gKHN0bXRfaW5mby0+c3RtdCk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIFNUTVRf SU5GTyBpcyB0aGUgc2Vjb25kIHBhcnQgb2YgYSB0d28tc3RhdGVtZW50IG11bHRpcGx5LWFkZAog ICBvciBtdWx0aXBseS1zdWJ0cmFjdCBzZXF1ZW5jZSB0aGF0IG1pZ2h0IGJlIHN1aXRhYmxlIGZv ciBmdXNpbmcgaW50byBhCiAgIHNpbmdsZSBpbnN0cnVjdGlvbi4gIElmIFZFQ19GTEFHUyBpcyB6 ZXJvLCBhbmFseXplIHRoZSBvcGVyYXRpb24gYXMKICAgYSBzY2FsYXIgb25lLCBvdGhlcndpc2Ug YW5hbHl6ZSBpdCBhcyBhbiBvcGVyYXRpb24gb24gdmVjdG9ycyB3aXRoIHRob3NlCiAgIFZFQ18q IGZsYWdzLiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2NF9tdWx0aXBseV9hZGRfcCAodmVjX2luZm8g KnZpbmZvLCBzdG10X3ZlY19pbmZvIHN0bXRfaW5mbywKCQkJdW5zaWduZWQgaW50IHZlY19mbGFn cykKewogIGdhc3NpZ24gKmFzc2lnbiA9IGR5bl9jYXN0PGdhc3NpZ24gKj4gKHN0bXRfaW5mby0+ c3RtdCk7CiAgaWYgKCFhc3NpZ24pCiAgICByZXR1cm4gZmFsc2U7CiAgdHJlZV9jb2RlIGNvZGUg PSBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChhc3NpZ24pOwogIGlmIChjb2RlICE9IFBMVVNfRVhQ UiAmJiBjb2RlICE9IE1JTlVTX0VYUFIpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChDT05TVEFO VF9DTEFTU19QIChnaW1wbGVfYXNzaWduX3JoczEgKGFzc2lnbikpCiAgICAgIHx8IENPTlNUQU5U X0NMQVNTX1AgKGdpbXBsZV9hc3NpZ25fcmhzMiAoYXNzaWduKSkpCiAgICByZXR1cm4gZmFsc2U7 CgogIGZvciAoaW50IGkgPSAxOyBpIDwgMzsgKytpKQogICAgewogICAgICB0cmVlIHJocyA9IGdp bXBsZV9vcCAoYXNzaWduLCBpKTsKICAgICAgLyogPz8/IFNob3VsZCB3ZSB0cnkgdG8gY2hlY2sg Zm9yIGEgc2luZ2xlIHVzZSBhcyB3ZWxsPyAgKi8KICAgICAgaWYgKFRSRUVfQ09ERSAocmhzKSAh PSBTU0FfTkFNRSkKCWNvbnRpbnVlOwoKICAgICAgc3RtdF92ZWNfaW5mbyBkZWZfc3RtdF9pbmZv ID0gdmluZm8tPmxvb2t1cF9kZWYgKHJocyk7CiAgICAgIGlmICghZGVmX3N0bXRfaW5mbwoJICB8 fCBTVE1UX1ZJTkZPX0RFRl9UWVBFIChkZWZfc3RtdF9pbmZvKSAhPSB2ZWN0X2ludGVybmFsX2Rl ZikKCWNvbnRpbnVlOwogICAgICBnYXNzaWduICpyaHNfYXNzaWduID0gZHluX2Nhc3Q8Z2Fzc2ln biAqPiAoZGVmX3N0bXRfaW5mby0+c3RtdCk7CiAgICAgIGlmICghcmhzX2Fzc2lnbiB8fCBnaW1w bGVfYXNzaWduX3Joc19jb2RlIChyaHNfYXNzaWduKSAhPSBNVUxUX0VYUFIpCgljb250aW51ZTsK CiAgICAgIGlmICh2ZWNfZmxhZ3MgJiBWRUNfQURWU0lNRCkKCXsKCSAgLyogU2NhbGFyIGFuZCBT VkUgY29kZSBjYW4gdGllIHRoZSByZXN1bHQgdG8gYW55IEZNTEEgaW5wdXQgKG9yIG5vbmUsCgkg ICAgIGFsdGhvdWdoIHRoYXQgcmVxdWlyZXMgYSBNT1ZQUkZYIGZvciBTVkUpLiAgSG93ZXZlciwg QWR2YW5jZWQgU0lNRAoJICAgICBvbmx5IHN1cHBvcnRzIE1MQSBmb3Jtcywgc28gd2lsbCByZXF1 aXJlIGEgbW92ZSBpZiB0aGUgcmVzdWx0CgkgICAgIGNhbm5vdCBiZSB0aWVkIHRvIHRoZSBhY2N1 bXVsYXRvci4gIFRoZSBtb3N0IGltcG9ydGFudCBjYXNlIGluCgkgICAgIHdoaWNoIHRoaXMgaXMg dHJ1ZSBpcyB3aGVuIHRoZSBhY2N1bXVsYXRvciBpbnB1dCBpcyBpbnZhcmlhbnQuICAqLwoJICBy aHMgPSBnaW1wbGVfb3AgKGFzc2lnbiwgMyAtIGkpOwoJICBpZiAoVFJFRV9DT0RFIChyaHMpICE9 IFNTQV9OQU1FKQoJICAgIHJldHVybiBmYWxzZTsKCSAgZGVmX3N0bXRfaW5mbyA9IHZpbmZvLT5s b29rdXBfZGVmIChyaHMpOwoJICBpZiAoIWRlZl9zdG10X2luZm8KCSAgICAgIHx8IFNUTVRfVklO Rk9fREVGX1RZUEUgKGRlZl9zdG10X2luZm8pID09IHZlY3RfZXh0ZXJuYWxfZGVmKQoJICAgIHJl dHVybiBmYWxzZTsKCX0KCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIHJldHVybiBmYWxzZTsK fQoKLyogV2UgYXJlIGNvbnNpZGVyaW5nIGltcGxlbWVudGluZyBTVE1UX0lORk8gdXNpbmcgU1ZF LiAgSWYgU1RNVF9JTkZPIGlzIGFuCiAgIGluLWxvb3AgcmVkdWN0aW9uIHRoYXQgU1ZFIHN1cHBv cnRzIGRpcmVjdGx5LCByZXR1cm4gaXRzIGxhdGVuY3kgaW4gY3ljbGVzLAogICBvdGhlcndpc2Ug cmV0dXJuIHplcm8uICBTVkVfQ09TVFMgc3BlY2lmaWVzIHRoZSBsYXRlbmNpZXMgb2YgdGhlIHJl bGV2YW50CiAgIGluc3RydWN0aW9ucy4gICovCnN0YXRpYyB1bnNpZ25lZCBpbnQKYWFyY2g2NF9z dmVfaW5fbG9vcF9yZWR1Y3Rpb25fbGF0ZW5jeSAodmVjX2luZm8gKnZpbmZvLAoJCQkJICAgICAg IHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvLAoJCQkJICAgICAgIGNvbnN0IHN2ZV92ZWNfY29zdCAq c3ZlX2Nvc3RzKQp7CiAgc3dpdGNoICh2ZWN0X3JlZHVjX3R5cGUgKHZpbmZvLCBzdG10X2luZm8p KQogICAgewogICAgY2FzZSBFWFRSQUNUX0xBU1RfUkVEVUNUSU9OOgogICAgICByZXR1cm4gc3Zl X2Nvc3RzLT5jbGFzdF9jb3N0OwoKICAgIGNhc2UgRk9MRF9MRUZUX1JFRFVDVElPTjoKICAgICAg c3dpdGNoIChUWVBFX01PREUgKFRSRUVfVFlQRSAoZ2ltcGxlX2dldF9saHMgKHN0bXRfaW5mby0+ c3RtdCkpKSkKCXsKCWNhc2UgRV9IRm1vZGU6CgljYXNlIEVfQkZtb2RlOgoJICByZXR1cm4gc3Zl X2Nvc3RzLT5mYWRkYV9mMTZfY29zdDsKCgljYXNlIEVfU0Ztb2RlOgoJICByZXR1cm4gc3ZlX2Nv c3RzLT5mYWRkYV9mMzJfY29zdDsKCgljYXNlIEVfREZtb2RlOgoJICByZXR1cm4gc3ZlX2Nvc3Rz LT5mYWRkYV9mNjRfY29zdDsKCglkZWZhdWx0OgoJICBicmVhazsKCX0KICAgICAgYnJlYWs7CiAg ICB9CgogIHJldHVybiAwOwp9CgovKiBTVE1UX0lORk8gZGVzY3JpYmVzIGEgbG9vcC1jYXJyaWVk IG9wZXJhdGlvbiBpbiB0aGUgb3JpZ2luYWwgc2NhbGFyIGNvZGUKICAgdGhhdCB3ZSBhcmUgY29u c2lkZXJpbmcgaW1wbGVtZW50aW5nIGFzIGEgcmVkdWN0aW9uLiAgUmV0dXJuIG9uZSBvZiB0aGUK ICAgZm9sbG93aW5nIHZhbHVlcywgZGVwZW5kaW5nIG9uIFZFQ19GTEFHUzoKCiAgIC0gSWYgVkVD X0ZMQUdTIGlzIHplcm8sIHJldHVybiB0aGUgbG9vcCBjYXJyeSBsYXRlbmN5IG9mIHRoZSBvcmln aW5hbAogICAgIHNjYWxhciBvcGVyYXRpb24uCgogICAtIElmIFZFQ19GTEFHUyAmIFZFQ19BRFZT SU1ELCByZXR1cm4gdGhlIGxvb3AgY2FycnkgbGF0ZW5jeSBvZiB0aGUKICAgICBBZHZhbmNlZCBT SU1EIGltcGxlbWVudGF0aW9uLgoKICAgLSBJZiBWRUNfRkxBR1MgJiBWRUNfQU5ZX1NWRSwgcmV0 dXJuIHRoZSBsb29wIGNhcnJ5IGxhdGVuY3kgb2YgdGhlCiAgICAgU1ZFIGltcGxlbWVudGF0aW9u LiAgKi8Kc3RhdGljIHVuc2lnbmVkIGludAphYXJjaDY0X2luX2xvb3BfcmVkdWN0aW9uX2xhdGVu Y3kgKHZlY19pbmZvICp2aW5mbywgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8sCgkJCQkgICB1bnNp Z25lZCBpbnQgdmVjX2ZsYWdzKQp7CiAgY29uc3QgY3B1X3ZlY3Rvcl9jb3N0ICp2ZWNfY29zdHMg PSBhYXJjaDY0X3R1bmVfcGFyYW1zLnZlY19jb3N0czsKICBjb25zdCBzdmVfdmVjX2Nvc3QgKnN2 ZV9jb3N0cyA9IG51bGxwdHI7CiAgaWYgKHZlY19mbGFncyAmIFZFQ19BTllfU1ZFKQogICAgc3Zl X2Nvc3RzID0gYWFyY2g2NF90dW5lX3BhcmFtcy52ZWNfY29zdHMtPnN2ZTsKCiAgLyogSWYgdGhl IGNhbGxlciBpcyBhc2tpbmcgZm9yIHRoZSBTVkUgbGF0ZW5jeSwgY2hlY2sgZm9yIGZvcm1zIG9m IHJlZHVjdGlvbgogICAgIHRoYXQgb25seSBTVkUgY2FuIGhhbmRsZSBkaXJlY3RseS4gICovCiAg aWYgKHN2ZV9jb3N0cykKICAgIHsKICAgICAgdW5zaWduZWQgaW50IGxhdGVuY3kKCT0gYWFyY2g2 NF9zdmVfaW5fbG9vcF9yZWR1Y3Rpb25fbGF0ZW5jeSAodmluZm8sIHN0bXRfaW5mbywgc3ZlX2Nv c3RzKTsKICAgICAgaWYgKGxhdGVuY3kpCglyZXR1cm4gbGF0ZW5jeTsKICAgIH0KCiAgLyogSGFu ZGxlIHNjYWxhciBjb3N0cy4gICovCiAgYm9vbCBpc19mbG9hdCA9IEZMT0FUX1RZUEVfUCAoVFJF RV9UWVBFIChnaW1wbGVfZ2V0X2xocyAoc3RtdF9pbmZvLT5zdG10KSkpOwogIGlmICh2ZWNfZmxh Z3MgPT0gMCkKICAgIHsKICAgICAgaWYgKGlzX2Zsb2F0KQoJcmV0dXJuIHZlY19jb3N0cy0+c2Nh bGFyX2ZwX3N0bXRfY29zdDsKICAgICAgcmV0dXJuIHZlY19jb3N0cy0+c2NhbGFyX2ludF9zdG10 X2Nvc3Q7CiAgICB9CgogIC8qIE90aGVyd2lzZSwgdGhlIGxvb3AgYm9keSBqdXN0IGNvbnRhaW5z IG5vcm1hbCBpbnRlZ2VyIG9yIEZQIG9wZXJhdGlvbnMsCiAgICAgd2l0aCBhIHZlY3RvciByZWR1 Y3Rpb24gb3V0c2lkZSB0aGUgbG9vcC4gICovCiAgY29uc3Qgc2ltZF92ZWNfY29zdCAqc2ltZF9j b3N0cwogICAgPSBhYXJjaDY0X3NpbWRfdmVjX2Nvc3RzX2Zvcl9mbGFncyAodmVjX2ZsYWdzKTsK ICBpZiAoaXNfZmxvYXQpCiAgICByZXR1cm4gc2ltZF9jb3N0cy0+ZnBfc3RtdF9jb3N0OwogIHJl dHVybiBzaW1kX2Nvc3RzLT5pbnRfc3RtdF9jb3N0Owp9CgovKiBTVE1UX0NPU1QgaXMgdGhlIGNv c3QgY2FsY3VsYXRlZCBieSBhYXJjaDY0X2J1aWx0aW5fdmVjdG9yaXphdGlvbl9jb3N0CiAgIGZv ciBTVE1UX0lORk8sIHdoaWNoIGhhcyBjb3N0IGtpbmQgS0lORC4gIElmIHRoaXMgaXMgYSBzY2Fs YXIgb3BlcmF0aW9uLAogICB0cnkgdG8gc3ViZGl2aWRlIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQg Y2F0ZWdvcml6YXRpb24gcHJvdmlkZWQgYnkgS0lORAogICB0byBnZXQgYSBtb3JlIGFjY3VyYXRl IGNvc3QuICAqLwpzdGF0aWMgZnJhY3Rpb25hbF9jb3N0CmFhcmNoNjRfZGV0ZWN0X3NjYWxhcl9z dG10X3N1YnR5cGUgKHZlY19pbmZvICp2aW5mbywgdmVjdF9jb3N0X2Zvcl9zdG10IGtpbmQsCgkJ CQkgICAgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8sCgkJCQkgICAgZnJhY3Rpb25hbF9jb3N0IHN0 bXRfY29zdCkKewogIC8qIERldGVjdCBhbiBleHRlbnNpb24gb2YgYSBsb2FkZWQgdmFsdWUuICBJ biBnZW5lcmFsLCB3ZSdsbCBiZSBhYmxlIHRvIGZ1c2UKICAgICB0aGUgZXh0ZW5zaW9uIHdpdGgg dGhlIGxvYWQuICAqLwogIGlmIChraW5kID09IHNjYWxhcl9zdG10ICYmIHZlY3RfaXNfZXh0ZW5k aW5nX2xvYWQgKHZpbmZvLCBzdG10X2luZm8pKQogICAgcmV0dXJuIDA7CgogIHJldHVybiBzdG10 X2Nvc3Q7Cn0KCi8qIFNUTVRfQ09TVCBpcyB0aGUgY29zdCBjYWxjdWxhdGVkIGJ5IGFhcmNoNjRf YnVpbHRpbl92ZWN0b3JpemF0aW9uX2Nvc3QKICAgZm9yIHRoZSB2ZWN0b3JpemVkIGZvcm0gb2Yg U1RNVF9JTkZPLCB3aGljaCBoYXMgY29zdCBraW5kIEtJTkQgYW5kIHdoaWNoCiAgIHdoZW4gdmVj dG9yaXplZCB3b3VsZCBvcGVyYXRlIG9uIHZlY3RvciB0eXBlIFZFQ1RZUEUuICBUcnkgdG8gc3Vi ZGl2aWRlCiAgIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgY2F0ZWdvcml6YXRpb24gcHJvdmlkZWQg YnkgS0lORCB0byBnZXQgYSBtb3JlCiAgIGFjY3VyYXRlIGNvc3QuICBXSEVSRSBzcGVjaWZpZXMg d2hlcmUgdGhlIGNvc3QgYXNzb2NpYXRlZCB3aXRoIEtJTkQKICAgb2NjdXJzLiAgKi8Kc3RhdGlj IGZyYWN0aW9uYWxfY29zdAphYXJjaDY0X2RldGVjdF92ZWN0b3Jfc3RtdF9zdWJ0eXBlICh2ZWNf aW5mbyAqdmluZm8sIHZlY3RfY29zdF9mb3Jfc3RtdCBraW5kLAoJCQkJICAgIHN0bXRfdmVjX2lu Zm8gc3RtdF9pbmZvLCB0cmVlIHZlY3R5cGUsCgkJCQkgICAgZW51bSB2ZWN0X2Nvc3RfbW9kZWxf bG9jYXRpb24gd2hlcmUsCgkJCQkgICAgZnJhY3Rpb25hbF9jb3N0IHN0bXRfY29zdCkKewogIGNv bnN0IHNpbWRfdmVjX2Nvc3QgKnNpbWRfY29zdHMgPSBhYXJjaDY0X3NpbWRfdmVjX2Nvc3RzICh2 ZWN0eXBlKTsKICBjb25zdCBzdmVfdmVjX2Nvc3QgKnN2ZV9jb3N0cyA9IG51bGxwdHI7CiAgaWYg KGFhcmNoNjRfc3ZlX21vZGVfcCAoVFlQRV9NT0RFICh2ZWN0eXBlKSkpCiAgICBzdmVfY29zdHMg PSBhYXJjaDY0X3R1bmVfcGFyYW1zLnZlY19jb3N0cy0+c3ZlOwoKICAvKiBJdCdzIGdlbmVyYWxs eSBiZXR0ZXIgdG8gYXZvaWQgY29zdGluZyBpbmR1Y3Rpb25zLCBzaW5jZSB0aGUgaW5kdWN0aW9u CiAgICAgd2lsbCB1c3VhbGx5IGJlIGhpZGRlbiBieSBvdGhlciBvcGVyYXRpb25zLiAgVGhpcyBp cyBwYXJ0aWN1bGFybHkgdHJ1ZQogICAgIGZvciB0aGluZ3MgbGlrZSBDT05EX1JFRFVDVElPTlMu ICAqLwogIGlmIChpc19hPGdwaGkgKj4gKHN0bXRfaW5mby0+c3RtdCkpCiAgICByZXR1cm4gMDsK CiAgLyogRGV0ZWN0IGNhc2VzIGluIHdoaWNoIHZlY190b19zY2FsYXIgaXMgZGVzY3JpYmluZyB0 aGUgZXh0cmFjdGlvbiBvZiBhCiAgICAgdmVjdG9yIGVsZW1lbnQgaW4gcHJlcGFyYXRpb24gZm9y IGEgc2NhbGFyIHN0b3JlLiAgVGhlIHN0b3JlIGl0c2VsZiBpcwogICAgIGNvc3RlZCBzZXBhcmF0 ZWx5LiAgKi8KICBpZiAodmVjdF9pc19zdG9yZV9lbHRfZXh0cmFjdGlvbiAoa2luZCwgc3RtdF9p bmZvKSkKICAgIHJldHVybiBzaW1kX2Nvc3RzLT5zdG9yZV9lbHRfZXh0cmFfY29zdDsKCiAgLyog RGV0ZWN0IFNWRSBnYXRoZXIgbG9hZHMsIHdoaWNoIGFyZSBjb3N0ZWQgYXMgYSBzaW5nbGUgc2Nh bGFyX2xvYWQKICAgICBmb3IgZWFjaCBlbGVtZW50LiAgV2UgdGhlcmVmb3JlIG5lZWQgdG8gZGl2 aWRlIHRoZSBmdWxsLWluc3RydWN0aW9uCiAgICAgY29zdCBieSB0aGUgbnVtYmVyIG9mIGVsZW1l bnRzIGluIHRoZSB2ZWN0b3IuICAqLwogIGlmIChraW5kID09IHNjYWxhcl9sb2FkCiAgICAgICYm IHN2ZV9jb3N0cwogICAgICAmJiBTVE1UX1ZJTkZPX01FTU9SWV9BQ0NFU1NfVFlQRSAoc3RtdF9p bmZvKSA9PSBWTUFUX0dBVEhFUl9TQ0FUVEVSKQogICAgewogICAgICB1bnNpZ25lZCBpbnQgbnVu aXRzID0gdmVjdF9udW5pdHNfZm9yX2Nvc3QgKHZlY3R5cGUpOwogICAgICBpZiAoR0VUX01PREVf VU5JVF9CSVRTSVpFIChUWVBFX01PREUgKHZlY3R5cGUpKSA9PSA2NCkKCXJldHVybiB7IHN2ZV9j b3N0cy0+Z2F0aGVyX2xvYWRfeDY0X2Nvc3QsIG51bml0cyB9OwogICAgICByZXR1cm4geyBzdmVf Y29zdHMtPmdhdGhlcl9sb2FkX3gzMl9jb3N0LCBudW5pdHMgfTsKICAgIH0KCiAgLyogRGV0ZWN0 IGNhc2VzIGluIHdoaWNoIGEgc2NhbGFyX3N0b3JlIGlzIHJlYWxseSBzdG9yaW5nIG9uZSBlbGVt ZW50CiAgICAgaW4gYSBzY2F0dGVyIG9wZXJhdGlvbi4gICovCiAgaWYgKGtpbmQgPT0gc2NhbGFy X3N0b3JlCiAgICAgICYmIHN2ZV9jb3N0cwogICAgICAmJiBTVE1UX1ZJTkZPX01FTU9SWV9BQ0NF U1NfVFlQRSAoc3RtdF9pbmZvKSA9PSBWTUFUX0dBVEhFUl9TQ0FUVEVSKQogICAgcmV0dXJuIHN2 ZV9jb3N0cy0+c2NhdHRlcl9zdG9yZV9lbHRfY29zdDsKCiAgLyogRGV0ZWN0IGNhc2VzIGluIHdo aWNoIHZlY190b19zY2FsYXIgcmVwcmVzZW50cyBhbiBpbi1sb29wIHJlZHVjdGlvbi4gICovCiAg aWYgKGtpbmQgPT0gdmVjX3RvX3NjYWxhcgogICAgICAmJiB3aGVyZSA9PSB2ZWN0X2JvZHkKICAg ICAgJiYgc3ZlX2Nvc3RzKQogICAgewogICAgICB1bnNpZ25lZCBpbnQgbGF0ZW5jeQoJPSBhYXJj aDY0X3N2ZV9pbl9sb29wX3JlZHVjdGlvbl9sYXRlbmN5ICh2aW5mbywgc3RtdF9pbmZvLCBzdmVf Y29zdHMpOwogICAgICBpZiAobGF0ZW5jeSkKCXJldHVybiBsYXRlbmN5OwogICAgfQoKICAvKiBE ZXRlY3QgY2FzZXMgaW4gd2hpY2ggdmVjX3RvX3NjYWxhciByZXByZXNlbnRzIGEgc2luZ2xlIHJl ZHVjdGlvbgogICAgIGluc3RydWN0aW9uIGxpa2UgRkFERFAgb3IgTUFYVi4gICovCiAgaWYgKGtp bmQgPT0gdmVjX3RvX3NjYWxhcgogICAgICAmJiB3aGVyZSA9PSB2ZWN0X2VwaWxvZ3VlCiAgICAg ICYmIHZlY3RfaXNfcmVkdWN0aW9uIChzdG10X2luZm8pKQogICAgc3dpdGNoIChHRVRfTU9ERV9J Tk5FUiAoVFlQRV9NT0RFICh2ZWN0eXBlKSkpCiAgICAgIHsKICAgICAgY2FzZSBFX1FJbW9kZToK CXJldHVybiBzaW1kX2Nvc3RzLT5yZWR1Y19pOF9jb3N0OwoKICAgICAgY2FzZSBFX0hJbW9kZToK CXJldHVybiBzaW1kX2Nvc3RzLT5yZWR1Y19pMTZfY29zdDsKCiAgICAgIGNhc2UgRV9TSW1vZGU6 CglyZXR1cm4gc2ltZF9jb3N0cy0+cmVkdWNfaTMyX2Nvc3Q7CgogICAgICBjYXNlIEVfREltb2Rl OgoJcmV0dXJuIHNpbWRfY29zdHMtPnJlZHVjX2k2NF9jb3N0OwoKICAgICAgY2FzZSBFX0hGbW9k ZToKICAgICAgY2FzZSBFX0JGbW9kZToKCXJldHVybiBzaW1kX2Nvc3RzLT5yZWR1Y19mMTZfY29z dDsKCiAgICAgIGNhc2UgRV9TRm1vZGU6CglyZXR1cm4gc2ltZF9jb3N0cy0+cmVkdWNfZjMyX2Nv c3Q7CgogICAgICBjYXNlIEVfREZtb2RlOgoJcmV0dXJuIHNpbWRfY29zdHMtPnJlZHVjX2Y2NF9j b3N0OwoKICAgICAgZGVmYXVsdDoKCWJyZWFrOwogICAgICB9CgogIC8qIE90aGVyd2lzZSBzdGlj ayB3aXRoIHRoZSBvcmlnaW5hbCBjYXRlZ29yaXphdGlvbi4gICovCiAgcmV0dXJuIHN0bXRfY29z dDsKfQoKLyogU1RNVF9DT1NUIGlzIHRoZSBjb3N0IGNhbGN1bGF0ZWQgYnkgYWFyY2g2NF9idWls dGluX3ZlY3Rvcml6YXRpb25fY29zdAogICBmb3IgU1RNVF9JTkZPLCB3aGljaCBoYXMgY29zdCBr aW5kIEtJTkQgYW5kIHdoaWNoIHdoZW4gdmVjdG9yaXplZCB3b3VsZAogICBvcGVyYXRlIG9uIHZl Y3RvciB0eXBlIFZFQ1RZUEUuICBBZGp1c3QgdGhlIGNvc3QgYXMgbmVjZXNzYXJ5IGZvciBTVkUK ICAgdGFyZ2V0cy4gICovCnN0YXRpYyBmcmFjdGlvbmFsX2Nvc3QKYWFyY2g2NF9zdmVfYWRqdXN0 X3N0bXRfY29zdCAoY2xhc3MgdmVjX2luZm8gKnZpbmZvLCB2ZWN0X2Nvc3RfZm9yX3N0bXQga2lu ZCwKCQkJICAgICAgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8sIHRyZWUgdmVjdHlwZSwKCQkJICAg ICAgZnJhY3Rpb25hbF9jb3N0IHN0bXRfY29zdCkKewogIC8qIFVubGlrZSB2ZWNfcHJvbW90ZV9k ZW1vdGUsIHZlY3Rvcl9zdG10IGNvbnZlcnNpb25zIGRvIG5vdCBjaGFuZ2UgdGhlCiAgICAgdmVj dG9yIHJlZ2lzdGVyIHNpemUgb3IgbnVtYmVyIG9mIHVuaXRzLiAgSW50ZWdlciBwcm9tb3Rpb25z IG9mIHRoaXMKICAgICB0eXBlIHRoZXJlZm9yZSBtYXAgdG8gU1hUW0JIV10gb3IgVVhUW0JIV10u CgogICAgIE1vc3QgbG9hZHMgaGF2ZSBleHRlbmRpbmcgZm9ybXMgdGhhdCBjYW4gZG8gdGhlIHNp Z24gb3IgemVybyBleHRlbnNpb24KICAgICBvbiB0aGUgZmx5LiAgT3B0aW1pc3RpY2FsbHkgYXNz dW1lIHRoYXQgYSBsb2FkIGZvbGxvd2VkIGJ5IGFuIGV4dGVuc2lvbgogICAgIHdpbGwgZm9sZCB0 byB0aGlzIGZvcm0gZHVyaW5nIGNvbWJpbmUsIGFuZCB0aGF0IHRoZSBleHRlbnNpb24gdGhlcmVm b3JlCiAgICAgY29tZXMgZm9yIGZyZWUuICAqLwogIGlmIChraW5kID09IHZlY3Rvcl9zdG10ICYm IHZlY3RfaXNfZXh0ZW5kaW5nX2xvYWQgKHZpbmZvLCBzdG10X2luZm8pKQogICAgc3RtdF9jb3N0 ID0gMDsKCiAgLyogRm9yIHNpbWlsYXIgcmVhc29ucywgdmVjdG9yX3N0bXQgaW50ZWdlciB0cnVu Y2F0aW9ucyBhcmUgYSBuby1vcCwKICAgICBiZWNhdXNlIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGUg dW51c2VkIHVwcGVyIGJpdHMgb2YgdGhlIHNvdXJjZS4gICovCiAgaWYgKGtpbmQgPT0gdmVjdG9y X3N0bXQgJiYgdmVjdF9pc19pbnRlZ2VyX3RydW5jYXRpb24gKHN0bXRfaW5mbykpCiAgICBzdG10 X2Nvc3QgPSAwOwoKICAvKiBBZHZhbmNlZCBTSU1EIGNhbiBsb2FkIGFuZCBzdG9yZSBwYWlycyBv ZiByZWdpc3RlcnMgdXNpbmcgTERQIGFuZCBTVFAsCiAgICAgYnV0IHRoZXJlIGFyZSBubyBlcXVp dmFsZW50IGluc3RydWN0aW9ucyBmb3IgU1ZFLiAgVGhpcyBtZWFucyB0aGF0CiAgICAgKGFsbCBv dGhlciB0aGluZ3MgYmVpbmcgZXF1YWwpIDEyOC1iaXQgU1ZFIG5lZWRzIHR3aWNlIGFzIG1hbnkg bG9hZAogICAgIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgYXMgQWR2YW5jZWQgU0lNRCBpbiBvcmRl ciB0byBwcm9jZXNzIHZlY3RvciBwYWlycy4KCiAgICAgQWxzbywgc2NhbGFyIGNvZGUgY2FuIG9m dGVuIHVzZSBMRFAgYW5kIFNUUCB0byBhY2Nlc3MgcGFpcnMgb2YgdmFsdWVzLAogICAgIHNvIGl0 IGlzIHRvbyBzaW1wbGlzdGljIHRvIHNheSB0aGF0IG9uZSBTVkUgbG9hZCBvciBzdG9yZSByZXBs YWNlcwogICAgIFZGIHNjYWxhciBsb2FkcyBhbmQgc3RvcmVzLgoKICAgICBJZGVhbGx5IHdlIHdv dWxkIGFjY291bnQgZm9yIHRoaXMgaW4gdGhlIHNjYWxhciBhbmQgQWR2YW5jZWQgU0lNRAogICAg IGNvc3RzIGJ5IG1ha2luZyBzdWl0YWJsZSBsb2FkL3N0b3JlIHBhaXJzIGFzIGNoZWFwIGFzIGEg c2luZ2xlCiAgICAgbG9hZC9zdG9yZS4gIEhvd2V2ZXIsIHRoYXQgd291bGQgYmUgYSB2ZXJ5IGlu dmFzaXZlIGNoYW5nZSBhbmQgaW4KICAgICBwcmFjdGljZSBpdCB0ZW5kcyB0byBzdHJlc3Mgb3Ro ZXIgcGFydHMgb2YgdGhlIGNvc3QgbW9kZWwgdG9vIG11Y2guCiAgICAgRS5nLiBzdG9yZXMgb2Yg c2NhbGFyIGNvbnN0YW50cyBjdXJyZW50bHkgY291bnQganVzdCBhIHN0b3JlLAogICAgIHdoZXJl YXMgc3RvcmVzIG9mIHZlY3RvciBjb25zdGFudHMgY291bnQgYSBzdG9yZSBhbmQgYSB2ZWNfaW5p dC4KICAgICBUaGlzIGlzIGFuIGFydGlmaWNpYWwgZGlzdGluY3Rpb24gZm9yIEFBcmNoNjQsIHdo ZXJlIHN0b3JlcyBvZgogICAgIG5vbnplcm8gc2NhbGFyIGNvbnN0YW50cyBuZWVkIHRoZSBzYW1l IGtpbmQgb2YgcmVnaXN0ZXIgaW52YXJpYW50CiAgICAgYXMgdmVjdG9yIHN0b3Jlcy4KCiAgICAg QW4gYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gZG91YmxlIHRoZSBjb3N0IG9mIGFueSBTVkUgbG9h ZHMgYW5kIHN0b3JlcwogICAgIHRoYXQgY291bGQgYmUgcGFpcmVkIGluIEFkdmFuY2VkIFNJTUQg KGFuZCBwb3NzaWJseSBhbHNvIHBhaXJlZCBpbgogICAgIHNjYWxhciBjb2RlKS4gIEJ1dCB0aGlz IHRlbmRzIHRvIHN0cmVzcyBvdGhlciBwYXJ0cyBvZiB0aGUgY29zdCBtb2RlbAogICAgIGluIHRo ZSBzYW1lIHdheS4gIEl0IGFsc28gbWVhbnMgdGhhdCB3ZSBjYW4gZmFsbCBiYWNrIHRvIEFkdmFu Y2VkIFNJTUQKICAgICBldmVuIGlmIGZ1bGwtbG9vcCBwcmVkaWNhdGlvbiB3b3VsZCBoYXZlIGJl ZW4gdXNlZnVsLgoKICAgICBIZXJlIHdlIGdvIGZvciBhIG1vcmUgY29uc2VydmF0aXZlIHZlcnNp b246IGRvdWJsZSB0aGUgY29zdHMgb2YgU1ZFCiAgICAgbG9hZHMgYW5kIHN0b3JlcyBpZiBvbmUg aXRlcmF0aW9uIG9mIHRoZSBzY2FsYXIgbG9vcCBwcm9jZXNzZXMgZW5vdWdoCiAgICAgZWxlbWVu dHMgZm9yIGl0IHRvIHVzZSBhIHdob2xlIG51bWJlciBvZiBBZHZhbmNlZCBTSU1EIExEUCBvciBT VFAKICAgICBpbnN0cnVjdGlvbnMuICBUaGlzIG1ha2VzIGl0IHZlcnkgbGlrZWx5IHRoYXQgdGhl IFZGIHdvdWxkIGJlIDEgZm9yCiAgICAgQWR2YW5jZWQgU0lNRCwgYW5kIHNvIG5vIGVwaWxvZ3Vl IHNob3VsZCBiZSBuZWVkZWQuICAqLwogIGlmIChTVE1UX1ZJTkZPX0dST1VQRURfQUNDRVNTIChz dG10X2luZm8pKQogICAgewogICAgICBzdG10X3ZlY19pbmZvIGZpcnN0ID0gRFJfR1JPVVBfRklS U1RfRUxFTUVOVCAoc3RtdF9pbmZvKTsKICAgICAgdW5zaWduZWQgaW50IGNvdW50ID0gRFJfR1JP VVBfU0laRSAoZmlyc3QpIC0gRFJfR1JPVVBfR0FQIChmaXJzdCk7CiAgICAgIHVuc2lnbmVkIGlu dCBlbHRfYml0cyA9IEdFVF9NT0RFX1VOSVRfQklUU0laRSAoVFlQRV9NT0RFICh2ZWN0eXBlKSk7 CiAgICAgIGlmIChtdWx0aXBsZV9wIChjb3VudCAqIGVsdF9iaXRzLCAyNTYpCgkgICYmIGFhcmNo NjRfYWR2c2ltZF9sZHBfc3RwX3AgKGtpbmQsIHN0bXRfaW5mbykpCglzdG10X2Nvc3QgKj0gMjsK ICAgIH0KCiAgcmV0dXJuIHN0bXRfY29zdDsKfQoKLyogU1RNVF9DT1NUIGlzIHRoZSBjb3N0IGNh bGN1bGF0ZWQgZm9yIFNUTVRfSU5GTywgd2hpY2ggaGFzIGNvc3Qga2luZCBLSU5ECiAgIGFuZCB3 aGljaCB3aGVuIHZlY3Rvcml6ZWQgd291bGQgb3BlcmF0ZSBvbiB2ZWN0b3IgdHlwZSBWRUNUWVBF LiAgQWRkIHRoZQogICBjb3N0IG9mIGFueSBlbWJlZGRlZCBvcGVyYXRpb25zLiAgKi8Kc3RhdGlj IGZyYWN0aW9uYWxfY29zdAphYXJjaDY0X2FkanVzdF9zdG10X2Nvc3QgKHZlY3RfY29zdF9mb3Jf c3RtdCBraW5kLCBzdG10X3ZlY19pbmZvIHN0bXRfaW5mbywKCQkJICB0cmVlIHZlY3R5cGUsIGZy YWN0aW9uYWxfY29zdCBzdG10X2Nvc3QpCnsKICBpZiAodmVjdHlwZSkKICAgIHsKICAgICAgY29u c3Qgc2ltZF92ZWNfY29zdCAqc2ltZF9jb3N0cyA9IGFhcmNoNjRfc2ltZF92ZWNfY29zdHMgKHZl Y3R5cGUpOwoKICAgICAgLyogRGV0ZWN0IGNhc2VzIGluIHdoaWNoIGEgdmVjdG9yIGxvYWQgb3Ig c3RvcmUgcmVwcmVzZW50cyBhbgoJIExEWzIzNF0gb3IgU1RbMjM0XSBpbnN0cnVjdGlvbi4gICov CiAgICAgIHN3aXRjaCAoYWFyY2g2NF9sZDIzNF9zdDIzNF92ZWN0b3JzIChraW5kLCBzdG10X2lu Zm8pKQoJewoJY2FzZSAyOgoJICBzdG10X2Nvc3QgKz0gc2ltZF9jb3N0cy0+bGQyX3N0Ml9wZXJt dXRlX2Nvc3Q7CgkgIGJyZWFrOwoKCWNhc2UgMzoKCSAgc3RtdF9jb3N0ICs9IHNpbWRfY29zdHMt PmxkM19zdDNfcGVybXV0ZV9jb3N0OwoJICBicmVhazsKCgljYXNlIDQ6CgkgIHN0bXRfY29zdCAr PSBzaW1kX2Nvc3RzLT5sZDRfc3Q0X3Blcm11dGVfY29zdDsKCSAgYnJlYWs7Cgl9CgogICAgICBp ZiAoa2luZCA9PSB2ZWN0b3Jfc3RtdCB8fCBraW5kID09IHZlY190b19zY2FsYXIpCglpZiAodHJl ZSBjbXBfdHlwZSA9IHZlY3RfZW1iZWRkZWRfY29tcGFyaXNvbl90eXBlIChzdG10X2luZm8pKQoJ ICB7CgkgICAgaWYgKEZMT0FUX1RZUEVfUCAoY21wX3R5cGUpKQoJICAgICAgc3RtdF9jb3N0ICs9 IHNpbWRfY29zdHMtPmZwX3N0bXRfY29zdDsKCSAgICBlbHNlCgkgICAgICBzdG10X2Nvc3QgKz0g c2ltZF9jb3N0cy0+aW50X3N0bXRfY29zdDsKCSAgfQogICAgfQoKICBpZiAoa2luZCA9PSBzY2Fs YXJfc3RtdCkKICAgIGlmICh0cmVlIGNtcF90eXBlID0gdmVjdF9lbWJlZGRlZF9jb21wYXJpc29u X3R5cGUgKHN0bXRfaW5mbykpCiAgICAgIHsKCWlmIChGTE9BVF9UWVBFX1AgKGNtcF90eXBlKSkK CSAgc3RtdF9jb3N0ICs9IGFhcmNoNjRfdHVuZV9wYXJhbXMudmVjX2Nvc3RzLT5zY2FsYXJfZnBf c3RtdF9jb3N0OwoJZWxzZQoJICBzdG10X2Nvc3QgKz0gYWFyY2g2NF90dW5lX3BhcmFtcy52ZWNf Y29zdHMtPnNjYWxhcl9pbnRfc3RtdF9jb3N0OwogICAgICB9CgogIHJldHVybiBzdG10X2Nvc3Q7 Cn0KCi8qIENPVU5ULCBLSU5EIGFuZCBTVE1UX0lORk8gYXJlIHRoZSBzYW1lIGFzIGZvciB2ZWN0 b3JfY29zdHM6OmFkZF9zdG10X2Nvc3QKICAgYW5kIHRoZXkgZGVzY3JpYmUgYW4gb3BlcmF0aW9u IGluIHRoZSBib2R5IG9mIGEgdmVjdG9yIGxvb3AuICBSZWNvcmQgaXNzdWUKICAgaW5mb3JtYXRp b24gcmVsYXRpbmcgdG8gdGhlIHZlY3RvciBvcGVyYXRpb24gaW4gT1BTLiAgKi8Kdm9pZAphYXJj aDY0X3ZlY3Rvcl9jb3N0czo6Y291bnRfb3BzICh1bnNpZ25lZCBpbnQgY291bnQsIHZlY3RfY29z dF9mb3Jfc3RtdCBraW5kLAoJCQkJIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvLAoJCQkJIGFhcmNo NjRfdmVjX29wX2NvdW50ICpvcHMpCnsKICBjb25zdCBhYXJjaDY0X2Jhc2VfdmVjX2lzc3VlX2lu Zm8gKmJhc2VfaXNzdWUgPSBvcHMtPmJhc2VfaXNzdWVfaW5mbyAoKTsKICBpZiAoIWJhc2VfaXNz dWUpCiAgICByZXR1cm47CiAgY29uc3QgYWFyY2g2NF9zaW1kX3ZlY19pc3N1ZV9pbmZvICpzaW1k X2lzc3VlID0gb3BzLT5zaW1kX2lzc3VlX2luZm8gKCk7CiAgY29uc3QgYWFyY2g2NF9zdmVfdmVj X2lzc3VlX2luZm8gKnN2ZV9pc3N1ZSA9IG9wcy0+c3ZlX2lzc3VlX2luZm8gKCk7CgogIC8qIENh bGN1bGF0ZSB0aGUgbWluaW11bSBjeWNsZXMgcGVyIGl0ZXJhdGlvbiBpbXBvc2VkIGJ5IGEgcmVk dWN0aW9uCiAgICAgb3BlcmF0aW9uLiAgKi8KICBpZiAoKGtpbmQgPT0gc2NhbGFyX3N0bXQgfHwg a2luZCA9PSB2ZWN0b3Jfc3RtdCB8fCBraW5kID09IHZlY190b19zY2FsYXIpCiAgICAgICYmIHZl Y3RfaXNfcmVkdWN0aW9uIChzdG10X2luZm8pKQogICAgewogICAgICB1bnNpZ25lZCBpbnQgYmFz ZQoJPSBhYXJjaDY0X2luX2xvb3BfcmVkdWN0aW9uX2xhdGVuY3kgKG1fdmluZm8sIHN0bXRfaW5m bywgbV92ZWNfZmxhZ3MpOwoKICAgICAgLyogPz8/IElkZWFsbHkgd2UnZCBkbyBDT1VOVCByZWR1 Y3Rpb25zIGluIHBhcmFsbGVsLCBidXQgdW5mb3J0dW5hdGVseQoJIHRoYXQncyBub3QgeWV0IHRo ZSBjYXNlLiAgKi8KICAgICAgb3BzLT5yZWR1Y3Rpb25fbGF0ZW5jeSA9IE1BWCAob3BzLT5yZWR1 Y3Rpb25fbGF0ZW5jeSwgYmFzZSAqIGNvdW50KTsKICAgIH0KCiAgLyogQXNzdW1lIHRoYXQgbXVs dGlwbHktYWRkcyB3aWxsIGJlY29tZSBhIHNpbmdsZSBvcGVyYXRpb24uICAqLwogIGlmIChzdG10 X2luZm8gJiYgYWFyY2g2NF9tdWx0aXBseV9hZGRfcCAobV92aW5mbywgc3RtdF9pbmZvLCBtX3Zl Y19mbGFncykpCiAgICByZXR1cm47CgogIC8qIENvdW50IHRoZSBiYXNpYyBvcGVyYXRpb24gY29z dCBhc3NvY2lhdGVkIHdpdGggS0lORC4gICovCiAgc3dpdGNoIChraW5kKQogICAgewogICAgY2Fz ZSBjb25kX2JyYW5jaF90YWtlbjoKICAgIGNhc2UgY29uZF9icmFuY2hfbm90X3Rha2VuOgogICAg Y2FzZSB2ZWN0b3JfZ2F0aGVyX2xvYWQ6CiAgICBjYXNlIHZlY3Rvcl9zY2F0dGVyX3N0b3JlOgog ICAgICAvKiBXZSBjdXJyZW50bHkgZG9uJ3QgZXhwZWN0IHRoZXNlIHRvIGJlIHVzZWQgaW4gYSBs b29wIGJvZHkuICAqLwogICAgICBicmVhazsKCiAgICBjYXNlIHZlY19wZXJtOgogICAgY2FzZSB2 ZWNfcHJvbW90ZV9kZW1vdGU6CiAgICBjYXNlIHZlY19jb25zdHJ1Y3Q6CiAgICBjYXNlIHZlY190 b19zY2FsYXI6CiAgICBjYXNlIHNjYWxhcl90b192ZWM6CiAgICBjYXNlIHZlY3Rvcl9zdG10Ogog ICAgY2FzZSBzY2FsYXJfc3RtdDoKICAgICAgb3BzLT5nZW5lcmFsX29wcyArPSBjb3VudDsKICAg ICAgYnJlYWs7CgogICAgY2FzZSBzY2FsYXJfbG9hZDoKICAgIGNhc2UgdmVjdG9yX2xvYWQ6CiAg ICBjYXNlIHVuYWxpZ25lZF9sb2FkOgogICAgICBvcHMtPmxvYWRzICs9IGNvdW50OwogICAgICBp ZiAobV92ZWNfZmxhZ3MgfHwgRkxPQVRfVFlQRV9QIChhYXJjaDY0X2RyX3R5cGUgKHN0bXRfaW5m bykpKQoJb3BzLT5nZW5lcmFsX29wcyArPSBiYXNlX2lzc3VlLT5mcF9zaW1kX2xvYWRfZ2VuZXJh bF9vcHMgKiBjb3VudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSB2ZWN0b3Jfc3RvcmU6CiAgICBj YXNlIHVuYWxpZ25lZF9zdG9yZToKICAgIGNhc2Ugc2NhbGFyX3N0b3JlOgogICAgICBvcHMtPnN0 b3JlcyArPSBjb3VudDsKICAgICAgaWYgKG1fdmVjX2ZsYWdzIHx8IEZMT0FUX1RZUEVfUCAoYWFy Y2g2NF9kcl90eXBlIChzdG10X2luZm8pKSkKCW9wcy0+Z2VuZXJhbF9vcHMgKz0gYmFzZV9pc3N1 ZS0+ZnBfc2ltZF9zdG9yZV9nZW5lcmFsX29wcyAqIGNvdW50OwogICAgICBicmVhazsKICAgIH0K CiAgLyogQWRkIGFueSBlbWJlZGRlZCBjb21wYXJpc29uIG9wZXJhdGlvbnMuICAqLwogIGlmICgo a2luZCA9PSBzY2FsYXJfc3RtdCB8fCBraW5kID09IHZlY3Rvcl9zdG10IHx8IGtpbmQgPT0gdmVj X3RvX3NjYWxhcikKICAgICAgJiYgdmVjdF9lbWJlZGRlZF9jb21wYXJpc29uX3R5cGUgKHN0bXRf aW5mbykpCiAgICBvcHMtPmdlbmVyYWxfb3BzICs9IGNvdW50OwoKICAvKiBDT05EX1JFRFVDVElP TlMgbmVlZCB0d28gc2V0cyBvZiBWRUNfQ09ORF9FWFBScywgd2hlcmVhcyBzbyBmYXIgd2UKICAg ICBoYXZlIG9ubHkgYWNjb3VudGVkIGZvciBvbmUuICAqLwogIGlmICgoa2luZCA9PSB2ZWN0b3Jf c3RtdCB8fCBraW5kID09IHZlY190b19zY2FsYXIpCiAgICAgICYmIHZlY3RfcmVkdWNfdHlwZSAo bV92aW5mbywgc3RtdF9pbmZvKSA9PSBDT05EX1JFRFVDVElPTikKICAgIG9wcy0+Z2VuZXJhbF9v cHMgKz0gY291bnQ7CgogIC8qIENvdW50IHRoZSBwcmVkaWNhdGUgb3BlcmF0aW9ucyBuZWVkZWQg YnkgYW4gU1ZFIGNvbXBhcmlzb24uICAqLwogIGlmIChzdmVfaXNzdWUgJiYgKGtpbmQgPT0gdmVj dG9yX3N0bXQgfHwga2luZCA9PSB2ZWNfdG9fc2NhbGFyKSkKICAgIGlmICh0cmVlIHR5cGUgPSB2 ZWN0X2NvbXBhcmlzb25fdHlwZSAoc3RtdF9pbmZvKSkKICAgICAgewoJdW5zaWduZWQgaW50IGJh c2UgPSAoRkxPQVRfVFlQRV9QICh0eXBlKQoJCQkgICAgID8gc3ZlX2lzc3VlLT5mcF9jbXBfcHJl ZF9vcHMKCQkJICAgICA6IHN2ZV9pc3N1ZS0+aW50X2NtcF9wcmVkX29wcyk7CglvcHMtPnByZWRf b3BzICs9IGJhc2UgKiBjb3VudDsKICAgICAgfQoKICAvKiBBZGQgYW55IGV4dHJhIG92ZXJoZWFk IGFzc29jaWF0ZWQgd2l0aCBMRFsyMzRdIGFuZCBTVFsyMzRdIG9wZXJhdGlvbnMuICAqLwogIGlm IChzaW1kX2lzc3VlKQogICAgc3dpdGNoIChhYXJjaDY0X2xkMjM0X3N0MjM0X3ZlY3RvcnMgKGtp bmQsIHN0bXRfaW5mbykpCiAgICAgIHsKICAgICAgY2FzZSAyOgoJb3BzLT5nZW5lcmFsX29wcyAr PSBzaW1kX2lzc3VlLT5sZDJfc3QyX2dlbmVyYWxfb3BzICogY291bnQ7CglicmVhazsKCiAgICAg IGNhc2UgMzoKCW9wcy0+Z2VuZXJhbF9vcHMgKz0gc2ltZF9pc3N1ZS0+bGQzX3N0M19nZW5lcmFs X29wcyAqIGNvdW50OwoJYnJlYWs7CgogICAgICBjYXNlIDQ6CglvcHMtPmdlbmVyYWxfb3BzICs9 IHNpbWRfaXNzdWUtPmxkNF9zdDRfZ2VuZXJhbF9vcHMgKiBjb3VudDsKCWJyZWFrOwogICAgICB9 CgogIC8qIEFkZCBhbnkgb3ZlcmhlYWQgYXNzb2NpYXRlZCB3aXRoIGdhdGhlciBsb2FkcyBhbmQg c2NhdHRlciBzdG9yZXMuICAqLwogIGlmIChzdmVfaXNzdWUKICAgICAgJiYgKGtpbmQgPT0gc2Nh bGFyX2xvYWQgfHwga2luZCA9PSBzY2FsYXJfc3RvcmUpCiAgICAgICYmIFNUTVRfVklORk9fTUVN T1JZX0FDQ0VTU19UWVBFIChzdG10X2luZm8pID09IFZNQVRfR0FUSEVSX1NDQVRURVIpCiAgICB7 CiAgICAgIHVuc2lnbmVkIGludCBwYWlycyA9IENFSUwgKGNvdW50LCAyKTsKICAgICAgb3BzLT5w cmVkX29wcyArPSBzdmVfaXNzdWUtPmdhdGhlcl9zY2F0dGVyX3BhaXJfcHJlZF9vcHMgKiBwYWly czsKICAgICAgb3BzLT5nZW5lcmFsX29wcyArPSBzdmVfaXNzdWUtPmdhdGhlcl9zY2F0dGVyX3Bh aXJfZ2VuZXJhbF9vcHMgKiBwYWlyczsKICAgIH0KfQoKLyogUmV0dXJuIHRydWUgaWYgU1RNVF9J TkZPIGNvbnRhaW5zIGEgbWVtb3J5IGFjY2VzcyBhbmQgaWYgdGhlIGNvbnN0YW50CiAgIGNvbXBv bmVudCBvZiB0aGUgbWVtb3J5IGFkZHJlc3MgaXMgYWxpZ25lZCB0byBTSVpFIGJ5dGVzLiAgKi8K c3RhdGljIGJvb2wKYWFyY2g2NF9hbGlnbmVkX2NvbnN0YW50X29mZnNldF9wIChzdG10X3ZlY19p bmZvIHN0bXRfaW5mbywKCQkJCSAgIHBvbHlfdWludDY0IHNpemUpCnsKICBpZiAoIVNUTVRfVklO Rk9fREFUQV9SRUYgKHN0bXRfaW5mbykpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChhdXRvIGZp cnN0X3N0bXQgPSBEUl9HUk9VUF9GSVJTVF9FTEVNRU5UIChzdG10X2luZm8pKQogICAgc3RtdF9p bmZvID0gZmlyc3Rfc3RtdDsKICB0cmVlIGNvbnN0YW50X29mZnNldCA9IERSX0lOSVQgKFNUTVRf VklORk9fREFUQV9SRUYgKHN0bXRfaW5mbykpOwogIC8qIE5lZWRlZCBmb3IgZ2F0aGVycyAmIHNj YXR0ZXJzLCBmb3IgZXhhbXBsZS4gICovCiAgaWYgKCFjb25zdGFudF9vZmZzZXQpCiAgICByZXR1 cm4gZmFsc2U7CgogIHJldHVybiBtdWx0aXBsZV9wICh3aTo6dG9fcG9seV9vZmZzZXQgKGNvbnN0 YW50X29mZnNldCksIHNpemUpOwp9CgovKiBDaGVjayBpZiBhIHNjYWxhciBvciB2ZWN0b3Igc3Rt dCBjb3VsZCBiZSBwYXJ0IG9mIGEgcmVnaW9uIG9mIGNvZGUKICAgdGhhdCBkb2VzIG5vdGhpbmcg bW9yZSB0aGFuIHN0b3JlIHZhbHVlcyB0byBtZW1vcnksIGluIHRoZSBzY2FsYXIKICAgY2FzZSB1 c2luZyBTVFAuICBSZXR1cm4gdGhlIGNvc3Qgb2YgdGhlIHN0bXQgaWYgc28sIGNvdW50aW5nIDIg Zm9yCiAgIG9uZSBpbnN0cnVjdGlvbi4gIFJldHVybiB+MFUgb3RoZXJ3aXNlLgoKICAgVGhlIGFy Z3VtZW50cyBhcmUgYSBzdWJzZXQgb2YgdGhvc2UgcGFzc2VkIHRvIGFkZF9zdG10X2Nvc3QuICAq Lwp1bnNpZ25lZCBpbnQKYWFyY2g2NF9zdHBfc2VxdWVuY2VfY29zdCAodW5zaWduZWQgaW50IGNv dW50LCB2ZWN0X2Nvc3RfZm9yX3N0bXQga2luZCwKCQkJICAgc3RtdF92ZWNfaW5mbyBzdG10X2lu Zm8sIHRyZWUgdmVjdHlwZSkKewogIC8qIENvZGUgdGhhdCBzdG9yZXMgdmVjdG9yIGNvbnN0YW50 cyB1c2VzIGEgdmVjdG9yX2xvYWQgdG8gY3JlYXRlCiAgICAgdGhlIGNvbnN0YW50LiAgV2UgZG9u J3QgYXBwbHkgdGhlIGhldXJpc3RpYyB0byB0aGF0IGNhc2UgZm9yIHR3bwogICAgIG1haW4gcmVh c29uczoKCiAgICAgLSBBdCB0aGUgbW9tZW50LCBTVFBzIGFyZSBvbmx5IGZvcm1lZCB2aWEgcGVl cGhvbGUyLCBhbmQgdGhlCiAgICAgICBjb25zdGFudCBzY2FsYXIgbW92ZXMgd291bGQgb2Z0ZW4g Y29tZSBiZXR3ZWVuIFNUUnMgYW5kIHNvCiAgICAgICBwcmV2ZW50IFNUUCBmb3JtYXRpb24uCgog ICAgIC0gVGhlIHNjYWxhciBjb2RlIGFsc28gaGFzIHRvIGxvYWQgdGhlIGNvbnN0YW50IHNvbWVo b3csIGFuZCB0aGF0CiAgICAgICBpc24ndCBjb3N0ZWQuICAqLwogIHN3aXRjaCAoa2luZCkKICAg IHsKICAgIGNhc2Ugc2NhbGFyX3RvX3ZlYzoKICAgICAgLyogQ291bnQgMiBpbnNucyBmb3IgYSBH UFItPlNJTUQgZHVwIGFuZCAxIGluc24gZm9yIGEgRlBSLT5TSU1EIGR1cC4gICovCiAgICAgIHJl dHVybiAoRkxPQVRfVFlQRV9QICh2ZWN0eXBlKSA/IDIgOiA0KSAqIGNvdW50OwoKICAgIGNhc2Ug dmVjX2NvbnN0cnVjdDoKICAgICAgaWYgKEZMT0FUX1RZUEVfUCAodmVjdHlwZSkpCgkvKiBDb3Vu dCAxIGluc24gZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBGUC0+U0lNRCBJTlMKCSAgIGluc3Ry dWN0aW9ucy4gICovCglyZXR1cm4gKHZlY3RfbnVuaXRzX2Zvcl9jb3N0ICh2ZWN0eXBlKSAtIDEp ICogMiAqIGNvdW50OwoKICAgICAgLyogQ291bnQgMiBpbnNucyBmb3IgYSBHUFItPlNJTUQgbW92 ZSBhbmQgMiBpbnNucyBmb3IgdGhlCgkgbWF4aW11bSBudW1iZXIgb2YgR1BSLT5TSU1EIElOUyBp bnN0cnVjdGlvbnMuICAqLwogICAgICByZXR1cm4gdmVjdF9udW5pdHNfZm9yX2Nvc3QgKHZlY3R5 cGUpICogNCAqIGNvdW50OwoKICAgIGNhc2UgdmVjdG9yX3N0b3JlOgogICAgY2FzZSB1bmFsaWdu ZWRfc3RvcmU6CiAgICAgIC8qIENvdW50IDEgaW5zbiBwZXIgdmVjdG9yIGlmIHdlIGNhbid0IGZv cm0gU1RQIFEgcGFpcnMuICAqLwogICAgICBpZiAoYWFyY2g2NF9zdmVfbW9kZV9wIChUWVBFX01P REUgKHZlY3R5cGUpKSkKCXJldHVybiBjb3VudCAqIDI7CiAgICAgIGlmIChhYXJjaDY0X3R1bmVf cGFyYW1zLmV4dHJhX3R1bmluZ19mbGFncwoJICAmIEFBUkNINjRfRVhUUkFfVFVORV9OT19MRFBf U1RQX1FSRUdTKQoJcmV0dXJuIGNvdW50ICogMjsKCiAgICAgIGlmIChzdG10X2luZm8pCgl7Cgkg IC8qIEFzc3VtZSB3ZSB3b24ndCBiZSBhYmxlIHRvIHVzZSBTVFAgaWYgdGhlIGNvbnN0YW50IG9m ZnNldAoJICAgICBjb21wb25lbnQgb2YgdGhlIGFkZHJlc3MgaXMgbWlzYWxpZ25lZC4gID8/PyBU aGlzIGNvdWxkIGJlCgkgICAgIHJlbW92ZWQgaWYgd2UgZm9ybWVkIFNUUCBwYWlycyBlYXJsaWVy LCByYXRoZXIgdGhhbiByZWx5aW5nCgkgICAgIG9uIHBlZXBob2xlMi4gICovCgkgIGF1dG8gc2l6 ZSA9IEdFVF9NT0RFX1NJWkUgKFRZUEVfTU9ERSAodmVjdHlwZSkpOwoJICBpZiAoIWFhcmNoNjRf YWxpZ25lZF9jb25zdGFudF9vZmZzZXRfcCAoc3RtdF9pbmZvLCBzaXplKSkKCSAgICByZXR1cm4g Y291bnQgKiAyOwoJfQogICAgICByZXR1cm4gQ0VJTCAoY291bnQsIDIpICogMjsKCiAgICBjYXNl IHNjYWxhcl9zdG9yZToKICAgICAgaWYgKHN0bXRfaW5mbyAmJiBTVE1UX1ZJTkZPX0RBVEFfUkVG IChzdG10X2luZm8pKQoJewoJICAvKiBDaGVjayBmb3IgYSBtb2RlIGluIHdoaWNoIFNUUCBwYWly cyBjYW4gYmUgZm9ybWVkLiAgKi8KCSAgYXV0byBzaXplID0gR0VUX01PREVfU0laRSAoVFlQRV9N T0RFIChhYXJjaDY0X2RyX3R5cGUgKHN0bXRfaW5mbykpKTsKCSAgaWYgKG1heWJlX25lIChzaXpl LCA0KSAmJiBtYXliZV9uZSAoc2l6ZSwgOCkpCgkgICAgcmV0dXJuIH4wVTsKCgkgIC8qIEFzc3Vt ZSB3ZSB3b24ndCBiZSBhYmxlIHRvIHVzZSBTVFAgaWYgdGhlIGNvbnN0YW50IG9mZnNldAoJICAg ICBjb21wb25lbnQgb2YgdGhlIGFkZHJlc3MgaXMgbWlzYWxpZ25lZC4gID8/PyBUaGlzIGNvdWxk IGJlCgkgICAgIHJlbW92ZWQgaWYgd2UgZm9ybWVkIFNUUCBwYWlycyBlYXJsaWVyLCByYXRoZXIg dGhhbiByZWx5aW5nCgkgICAgIG9uIHBlZXBob2xlMi4gICovCgkgIGlmICghYWFyY2g2NF9hbGln bmVkX2NvbnN0YW50X29mZnNldF9wIChzdG10X2luZm8sIHNpemUpKQoJICAgIHJldHVybiB+MFU7 Cgl9CiAgICAgIHJldHVybiBjb3VudDsKCiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gfjBVOwog ICAgfQp9Cgp1bnNpZ25lZAphYXJjaDY0X3ZlY3Rvcl9jb3N0czo6YWRkX3N0bXRfY29zdCAoaW50 IGNvdW50LCB2ZWN0X2Nvc3RfZm9yX3N0bXQga2luZCwKCQkJCSAgICAgc3RtdF92ZWNfaW5mbyBz dG10X2luZm8sIHNscF90cmVlLAoJCQkJICAgICB0cmVlIHZlY3R5cGUsIGludCBtaXNhbGlnbiwK CQkJCSAgICAgdmVjdF9jb3N0X21vZGVsX2xvY2F0aW9uIHdoZXJlKQp7CiAgZnJhY3Rpb25hbF9j b3N0IHN0bXRfY29zdAogICAgPSBhYXJjaDY0X2J1aWx0aW5fdmVjdG9yaXphdGlvbl9jb3N0IChr aW5kLCB2ZWN0eXBlLCBtaXNhbGlnbik7CgogIGJvb2wgaW5faW5uZXJfbG9vcF9wID0gKHdoZXJl ID09IHZlY3RfYm9keQoJCQkgICYmIHN0bXRfaW5mbwoJCQkgICYmIHN0bXRfaW5faW5uZXJfbG9v cF9wIChtX3ZpbmZvLCBzdG10X2luZm8pKTsKCiAgLyogRG8gb25lLXRpbWUgaW5pdGlhbGl6YXRp b24gYmFzZWQgb24gdGhlIHZpbmZvLiAgKi8KICBsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8gPSBk eW5fY2FzdDxsb29wX3ZlY19pbmZvPiAobV92aW5mbyk7CiAgaWYgKCFtX2FuYWx5emVkX3ZpbmZv ICYmIGFhcmNoNjRfdXNlX25ld192ZWN0b3JfY29zdHNfcCAoKSkKICAgIHsKICAgICAgaWYgKGxv b3BfdmluZm8pCglhbmFseXplX2xvb3BfdmluZm8gKGxvb3BfdmluZm8pOwoKICAgICAgbV9hbmFs eXplZF92aW5mbyA9IHRydWU7CiAgICB9CgogIC8qIEFwcGx5IHRoZSBoZXVyaXN0aWMgZGVzY3Jp YmVkIGFib3ZlIG1fc3RwX3NlcXVlbmNlX2Nvc3QuICAqLwogIGlmIChtX3N0cF9zZXF1ZW5jZV9j b3N0ICE9IH4wVSkKICAgIHsKICAgICAgdWludDY0X3QgY29zdCA9IGFhcmNoNjRfc3RwX3NlcXVl bmNlX2Nvc3QgKGNvdW50LCBraW5kLAoJCQkJCQkgc3RtdF9pbmZvLCB2ZWN0eXBlKTsKICAgICAg bV9zdHBfc2VxdWVuY2VfY29zdCA9IE1JTiAobV9zdHBfc2VxdWVuY2VfY29zdCArIGNvc3QsIH4w VSk7CiAgICB9CgogIC8qIFRyeSB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIGNvc3QgYnkgbG9va2lu ZyBhdCBTVE1UX0lORk8gaW5zdGVhZAogICAgIG9mIGp1c3QgbG9va2luZyBhdCBLSU5ELiAgKi8K ICBpZiAoc3RtdF9pbmZvICYmIGFhcmNoNjRfdXNlX25ld192ZWN0b3JfY29zdHNfcCAoKSkKICAg IHsKICAgICAgLyogSWYgd2Ugc2NhbGFyaXplIGEgc3RyaWRlZCBzdG9yZSwgdGhlIHZlY3Rvcml6 ZXIgY29zdHMgb25lCgkgdmVjX3RvX3NjYWxhciBmb3IgZWFjaCBlbGVtZW50LiAgSG93ZXZlciwg d2UgY2FuIHN0b3JlIHRoZSBmaXJzdAoJIGVsZW1lbnQgdXNpbmcgYW4gRlAgc3RvcmUgd2l0aG91 dCBhIHNlcGFyYXRlIGV4dHJhY3Qgc3RlcC4gICovCiAgICAgIGlmICh2ZWN0X2lzX3N0b3JlX2Vs dF9leHRyYWN0aW9uIChraW5kLCBzdG10X2luZm8pKQoJY291bnQgLT0gMTsKCiAgICAgIHN0bXRf Y29zdCA9IGFhcmNoNjRfZGV0ZWN0X3NjYWxhcl9zdG10X3N1YnR5cGUgKG1fdmluZm8sIGtpbmQs CgkJCQkJCSAgICAgIHN0bXRfaW5mbywgc3RtdF9jb3N0KTsKCiAgICAgIGlmICh2ZWN0eXBlICYm IG1fdmVjX2ZsYWdzKQoJc3RtdF9jb3N0ID0gYWFyY2g2NF9kZXRlY3RfdmVjdG9yX3N0bXRfc3Vi dHlwZSAobV92aW5mbywga2luZCwKCQkJCQkJCXN0bXRfaW5mbywgdmVjdHlwZSwKCQkJCQkJCXdo ZXJlLCBzdG10X2Nvc3QpOwogICAgfQoKICAvKiBEbyBhbnkgU1ZFLXNwZWNpZmljIGFkanVzdG1l bnRzIHRvIHRoZSBjb3N0LiAgKi8KICBpZiAoc3RtdF9pbmZvICYmIHZlY3R5cGUgJiYgYWFyY2g2 NF9zdmVfbW9kZV9wIChUWVBFX01PREUgKHZlY3R5cGUpKSkKICAgIHN0bXRfY29zdCA9IGFhcmNo NjRfc3ZlX2FkanVzdF9zdG10X2Nvc3QgKG1fdmluZm8sIGtpbmQsIHN0bXRfaW5mbywKCQkJCQkg ICAgICB2ZWN0eXBlLCBzdG10X2Nvc3QpOwoKICBpZiAoc3RtdF9pbmZvICYmIGFhcmNoNjRfdXNl X25ld192ZWN0b3JfY29zdHNfcCAoKSkKICAgIHsKICAgICAgLyogQWNjb3VudCBmb3IgYW55IGV4 dHJhICJlbWJlZGRlZCIgY29zdHMgdGhhdCBhcHBseSBhZGRpdGl2ZWx5CgkgdG8gdGhlIGJhc2Ug Y29zdCBjYWxjdWxhdGVkIGFib3ZlLiAgKi8KICAgICAgc3RtdF9jb3N0ID0gYWFyY2g2NF9hZGp1 c3Rfc3RtdF9jb3N0IChraW5kLCBzdG10X2luZm8sIHZlY3R5cGUsCgkJCQkJICAgIHN0bXRfY29z dCk7CgogICAgICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgYSBub256ZXJvIHZlY3RvciBsb29wIGJv ZHkgY29zdCBmb3IgdGhlCgkgaW5uZXJtb3N0IGxvb3AsIGFsc28gZXN0aW1hdGUgdGhlIG9wZXJh dGlvbnMgdGhhdCB3b3VsZCBuZWVkCgkgdG8gYmUgaXNzdWVkIGJ5IGFsbCByZWxldmFudCBpbXBs ZW1lbnRhdGlvbnMgb2YgdGhlIGxvb3AuICAqLwogICAgICBpZiAobG9vcF92aW5mbwoJICAmJiAo bV9jb3N0aW5nX2Zvcl9zY2FsYXIgfHwgd2hlcmUgPT0gdmVjdF9ib2R5KQoJICAmJiAoIUxPT1Bf VklORk9fTE9PUCAobG9vcF92aW5mbyktPmlubmVyIHx8IGluX2lubmVyX2xvb3BfcCkKCSAgJiYg c3RtdF9jb3N0ICE9IDApCglmb3IgKGF1dG8gJm9wcyA6IG1fb3BzKQoJICBjb3VudF9vcHMgKGNv dW50LCBraW5kLCBzdG10X2luZm8sICZvcHMpOwoKICAgICAgLyogSWYgd2UncmUgYXBwbHlpbmcg dGhlIFNWRSB2cy4gQWR2YW5jZWQgU0lNRCB1bnJvbGxpbmcgaGV1cmlzdGljLAoJIGVzdGltYXRl IHRoZSBudW1iZXIgb2Ygc3RhdGVtZW50cyBpbiB0aGUgdW5yb2xsZWQgQWR2YW5jZWQgU0lNRAoJ IGxvb3AuICBGb3Igc2ltcGxpY2l0bHksIHdlIGFzc3VtZSB0aGF0IG9uZSBpdGVyYXRpb24gb2Yg dGhlCgkgQWR2YW5jZWQgU0lNRCBsb29wIHdvdWxkIG5lZWQgdGhlIHNhbWUgbnVtYmVyIG9mIHN0 YXRlbWVudHMKCSBhcyBvbmUgaXRlcmF0aW9uIG9mIHRoZSBTVkUgbG9vcC4gICovCiAgICAgIGlm ICh3aGVyZSA9PSB2ZWN0X2JvZHkgJiYgbV91bnJvbGxlZF9hZHZzaW1kX25pdGVycykKCW1fdW5y b2xsZWRfYWR2c2ltZF9zdG10cyArPSBjb3VudCAqIG1fdW5yb2xsZWRfYWR2c2ltZF9uaXRlcnM7 CgogICAgICAvKiBEZXRlY3QgdGhlIHVzZSBvZiBhbiBhdmVyYWdpbmcgb3BlcmF0aW9uLiAgKi8K ICAgICAgZ2ltcGxlICpzdG10ID0gc3RtdF9pbmZvLT5zdG10OwogICAgICBpZiAoaXNfZ2ltcGxl X2NhbGwgKHN0bXQpCgkgICYmIGdpbXBsZV9jYWxsX2ludGVybmFsX3AgKHN0bXQpKQoJewoJICBz d2l0Y2ggKGdpbXBsZV9jYWxsX2ludGVybmFsX2ZuIChzdG10KSkKCSAgICB7CgkgICAgY2FzZSBJ Rk5fQVZHX0ZMT09SOgoJICAgIGNhc2UgSUZOX0FWR19DRUlMOgoJICAgICAgbV9oYXNfYXZnID0g dHJ1ZTsKCSAgICBkZWZhdWx0OgoJICAgICAgYnJlYWs7CgkgICAgfQoJfQogICAgfQoKICAvKiBJ ZiB0aGUgc3RhdGVtZW50IHN0b3JlcyB0byBhIGRlY2wgdGhhdCBpcyBrbm93biB0byBiZSB0aGUg YXJndW1lbnQKICAgICB0byBhIHZsZDEgaW4gdGhlIHNhbWUgZnVuY3Rpb24sIGlnbm9yZSB0aGUg c3RvcmUgZm9yIGNvc3RpbmcgcHVycG9zZXMuCiAgICAgU2VlIHRoZSBjb21tZW50IGFib3ZlIG1f c3RvcmVzX3RvX3ZlY3Rvcl9sb2FkX2RlY2wgZm9yIG1vcmUgZGV0YWlscy4gICovCiAgaWYgKHN0 bXRfaW5mbwogICAgICAmJiAoa2luZCA9PSB2ZWN0b3Jfc3RvcmUgfHwga2luZCA9PSB1bmFsaWdu ZWRfc3RvcmUpCiAgICAgICYmIGFhcmNoNjRfYWNjZXNzZXNfdmVjdG9yX2xvYWRfZGVjbF9wIChz dG10X2luZm8pKQogICAgewogICAgICBzdG10X2Nvc3QgPSAwOwogICAgICBtX3N0b3Jlc190b192 ZWN0b3JfbG9hZF9kZWNsID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIHJlY29yZF9zdG10X2Nvc3Qg KHN0bXRfaW5mbywgd2hlcmUsIChjb3VudCAqIHN0bXRfY29zdCkuY2VpbCAoKSk7Cn0KCi8qIFJl dHVybiB0cnVlIGlmIChhKSB3ZSdyZSBhcHBseWluZyB0aGUgQWR2YW5jZWQgU0lNRCB2cy4gU1ZF IHVucm9sbGluZwogICBoZXVyaXN0aWMgZGVzY3JpYmVkIGFib3ZlIG1fdW5yb2xsZWRfYWR2c2lt ZF9uaXRlcnMgYW5kIChiKSB0aGUgaGV1cmlzdGljCiAgIHNheXMgdGhhdCB3ZSBzaG91bGQgcHJl ZmVyIHRoZSBBZHZhbmNlZCBTSU1EIGxvb3AuICAqLwpib29sCmFhcmNoNjRfdmVjdG9yX2Nvc3Rz OjpwcmVmZXJfdW5yb2xsZWRfbG9vcCAoKSBjb25zdAp7CiAgaWYgKCFtX3Vucm9sbGVkX2FkdnNp bWRfc3RtdHMpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKICAg IGR1bXBfcHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRpb24sICJOdW1iZXIgb2YgaW5z bnMgaW4iCgkJICAgICAiIHVucm9sbGVkIEFkdmFuY2VkIFNJTUQgbG9vcCA9ICIKCQkgICAgIEhP U1RfV0lERV9JTlRfUFJJTlRfVU5TSUdORUQgIlxuIiwKCQkgICAgIG1fdW5yb2xsZWRfYWR2c2lt ZF9zdG10cyk7CgogIC8qIFRoZSBiYWxhbmNlIGhlcmUgaXMgdHJpY2t5LiAgT24gdGhlIG9uZSBo YW5kLCB3ZSBjYW4ndCBiZSBzdXJlIHdoZXRoZXIKICAgICB0aGUgY29kZSBpcyB2ZWN0b3JpemFi bGUgd2l0aCBBZHZhbmNlZCBTSU1EIG9yIG5vdC4gIEhvd2V2ZXIsIGV2ZW4gaWYKICAgICBpdCBp c24ndCB2ZWN0b3JpemFibGUgd2l0aCBBZHZhbmNlZCBTSU1ELCB0aGVyZSdzIGEgcG9zc2liaWxp dHkgdGhhdAogICAgIHRoZSBzY2FsYXIgY29kZSBjb3VsZCBhbHNvIGJlIHVucm9sbGVkLiAgU29t ZSBvZiB0aGUgY29kZSBtaWdodCB0aGVuCiAgICAgYmVuZWZpdCBmcm9tIFNMUCwgb3IgZnJvbSB1 c2luZyBMRFAgYW5kIFNUUC4gIFdlIHRoZXJlZm9yZSBhcHBseQogICAgIHRoZSBoZXVyaXN0aWMg cmVnYXJkbGVzcyBvZiBjYW5fdXNlX2FkdnNpbWRfcC4gICovCiAgcmV0dXJuIChtX3Vucm9sbGVk X2FkdnNpbWRfc3RtdHMKCSAgJiYgKG1fdW5yb2xsZWRfYWR2c2ltZF9zdG10cwoJICAgICAgPD0g KHVuc2lnbmVkIGludCkgcGFyYW1fbWF4X2NvbXBsZXRlbHlfcGVlbGVkX2luc25zKSk7Cn0KCi8q IFN1YnJvdXRpbmUgb2YgYWRqdXN0X2JvZHlfY29zdCBmb3IgaGFuZGxpbmcgU1ZFLiAgVXNlIElT U1VFX0lORk8gdG8gd29yayBvdXQKICAgaG93IGZhc3QgdGhlIFNWRSBjb2RlIGNhbiBiZSBpc3N1 ZWQgYW5kIGNvbXBhcmUgaXQgdG8gdGhlIGVxdWl2YWxlbnQgdmFsdWUKICAgZm9yIHNjYWxhciBj b2RlIChTQ0FMQVJfQ1lDTEVTX1BFUl9JVEVSKS4gIElmIENPVUxEX1VTRV9BRFZTSU1EIGlzIHRy dWUsCiAgIGFsc28gY29tcGFyZSBpdCB0byB0aGUgaXNzdWUgcmF0ZSBvZiBBZHZhbmNlZCBTSU1E IGNvZGUKICAgKEFEVlNJTURfQ1lDTEVTX1BFUl9JVEVSKS4KCiAgIE9SSUdfQk9EWV9DT1NUIGlz IHRoZSBjb3N0IG9yaWdpbmFsbHkgcGFzc2VkIHRvIGFkanVzdF9ib2R5X2Nvc3QgYW5kCiAgICpC T0RZX0NPU1QgaXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGFkanVzdGVkIGNvc3QuICAqU0hP VUxEX0RJU1BBUkFHRQogICBpcyB0cnVlIGlmIHdlIHRoaW5rIHRoZSBsb29wIGJvZHkgaXMgdG9v IGV4cGVuc2l2ZS4gICovCgpmcmFjdGlvbmFsX2Nvc3QKYWFyY2g2NF92ZWN0b3JfY29zdHM6Ogph ZGp1c3RfYm9keV9jb3N0X3N2ZSAoY29uc3QgYWFyY2g2NF92ZWNfb3BfY291bnQgKm9wcywKCQkg ICAgICBmcmFjdGlvbmFsX2Nvc3Qgc2NhbGFyX2N5Y2xlc19wZXJfaXRlciwKCQkgICAgICB1bnNp Z25lZCBpbnQgb3JpZ19ib2R5X2Nvc3QsIHVuc2lnbmVkIGludCAqYm9keV9jb3N0LAoJCSAgICAg IGJvb2wgKnNob3VsZF9kaXNwYXJhZ2UpCnsKICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCiAgICBv cHMtPmR1bXAgKCk7CgogIGZyYWN0aW9uYWxfY29zdCBzdmVfcHJlZF9jeWNsZXNfcGVyX2l0ZXIg PSBvcHMtPm1pbl9wcmVkX2N5Y2xlc19wZXJfaXRlciAoKTsKICBmcmFjdGlvbmFsX2Nvc3Qgc3Zl X2N5Y2xlc19wZXJfaXRlciA9IG9wcy0+bWluX2N5Y2xlc19wZXJfaXRlciAoKTsKCiAgLyogSWYg dGhlIHNjYWxhciB2ZXJzaW9uIG9mIHRoZSBsb29wIGNvdWxkIGlzc3VlIGF0IGxlYXN0IGFzCiAg ICAgcXVpY2tseSBhcyB0aGUgcHJlZGljYXRlIHBhcnRzIG9mIHRoZSBTVkUgbG9vcCwgbWFrZSB0 aGUgU1ZFIGxvb3AKICAgICBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZS4gIEluIHRoaXMgY2FzZSB2 ZWN0b3JpemF0aW9uIGlzIGFkZGluZyBhbgogICAgIG92ZXJoZWFkIHRoYXQgdGhlIG9yaWdpbmFs IHNjYWxhciBjb2RlIGRpZG4ndCBoYXZlLgoKICAgICBUaGlzIGlzIG1vc3RseSBpbnRlbmRlZCB0 byBkZXRlY3QgY2FzZXMgaW4gd2hpY2ggV0hJTEVMT3MgZG9taW5hdGUKICAgICBmb3IgdmVyeSB0 aWdodCBsb29wcywgd2hpY2ggaXMgc29tZXRoaW5nIHRoYXQgbm9ybWFsIGxhdGVuY3ktYmFzZWQK ICAgICBjb3N0cyB3b3VsZCBub3QgbW9kZWwuICBBZGRpbmcgdGhpcyBraW5kIG9mIGNsaWZmZWRn ZSB3b3VsZCBiZQogICAgIHRvbyBkcmFzdGljIGZvciBzY2FsYXJfY3ljbGVzX3Blcl9pdGVyIHZz LiBzdmVfY3ljbGVzX3Blcl9pdGVyOwogICAgIGNvZGUgaW4gdGhlIGNhbGxlciBoYW5kbGVzIHRo YXQgY2FzZSBpbiBhIG1vcmUgY29uc2VydmF0aXZlIHdheS4gICovCiAgZnJhY3Rpb25hbF9jb3N0 IHN2ZV9lc3RpbWF0ZSA9IHN2ZV9wcmVkX2N5Y2xlc19wZXJfaXRlciArIDE7CiAgaWYgKHNjYWxh cl9jeWNsZXNfcGVyX2l0ZXIgPCBzdmVfZXN0aW1hdGUpCiAgICB7CiAgICAgIHVuc2lnbmVkIGlu dCBtaW5fY29zdAoJPSBvcmlnX2JvZHlfY29zdCAqIGVzdGltYXRlZF9wb2x5X3ZhbHVlIChCWVRF U19QRVJfU1ZFX1ZFQ1RPUik7CiAgICAgIGlmICgqYm9keV9jb3N0IDwgbWluX2Nvc3QpCgl7Cgkg IGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKCSAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2 ZWN0X2xvY2F0aW9uLAoJCQkgICAgICJJbmNyZWFzaW5nIGJvZHkgY29zdCB0byAlZCBiZWNhdXNl IHRoZSIKCQkJICAgICAiIHNjYWxhciBjb2RlIGNvdWxkIGlzc3VlIHdpdGhpbiB0aGUgbGltaXQi CgkJCSAgICAgIiBpbXBvc2VkIGJ5IHByZWRpY2F0ZSBvcGVyYXRpb25zXG4iLAoJCQkgICAgIG1p bl9jb3N0KTsKCSAgKmJvZHlfY29zdCA9IG1pbl9jb3N0OwoJICAqc2hvdWxkX2Rpc3BhcmFnZSA9 IHRydWU7Cgl9CiAgICB9CgogIHJldHVybiBzdmVfY3ljbGVzX3Blcl9pdGVyOwp9Cgp1bnNpZ25l ZCBpbnQKYWFyY2g2NF92ZWN0b3JfY29zdHM6OmRldGVybWluZV9zdWdnZXN0ZWRfdW5yb2xsX2Zh Y3RvciAoKQp7CiAgYm9vbCBzdmUgPSBtX3ZlY19mbGFncyAmIFZFQ19BTllfU1ZFOwogIC8qIElm IHdlIGFyZSB0cnlpbmcgdG8gdW5yb2xsIGFuIEFkdmFuY2VkIFNJTUQgbWFpbiBsb29wIHRoYXQg Y29udGFpbnMKICAgICBhbiBhdmVyYWdpbmcgb3BlcmF0aW9uIHRoYXQgd2UgZG8gbm90IHN1cHBv cnQgd2l0aCBTVkUgYW5kIHdlIG1pZ2h0IHVzZSBhCiAgICAgcHJlZGljYXRlZCBlcGlsb2d1ZSwg d2UgbmVlZCB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIGJsb2NrIHVucm9sbGluZyBhcwogICAgIHRo aXMgbWlnaHQgbGVhZCB0byBhIGxlc3Mgb3B0aW1hbCBsb29wIGZvciB0aGUgZmlyc3QgYW5kIG9u bHkgZXBpbG9ndWUKICAgICB1c2luZyB0aGUgb3JpZ2luYWwgbG9vcCdzIHZlY3Rvcml6YXRpb24g ZmFjdG9yLgogICAgIFRPRE86IFJlbW92ZSB0aGlzIGNvbnN0cmFpbnQgd2hlbiB3ZSBhZGQgc3Vw cG9ydCBmb3IgbXVsdGlwbGUgZXBpbG9ndWUKICAgICB2ZWN0b3JpemF0aW9uLiAgKi8KICBpZiAo IXN2ZSAmJiAhVEFSR0VUX1NWRTIgJiYgbV9oYXNfYXZnKQogICAgcmV0dXJuIDE7CgogIHVuc2ln bmVkIGludCBtYXhfdW5yb2xsX2ZhY3RvciA9IDE7CiAgZm9yIChhdXRvIHZlY19vcHMgOiBtX29w cykKICAgIHsKICAgICAgYWFyY2g2NF9zaW1kX3ZlY19pc3N1ZV9pbmZvIGNvbnN0ICp2ZWNfaXNz dWUKCT0gdmVjX29wcy5zaW1kX2lzc3VlX2luZm8gKCk7CiAgICAgIGlmICghdmVjX2lzc3VlKQoJ cmV0dXJuIDE7CiAgICAgIC8qIExpbWl0IHVucm9sbCBmYWN0b3IgdG8gYSB2YWx1ZSBhZGp1c3Rh YmxlIGJ5IHRoZSB1c2VyLCB0aGUgZGVmYXVsdAoJIHZhbHVlIGlzIDQuICovCiAgICAgIHVuc2ln bmVkIGludCB1bnJvbGxfZmFjdG9yID0gYWFyY2g2NF92ZWN0X3Vucm9sbF9saW1pdDsKICAgICAg dW5zaWduZWQgaW50IGZhY3RvcgogICAgICAgPSB2ZWNfb3BzLnJlZHVjdGlvbl9sYXRlbmN5ID4g MSA/IHZlY19vcHMucmVkdWN0aW9uX2xhdGVuY3kgOiAxOwogICAgICB1bnNpZ25lZCBpbnQgdGVt cDsKCiAgICAgIC8qIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgKi8K ICAgICAgaWYgKCh2ZWNfb3BzLnN0b3JlcyArIHZlY19vcHMubG9hZHMgKyB2ZWNfb3BzLmdlbmVy YWxfb3BzKSA9PSAwKQoJcmV0dXJuIDE7CgogICAgICAvKiBDaGVjayBzdG9yZXMuICAqLwogICAg ICBpZiAodmVjX29wcy5zdG9yZXMgPiAwKQoJewoJICB0ZW1wID0gQ0VJTCAoZmFjdG9yICogdmVj X2lzc3VlLT5zdG9yZXNfcGVyX2N5Y2xlLAoJCSAgICAgICB2ZWNfb3BzLnN0b3Jlcyk7CgkgIHVu cm9sbF9mYWN0b3IgPSBNSU4gKHVucm9sbF9mYWN0b3IsIHRlbXApOwoJfQoKICAgICAgLyogQ2hl Y2sgbG9hZHMgKyBzdG9yZXMuICAqLwogICAgICBpZiAodmVjX29wcy5sb2FkcyA+IDApCgl7Cgkg IHRlbXAgPSBDRUlMIChmYWN0b3IgKiB2ZWNfaXNzdWUtPmxvYWRzX3N0b3Jlc19wZXJfY3ljbGUs CgkJICAgICAgIHZlY19vcHMubG9hZHMgKyB2ZWNfb3BzLnN0b3Jlcyk7CgkgIHVucm9sbF9mYWN0 b3IgPSBNSU4gKHVucm9sbF9mYWN0b3IsIHRlbXApOwoJfQoKICAgICAgLyogQ2hlY2sgZ2VuZXJh bCBvcHMuICAqLwogICAgICBpZiAodmVjX29wcy5nZW5lcmFsX29wcyA+IDApCgl7CgkgIHRlbXAg PSBDRUlMIChmYWN0b3IgKiB2ZWNfaXNzdWUtPmdlbmVyYWxfb3BzX3Blcl9jeWNsZSwKCQkgICAg ICAgdmVjX29wcy5nZW5lcmFsX29wcyk7CgkgIHVucm9sbF9mYWN0b3IgPSBNSU4gKHVucm9sbF9m YWN0b3IsIHRlbXApOwoJIH0KICAgICAgbWF4X3Vucm9sbF9mYWN0b3IgPSBNQVggKG1heF91bnJv bGxfZmFjdG9yLCB1bnJvbGxfZmFjdG9yKTsKICAgIH0KCiAgLyogTWFrZSBzdXJlIHVucm9sbCBm YWN0b3IgaXMgcG93ZXIgb2YgMi4gICovCiAgcmV0dXJuIDEgPDwgY2VpbF9sb2cyIChtYXhfdW5y b2xsX2ZhY3Rvcik7Cn0KCi8qIEJPRFlfQ09TVCBpcyB0aGUgY29zdCBvZiBhIHZlY3RvciBsb29w IGJvZHkuICBBZGp1c3QgdGhlIGNvc3QgYXMgbmVjZXNzYXJ5CiAgIGFuZCByZXR1cm4gdGhlIG5l dyBjb3N0LiAgKi8KdW5zaWduZWQgaW50CmFhcmNoNjRfdmVjdG9yX2Nvc3RzOjoKYWRqdXN0X2Jv ZHlfY29zdCAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvLAoJCSAgY29uc3QgYWFyY2g2NF92ZWN0 b3JfY29zdHMgKnNjYWxhcl9jb3N0cywKCQkgIHVuc2lnbmVkIGludCBib2R5X2Nvc3QpCnsKICBp ZiAoc2NhbGFyX2Nvc3RzLT5tX29wcy5pc19lbXB0eSAoKSB8fCBtX29wcy5pc19lbXB0eSAoKSkK ICAgIHJldHVybiBib2R5X2Nvc3Q7CgogIGNvbnN0IGF1dG8gJnNjYWxhcl9vcHMgPSBzY2FsYXJf Y29zdHMtPm1fb3BzWzBdOwogIGNvbnN0IGF1dG8gJnZlY3Rvcl9vcHMgPSBtX29wc1swXTsKICB1 bnNpZ25lZCBpbnQgZXN0aW1hdGVkX3ZmID0gdmVjdF92Zl9mb3JfY29zdCAobG9vcF92aW5mbyk7 CiAgdW5zaWduZWQgaW50IG9yaWdfYm9keV9jb3N0ID0gYm9keV9jb3N0OwogIGJvb2wgc2hvdWxk X2Rpc3BhcmFnZSA9IGZhbHNlOwoKICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCiAgICBkdW1wX3By aW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAoJCSAgICAgIk9yaWdpbmFsIHZlY3Rv ciBib2R5IGNvc3QgPSAlZFxuIiwgYm9keV9jb3N0KTsKCiAgZnJhY3Rpb25hbF9jb3N0IHNjYWxh cl9jeWNsZXNfcGVyX2l0ZXIKICAgID0gc2NhbGFyX29wcy5taW5fY3ljbGVzX3Blcl9pdGVyICgp ICogZXN0aW1hdGVkX3ZmOwoKICBmcmFjdGlvbmFsX2Nvc3QgdmVjdG9yX2N5Y2xlc19wZXJfaXRl ciA9IHZlY3Rvcl9vcHMubWluX2N5Y2xlc19wZXJfaXRlciAoKTsKCiAgaWYgKGR1bXBfZW5hYmxl ZF9wICgpKQogICAgewogICAgICBpZiAoSU5fUkFOR0UgKG1fbnVtX3ZlY3Rvcl9pdGVyYXRpb25z LCAwLCA2NTUzNikpCglkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAoJ CQkgIlZlY3RvciBsb29wIGl0ZXJhdGVzIGF0IG1vc3QgJXdkIHRpbWVzXG4iLAoJCQkgbV9udW1f dmVjdG9yX2l0ZXJhdGlvbnMpOwogICAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0 X2xvY2F0aW9uLCAiU2NhbGFyIGlzc3VlIGVzdGltYXRlOlxuIik7CiAgICAgIHNjYWxhcl9vcHMu ZHVtcCAoKTsKICAgICAgZHVtcF9wcmludGZfbG9jIChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwK CQkgICAgICAgIiAgZXN0aW1hdGVkIGN5Y2xlcyBwZXIgdmVjdG9yIGl0ZXJhdGlvbiIKCQkgICAg ICAgIiAoZm9yIFZGICVkKSA9ICVmXG4iLAoJCSAgICAgICBlc3RpbWF0ZWRfdmYsIHNjYWxhcl9j eWNsZXNfcGVyX2l0ZXIuYXNfZG91YmxlICgpKTsKICAgIH0KCiAgaWYgKHZlY3Rvcl9vcHMuc3Zl X2lzc3VlX2luZm8gKCkpCiAgICB7CiAgICAgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKCWR1bXBf cHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRpb24sICJTVkUgaXNzdWUgZXN0aW1hdGU6 XG4iKTsKICAgICAgdmVjdG9yX2N5Y2xlc19wZXJfaXRlcgoJPSBhZGp1c3RfYm9keV9jb3N0X3N2 ZSAoJnZlY3Rvcl9vcHMsIHNjYWxhcl9jeWNsZXNfcGVyX2l0ZXIsCgkJCQlvcmlnX2JvZHlfY29z dCwgJmJvZHlfY29zdCwgJnNob3VsZF9kaXNwYXJhZ2UpOwoKICAgICAgaWYgKGFhcmNoNjRfdHVu ZV9wYXJhbXMudmVjX2Nvc3RzID09ICZuZW92ZXJzZTUxMnR2Yl92ZWN0b3JfY29zdCkKCXsKCSAg LyogQWxzbyB0YWtlIE5lb3ZlcnNlIFYxIHR1bmluZyBpbnRvIGFjY291bnQsIGRvdWJsaW5nIHRo ZQoJICAgICBzY2FsYXIgYW5kIEFkdmFuY2VkIFNJTUQgZXN0aW1hdGVzIHRvIGFjY291bnQgZm9y IHRoZQoJICAgICBkb3VibGluZyBpbiBTVkUgdmVjdG9yIGxlbmd0aC4gICovCgkgIGlmIChkdW1w X2VuYWJsZWRfcCAoKSkKCSAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0 aW9uLAoJCQkgICAgICJOZW92ZXJzZSBWMSBlc3RpbWF0ZTpcbiIpOwoJICBhdXRvIHZmX2ZhY3Rv ciA9IG1fb3BzWzFdLnZmX2ZhY3RvciAoKTsKCSAgYWRqdXN0X2JvZHlfY29zdF9zdmUgKCZtX29w c1sxXSwgc2NhbGFyX2N5Y2xlc19wZXJfaXRlciAqIHZmX2ZhY3RvciwKCQkJCW9yaWdfYm9keV9j b3N0LCAmYm9keV9jb3N0LCAmc2hvdWxkX2Rpc3BhcmFnZSk7Cgl9CiAgICB9CiAgZWxzZQogICAg ewogICAgICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCgl7CgkgIGR1bXBfcHJpbnRmX2xvYyAoTVNH X05PVEUsIHZlY3RfbG9jYXRpb24sCgkJCSAgICJWZWN0b3IgaXNzdWUgZXN0aW1hdGU6XG4iKTsK CSAgdmVjdG9yX29wcy5kdW1wICgpOwoJfQogICAgfQoKICAvKiBEZWNpZGUgd2hldGhlciB0byBz dGljayB0byBsYXRlbmN5LWJhc2VkIGNvc3RzIG9yIHdoZXRoZXIgdG8gdHJ5IHRvCiAgICAgdGFr ZSBpc3N1ZSByYXRlcyBpbnRvIGFjY291bnQuICAqLwogIHVuc2lnbmVkIGludCB0aHJlc2hvbGQg PSBhYXJjaDY0X2xvb3BfdmVjdF9pc3N1ZV9yYXRlX25pdGVyczsKICBpZiAobV92ZWNfZmxhZ3Mg JiBWRUNfQU5ZX1NWRSkKICAgIHRocmVzaG9sZCA9IENFSUwgKHRocmVzaG9sZCwgYWFyY2g2NF9l c3RpbWF0ZWRfc3ZlX3ZxICgpKTsKCiAgaWYgKG1fbnVtX3ZlY3Rvcl9pdGVyYXRpb25zID49IDEK ICAgICAgJiYgbV9udW1fdmVjdG9yX2l0ZXJhdGlvbnMgPCB0aHJlc2hvbGQpCiAgICB7CiAgICAg IGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKCWR1bXBfcHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3Rf bG9jYXRpb24sCgkJCSAiTG93IGl0ZXJhdGlvbiBjb3VudCwgc28gdXNpbmcgcHVyZSBsYXRlbmN5 IgoJCQkgIiBjb3N0c1xuIik7CiAgICB9CiAgLyogSW5jcmVhc2UgdGhlIGNvc3Qgb2YgdGhlIHZl Y3RvciBjb2RlIGlmIGl0IGxvb2tzIGxpa2UgdGhlIHNjYWxhciBjb2RlCiAgICAgY291bGQgaXNz dWUgbW9yZSBxdWlja2x5LiAgVGhlc2UgdmFsdWVzIGFyZSBvbmx5IHJvdWdoIGVzdGltYXRlcywK ICAgICBzbyBtaW5vciBkaWZmZXJlbmNlcyBzaG91bGQgb25seSByZXN1bHQgaW4gbWlub3IgY2hh bmdlcy4gICovCiAgZWxzZSBpZiAoc2NhbGFyX2N5Y2xlc19wZXJfaXRlciA8IHZlY3Rvcl9jeWNs ZXNfcGVyX2l0ZXIpCiAgICB7CiAgICAgIGJvZHlfY29zdCA9IGZyYWN0aW9uYWxfY29zdDo6c2Nh bGUgKGJvZHlfY29zdCwgdmVjdG9yX2N5Y2xlc19wZXJfaXRlciwKCQkJCQkgIHNjYWxhcl9jeWNs ZXNfcGVyX2l0ZXIpOwogICAgICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCglkdW1wX3ByaW50Zl9s b2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAoJCQkgIkluY3JlYXNpbmcgYm9keSBjb3N0IHRv ICVkIGJlY2F1c2Ugc2NhbGFyIGNvZGUiCgkJCSAiIHdvdWxkIGlzc3VlIG1vcmUgcXVpY2tseVxu IiwgYm9keV9jb3N0KTsKICAgIH0KICAvKiBJbiBnZW5lcmFsLCBpdCdzIGV4cGVjdGVkIHRoYXQg dGhlIHByb3Bvc2VkIHZlY3RvciBjb2RlIHdvdWxkIGJlIGFibGUKICAgICB0byBpc3N1ZSBtb3Jl IHF1aWNrbHkgdGhhbiB0aGUgb3JpZ2luYWwgc2NhbGFyIGNvZGUuICBUaGlzIHNob3VsZAogICAg IGFscmVhZHkgYmUgcmVmbGVjdGVkIHRvIHNvbWUgZXh0ZW50IGluIHRoZSBsYXRlbmN5LWJhc2Vk IGNvc3RzLgoKICAgICBIb3dldmVyLCB0aGUgbGF0ZW5jeS1iYXNlZCBjb3N0cyBlZmZlY3RpdmVs eSBhc3N1bWUgdGhhdCB0aGUgc2NhbGFyCiAgICAgY29kZSBhbmQgdGhlIHZlY3RvciBjb2RlIGV4 ZWN1dGUgc2VyaWFsbHksIHdoaWNoIHRlbmRzIHRvIHVuZGVycGxheQogICAgIG9uZSBpbXBvcnRh bnQgY2FzZTogaWYgdGhlIHJlYWwgKG5vbi1zZXJpYWxpemVkKSBleGVjdXRpb24gdGltZSBvZgog ICAgIGEgc2NhbGFyIGl0ZXJhdGlvbiBpcyBkb21pbmF0ZWQgYnkgbG9vcC1jYXJyaWVkIGRlcGVu ZGVuY2llcywKICAgICBhbmQgaWYgdGhlIHZlY3RvciBjb2RlIGlzIGFibGUgdG8gcmVkdWNlIGJv dGggdGhlIGxlbmd0aCBvZgogICAgIHRoZSBsb29wLWNhcnJpZWQgZGVwZW5kZW5jaWVzICphbmQq IHRoZSBudW1iZXIgb2YgY3ljbGVzIG5lZWRlZAogICAgIHRvIGlzc3VlIHRoZSBjb2RlIGluIGdl bmVyYWwsIHdlIGNhbiBiZSBtb3JlIGNvbmZpZGVudCB0aGF0IHRoZQogICAgIHZlY3RvciBjb2Rl IGlzIGFuIGltcHJvdmVtZW50LCBldmVuIGlmIGFkZGluZyB0aGUgb3RoZXIgKG5vbi1sb29wLWNh cnJpZWQpCiAgICAgbGF0ZW5jaWVzIHRlbmRzIHRvIGhpZGUgdGhpcyBzYXZpbmcuICBXZSB0aGVy ZWZvcmUgcmVkdWNlIHRoZSBjb3N0IG9mIHRoZQogICAgIHZlY3RvciBsb29wIGJvZHkgaW4gcHJv cG9ydGlvbiB0byB0aGUgc2F2aW5nLiAgKi8KICBlbHNlIGlmIChzY2FsYXJfb3BzLnJlZHVjdGlv bl9sYXRlbmN5ID4gdmVjdG9yX29wcy5yZWR1Y3Rpb25fbGF0ZW5jeQoJICAgJiYgc2NhbGFyX29w cy5yZWR1Y3Rpb25fbGF0ZW5jeSA9PSBzY2FsYXJfY3ljbGVzX3Blcl9pdGVyCgkgICAmJiBzY2Fs YXJfY3ljbGVzX3Blcl9pdGVyID4gdmVjdG9yX2N5Y2xlc19wZXJfaXRlcgoJICAgJiYgIXNob3Vs ZF9kaXNwYXJhZ2UpCiAgICB7CiAgICAgIGJvZHlfY29zdCA9IGZyYWN0aW9uYWxfY29zdDo6c2Nh bGUgKGJvZHlfY29zdCwgdmVjdG9yX2N5Y2xlc19wZXJfaXRlciwKCQkJCQkgIHNjYWxhcl9jeWNs ZXNfcGVyX2l0ZXIpOwogICAgICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCglkdW1wX3ByaW50Zl9s b2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAoJCQkgIkRlY3JlYXNpbmcgYm9keSBjb3N0IHRv ICVkIGFjY291bnQgZm9yIHNtYWxsZXIiCgkJCSAiIHJlZHVjdGlvbiBsYXRlbmN5XG4iLCBib2R5 X2Nvc3QpOwogICAgfQoKICByZXR1cm4gYm9keV9jb3N0Owp9Cgp2b2lkCmFhcmNoNjRfdmVjdG9y X2Nvc3RzOjpmaW5pc2hfY29zdCAoY29uc3QgdmVjdG9yX2Nvc3RzICp1bmNhc3Rfc2NhbGFyX2Nv c3RzKQp7CiAgYXV0byAqc2NhbGFyX2Nvc3RzCiAgICA9IHN0YXRpY19jYXN0PGNvbnN0IGFhcmNo NjRfdmVjdG9yX2Nvc3RzICo+ICh1bmNhc3Rfc2NhbGFyX2Nvc3RzKTsKICBsb29wX3ZlY19pbmZv IGxvb3BfdmluZm8gPSBkeW5fY2FzdDxsb29wX3ZlY19pbmZvPiAobV92aW5mbyk7CiAgaWYgKGxv b3BfdmluZm8KICAgICAgJiYgbV92ZWNfZmxhZ3MKICAgICAgJiYgYWFyY2g2NF91c2VfbmV3X3Zl Y3Rvcl9jb3N0c19wICgpKQogICAgewogICAgICBtX2Nvc3RzW3ZlY3RfYm9keV0gPSBhZGp1c3Rf Ym9keV9jb3N0IChsb29wX3ZpbmZvLCBzY2FsYXJfY29zdHMsCgkJCQkJICAgICBtX2Nvc3RzW3Zl Y3RfYm9keV0pOwogICAgICBtX3N1Z2dlc3RlZF91bnJvbGxfZmFjdG9yID0gZGV0ZXJtaW5lX3N1 Z2dlc3RlZF91bnJvbGxfZmFjdG9yICgpOwogICAgfQoKICAvKiBBcHBseSB0aGUgaGV1cmlzdGlj IGRlc2NyaWJlZCBhYm92ZSBtX3N0cF9zZXF1ZW5jZV9jb3N0LiAgUHJlZmVyCiAgICAgdGhlIHNj YWxhciBjb2RlIGluIHRoZSBldmVudCBvZiBhIHRpZSwgc2luY2UgdGhlcmUgaXMgbW9yZSBjaGFu Y2UKICAgICBvZiBzY2FsYXIgY29kZSBiZWluZyBvcHRpbWl6ZWQgd2l0aCBzdXJyb3VuZGluZyBv cGVyYXRpb25zLgoKICAgICBJbiBhZGRpdGlvbiwgaWYgdGhlIHZlY3RvciBib2R5IGlzIGEgc2lt cGxlIHN0b3JlIHRvIGEgZGVjbCB0aGF0CiAgICAgaXMgZWxzZXdoZXJlIGxvYWRlZCB1c2luZyB2 bGQxLCBzdHJvbmdseSBwcmVmZXIgdGhlIHZlY3RvciBmb3JtLAogICAgIHRvIHRoZSBleHRlbnQg b2YgZ2l2aW5nIHRoZSBwcm9sb2d1ZSBhIHplcm8gY29zdC4gIFNlZSB0aGUgY29tbWVudAogICAg IGFib3ZlIG1fc3RvcmVzX3RvX3ZlY3Rvcl9sb2FkX2RlY2wgZm9yIGRldGFpbHMuICAqLwogIGlm ICghbG9vcF92aW5mbwogICAgICAmJiBzY2FsYXJfY29zdHMKICAgICAgJiYgbV9zdHBfc2VxdWVu Y2VfY29zdCAhPSB+MFUpCiAgICB7CiAgICAgIGlmIChtX3N0b3Jlc190b192ZWN0b3JfbG9hZF9k ZWNsKQoJbV9jb3N0c1t2ZWN0X3Byb2xvZ3VlXSA9IDA7CiAgICAgIGVsc2UgaWYgKG1fc3RwX3Nl cXVlbmNlX2Nvc3QgPj0gc2NhbGFyX2Nvc3RzLT5tX3N0cF9zZXF1ZW5jZV9jb3N0KQoJbV9jb3N0 c1t2ZWN0X2JvZHldID0gMiAqIHNjYWxhcl9jb3N0cy0+dG90YWxfY29zdCAoKTsKICAgIH0KCiAg dmVjdG9yX2Nvc3RzOjpmaW5pc2hfY29zdCAoc2NhbGFyX2Nvc3RzKTsKfQoKYm9vbAphYXJjaDY0 X3ZlY3Rvcl9jb3N0czo6CmJldHRlcl9tYWluX2xvb3BfdGhhbl9wIChjb25zdCB2ZWN0b3JfY29z dHMgKnVuY2FzdF9vdGhlcikgY29uc3QKewogIGF1dG8gb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25z dCBhYXJjaDY0X3ZlY3Rvcl9jb3N0cyAqPiAodW5jYXN0X290aGVyKTsKCiAgYXV0byB0aGlzX2xv b3BfdmluZm8gPSBhc19hPGxvb3BfdmVjX2luZm8+ICh0aGlzLT5tX3ZpbmZvKTsKICBhdXRvIG90 aGVyX2xvb3BfdmluZm8gPSBhc19hPGxvb3BfdmVjX2luZm8+IChvdGhlci0+bV92aW5mbyk7Cgog IGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKICAgIGR1bXBfcHJpbnRmX2xvYyAoTVNHX05PVEUsIHZl Y3RfbG9jYXRpb24sCgkJICAgICAiQ29tcGFyaW5nIHR3byBtYWluIGxvb3BzICglcyBhdCBWRiAl ZCB2cyAlcyBhdCBWRiAlZClcbiIsCgkJICAgICBHRVRfTU9ERV9OQU1FICh0aGlzX2xvb3Bfdmlu Zm8tPnZlY3Rvcl9tb2RlKSwKCQkgICAgIHZlY3RfdmZfZm9yX2Nvc3QgKHRoaXNfbG9vcF92aW5m byksCgkJICAgICBHRVRfTU9ERV9OQU1FIChvdGhlcl9sb29wX3ZpbmZvLT52ZWN0b3JfbW9kZSks CgkJICAgICB2ZWN0X3ZmX2Zvcl9jb3N0IChvdGhlcl9sb29wX3ZpbmZvKSk7CgogIC8qIEFwcGx5 IHRoZSB1bnJvbGxpbmcgaGV1cmlzdGljIGRlc2NyaWJlZCBhYm92ZQogICAgIG1fdW5yb2xsZWRf YWR2c2ltZF9uaXRlcnMuICAqLwogIGlmIChib29sIChtX3Vucm9sbGVkX2FkdnNpbWRfc3RtdHMp CiAgICAgICE9IGJvb2wgKG90aGVyLT5tX3Vucm9sbGVkX2FkdnNpbWRfc3RtdHMpKQogICAgewog ICAgICBib29sIHRoaXNfcHJlZmVyX3Vucm9sbGVkID0gdGhpcy0+cHJlZmVyX3Vucm9sbGVkX2xv b3AgKCk7CiAgICAgIGJvb2wgb3RoZXJfcHJlZmVyX3Vucm9sbGVkID0gb3RoZXItPnByZWZlcl91 bnJvbGxlZF9sb29wICgpOwogICAgICBpZiAodGhpc19wcmVmZXJfdW5yb2xsZWQgIT0gb3RoZXJf cHJlZmVyX3Vucm9sbGVkKQoJewoJICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCgkgICAgZHVtcF9w cmludGZfbG9jIChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKCQkJICAgICAiUHJlZmVycmluZyBB ZHZhbmNlZCBTSU1EIGxvb3AgYmVjYXVzZSIKCQkJICAgICAiIGl0IGNhbiBiZSB1bnJvbGxlZFxu Iik7CgkgIHJldHVybiBvdGhlcl9wcmVmZXJfdW5yb2xsZWQ7Cgl9CiAgICB9CgogIGZvciAodW5z aWduZWQgaW50IGkgPSAwOyBpIDwgbV9vcHMubGVuZ3RoICgpOyArK2kpCiAgICB7CiAgICAgIGlm IChkdW1wX2VuYWJsZWRfcCAoKSkKCXsKCSAgaWYgKGkpCgkgICAgZHVtcF9wcmludGZfbG9jIChN U0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKCQkJICAgICAiUmVjb25zaWRlcmluZyB3aXRoIHN1YnR1 bmluZyAlZFxuIiwgaSk7CgkgIGR1bXBfcHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRp b24sCgkJCSAgICJJc3N1ZSBpbmZvIGZvciAlcyBsb29wOlxuIiwKCQkJICAgR0VUX01PREVfTkFN RSAodGhpc19sb29wX3ZpbmZvLT52ZWN0b3JfbW9kZSkpOwoJICB0aGlzLT5tX29wc1tpXS5kdW1w ICgpOwoJICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAoJCQkgICAi SXNzdWUgaW5mbyBmb3IgJXMgbG9vcDpcbiIsCgkJCSAgIEdFVF9NT0RFX05BTUUgKG90aGVyX2xv b3BfdmluZm8tPnZlY3Rvcl9tb2RlKSk7CgkgIG90aGVyLT5tX29wc1tpXS5kdW1wICgpOwoJfQoK ICAgICAgYXV0byB0aGlzX2VzdGltYXRlZF92ZiA9ICh2ZWN0X3ZmX2Zvcl9jb3N0ICh0aGlzX2xv b3BfdmluZm8pCgkJCQkqIHRoaXMtPm1fb3BzW2ldLnZmX2ZhY3RvciAoKSk7CiAgICAgIGF1dG8g b3RoZXJfZXN0aW1hdGVkX3ZmID0gKHZlY3RfdmZfZm9yX2Nvc3QgKG90aGVyX2xvb3BfdmluZm8p CgkJCQkgKiBvdGhlci0+bV9vcHNbaV0udmZfZmFjdG9yICgpKTsKCiAgICAgIC8qIElmIGl0IGFw cGVhcnMgdGhhdCBvbmUgbG9vcCBjb3VsZCBwcm9jZXNzIHRoZSBzYW1lIGFtb3VudCBvZiBkYXRh CgkgaW4gZmV3ZXIgY3ljbGVzLCBwcmVmZXIgdGhhdCBsb29wIG92ZXIgdGhlIG90aGVyIG9uZS4g ICovCiAgICAgIGZyYWN0aW9uYWxfY29zdCB0aGlzX2Nvc3QKCT0gdGhpcy0+bV9vcHNbaV0ubWlu X2N5Y2xlc19wZXJfaXRlciAoKSAqIG90aGVyX2VzdGltYXRlZF92ZjsKICAgICAgZnJhY3Rpb25h bF9jb3N0IG90aGVyX2Nvc3QKCT0gb3RoZXItPm1fb3BzW2ldLm1pbl9jeWNsZXNfcGVyX2l0ZXIg KCkgKiB0aGlzX2VzdGltYXRlZF92ZjsKICAgICAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQoJewoJ ICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAoJCQkgICAiV2VpZ2h0 ZWQgY3ljbGVzIHBlciBpdGVyYXRpb24gb2YgJXMgbG9vcCB+PSAlZlxuIiwKCQkJICAgR0VUX01P REVfTkFNRSAodGhpc19sb29wX3ZpbmZvLT52ZWN0b3JfbW9kZSksCgkJCSAgIHRoaXNfY29zdC5h c19kb3VibGUgKCkpOwoJICBkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9u LAoJCQkgICAiV2VpZ2h0ZWQgY3ljbGVzIHBlciBpdGVyYXRpb24gb2YgJXMgbG9vcCB+PSAlZlxu IiwKCQkJICAgR0VUX01PREVfTkFNRSAob3RoZXJfbG9vcF92aW5mby0+dmVjdG9yX21vZGUpLAoJ CQkgICBvdGhlcl9jb3N0LmFzX2RvdWJsZSAoKSk7Cgl9CiAgICAgIGlmICh0aGlzX2Nvc3QgIT0g b3RoZXJfY29zdCkKCXsKCSAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQoJICAgIGR1bXBfcHJpbnRm X2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRpb24sCgkJCSAgICAgIlByZWZlcnJpbmcgbG9vcCB3 aXRoIGxvd2VyIGN5Y2xlcyIKCQkJICAgICAiIHBlciBpdGVyYXRpb25cbiIpOwoJICByZXR1cm4g dGhpc19jb3N0IDwgb3RoZXJfY29zdDsKCX0KCiAgICAgIC8qIElmIHRoZSBpc3N1ZSByYXRlIG9m IFNWRSBjb2RlIGlzIGxpbWl0ZWQgYnkgcHJlZGljYXRlIG9wZXJhdGlvbnMKCSAoaS5lLiBpZiBz dmVfcHJlZF9jeWNsZXNfcGVyX2l0ZXIgPiBzdmVfbm9ucHJlZF9jeWNsZXNfcGVyX2l0ZXIpLAoJ IGFuZCBpZiBBZHZhbmNlZCBTSU1EIGNvZGUgY291bGQgaXNzdWUgd2l0aGluIHRoZSBsaW1pdCBp bXBvc2VkCgkgYnkgdGhlIHByZWRpY2F0ZSBvcGVyYXRpb25zLCB0aGUgcHJlZGljYXRlIG9wZXJh dGlvbnMgYXJlIGFkZGluZyBhbgoJIG92ZXJoZWFkIHRoYXQgdGhlIG9yaWdpbmFsIGNvZGUgZGlk bid0IGhhdmUgYW5kIHNvIHdlIHNob3VsZCBwcmVmZXIKCSB0aGUgQWR2YW5jZWQgU0lNRCB2ZXJz aW9uLiAgKi8KICAgICAgYXV0byBiZXR0ZXJfcHJlZF9saW1pdF9wID0gW10oY29uc3QgYWFyY2g2 NF92ZWNfb3BfY291bnQgJmEsCgkJCQkgICAgY29uc3QgYWFyY2g2NF92ZWNfb3BfY291bnQgJmIp IC0+IGJvb2wKCXsKCSAgaWYgKGEucHJlZF9vcHMgPT0gMAoJICAgICAgJiYgKGIubWluX3ByZWRf Y3ljbGVzX3Blcl9pdGVyICgpCgkJICA+IGIubWluX25vbnByZWRfY3ljbGVzX3Blcl9pdGVyICgp KSkKCSAgICB7CgkgICAgICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCgkJZHVtcF9wcmludGZfbG9j IChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKCQkJCSAiUHJlZmVycmluZyBBZHZhbmNlZCBTSU1E IGxvb3Agc2luY2UiCgkJCQkgIiBTVkUgbG9vcCBpcyBwcmVkaWNhdGUtbGltaXRlZFxuIik7Cgkg ICAgICByZXR1cm4gdHJ1ZTsKCSAgICB9CgkgIHJldHVybiBmYWxzZTsKCX07CiAgICAgIGlmIChi ZXR0ZXJfcHJlZF9saW1pdF9wICh0aGlzLT5tX29wc1tpXSwgb3RoZXItPm1fb3BzW2ldKSkKCXJl dHVybiB0cnVlOwogICAgICBpZiAoYmV0dGVyX3ByZWRfbGltaXRfcCAob3RoZXItPm1fb3BzW2ld LCB0aGlzLT5tX29wc1tpXSkpCglyZXR1cm4gZmFsc2U7CiAgICB9CgogIHJldHVybiB2ZWN0b3Jf Y29zdHM6OmJldHRlcl9tYWluX2xvb3BfdGhhbl9wIChvdGhlcik7Cn0KCnN0YXRpYyB2b2lkIGlu aXRpYWxpemVfYWFyY2g2NF9jb2RlX21vZGVsIChzdHJ1Y3QgZ2NjX29wdGlvbnMgKik7CgovKiBQ YXJzZSB0aGUgVE9fUEFSU0Ugc3RyaW5nIGFuZCBwdXQgdGhlIGFyY2hpdGVjdHVyZSBzdHJ1Y3Qg dGhhdCBpdAogICBzZWxlY3RzIGludG8gUkVTIGFuZCB0aGUgYXJjaGl0ZWN0dXJhbCBmZWF0dXJl cyBpbnRvIElTQV9GTEFHUy4KICAgUmV0dXJuIGFuIGFhcmNoX3BhcnNlX29wdF9yZXN1bHQgZGVz Y3JpYmluZyB0aGUgcGFyc2UgcmVzdWx0LgogICBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5n LCBSRVMgYW5kIElTQV9GTEFHUyBhcmUgbGVmdCB1bmNoYW5nZWQuCiAgIFdoZW4gdGhlIFRPX1BB UlNFIHN0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGV4dGVuc2lvbiwKICAgYSBjb3B5IG9mIHRo ZSBzdHJpbmcgaXMgY3JlYXRlZCBhbmQgc3RvcmVkIHRvIElOVkFMSURfRVhURU5TSU9OLiAgKi8K CnN0YXRpYyBlbnVtIGFhcmNoX3BhcnNlX29wdF9yZXN1bHQKYWFyY2g2NF9wYXJzZV9hcmNoIChj b25zdCBjaGFyICp0b19wYXJzZSwgY29uc3Qgc3RydWN0IHByb2Nlc3NvciAqKnJlcywKCQkgICAg YWFyY2g2NF9mZWF0dXJlX2ZsYWdzICppc2FfZmxhZ3MsCgkJICAgIHN0ZDo6c3RyaW5nICppbnZh bGlkX2V4dGVuc2lvbikKewogIGNvbnN0IGNoYXIgKmV4dDsKICBjb25zdCBzdHJ1Y3QgcHJvY2Vz c29yICphcmNoOwogIHNpemVfdCBsZW47CgogIGV4dCA9IHN0cmNociAodG9fcGFyc2UsICcrJyk7 CgogIGlmIChleHQgIT0gTlVMTCkKICAgIGxlbiA9IGV4dCAtIHRvX3BhcnNlOwogIGVsc2UKICAg IGxlbiA9IHN0cmxlbiAodG9fcGFyc2UpOwoKICBpZiAobGVuID09IDApCiAgICByZXR1cm4gQUFS Q0hfUEFSU0VfTUlTU0lOR19BUkc7CgoKICAvKiBMb29wIHRocm91Z2ggdGhlIGxpc3Qgb2Ygc3Vw cG9ydGVkIEFSQ0hlcyB0byBmaW5kIGEgbWF0Y2guICAqLwogIGZvciAoYXJjaCA9IGFsbF9hcmNo aXRlY3R1cmVzOyBhcmNoLT5uYW1lICE9IE5VTEw7IGFyY2grKykKICAgIHsKICAgICAgaWYgKHN0 cmxlbiAoYXJjaC0+bmFtZSkgPT0gbGVuCgkgICYmIHN0cm5jbXAgKGFyY2gtPm5hbWUsIHRvX3Bh cnNlLCBsZW4pID09IDApCgl7CgkgIGF1dG8gaXNhX3RlbXAgPSBhcmNoLT5mbGFnczsKCgkgIGlm IChleHQgIT0gTlVMTCkKCSAgICB7CgkgICAgICAvKiBUT19QQVJTRSBzdHJpbmcgY29udGFpbnMg YXQgbGVhc3Qgb25lIGV4dGVuc2lvbi4gICovCgkgICAgICBlbnVtIGFhcmNoX3BhcnNlX29wdF9y ZXN1bHQgZXh0X3JlcwoJCT0gYWFyY2g2NF9wYXJzZV9leHRlbnNpb24gKGV4dCwgJmlzYV90ZW1w LCBpbnZhbGlkX2V4dGVuc2lvbik7CgoJICAgICAgaWYgKGV4dF9yZXMgIT0gQUFSQ0hfUEFSU0Vf T0spCgkJcmV0dXJuIGV4dF9yZXM7CgkgICAgfQoJICAvKiBFeHRlbnNpb24gcGFyc2luZyB3YXMg c3VjY2Vzc2Z1bC4gIENvbmZpcm0gdGhlIHJlc3VsdAoJICAgICBhcmNoIGFuZCBJU0EgZmxhZ3Mu ICAqLwoJICAqcmVzID0gYXJjaDsKCSAgKmlzYV9mbGFncyA9IGlzYV90ZW1wOwoJICByZXR1cm4g QUFSQ0hfUEFSU0VfT0s7Cgl9CiAgICB9CgogIC8qIEFSQ0ggbmFtZSBub3QgZm91bmQgaW4gbGlz dC4gICovCiAgcmV0dXJuIEFBUkNIX1BBUlNFX0lOVkFMSURfQVJHOwp9CgovKiBQYXJzZSB0aGUg VE9fUEFSU0Ugc3RyaW5nIGFuZCBwdXQgdGhlIHJlc3VsdCB0dW5pbmcgaW4gUkVTIGFuZCB0aGUK ICAgYXJjaGl0ZWN0dXJlIGZsYWdzIGluIElTQV9GTEFHUy4gIFJldHVybiBhbiBhYXJjaF9wYXJz ZV9vcHRfcmVzdWx0CiAgIGRlc2NyaWJpbmcgdGhlIHBhcnNlIHJlc3VsdC4gIElmIHRoZXJlIGlz IGFuIGVycm9yIHBhcnNpbmcsIFJFUyBhbmQKICAgSVNBX0ZMQUdTIGFyZSBsZWZ0IHVuY2hhbmdl ZC4KICAgV2hlbiB0aGUgVE9fUEFSU0Ugc3RyaW5nIGNvbnRhaW5zIGFuIGludmFsaWQgZXh0ZW5z aW9uLAogICBhIGNvcHkgb2YgdGhlIHN0cmluZyBpcyBjcmVhdGVkIGFuZCBzdG9yZWQgdG8gSU5W QUxJRF9FWFRFTlNJT04uICAqLwoKc3RhdGljIGVudW0gYWFyY2hfcGFyc2Vfb3B0X3Jlc3VsdAph YXJjaDY0X3BhcnNlX2NwdSAoY29uc3QgY2hhciAqdG9fcGFyc2UsIGNvbnN0IHN0cnVjdCBwcm9j ZXNzb3IgKipyZXMsCgkJICAgYWFyY2g2NF9mZWF0dXJlX2ZsYWdzICppc2FfZmxhZ3MsCgkJICAg c3RkOjpzdHJpbmcgKmludmFsaWRfZXh0ZW5zaW9uKQp7CiAgY29uc3QgY2hhciAqZXh0OwogIGNv bnN0IHN0cnVjdCBwcm9jZXNzb3IgKmNwdTsKICBzaXplX3QgbGVuOwoKICBleHQgPSBzdHJjaHIg KHRvX3BhcnNlLCAnKycpOwoKICBpZiAoZXh0ICE9IE5VTEwpCiAgICBsZW4gPSBleHQgLSB0b19w YXJzZTsKICBlbHNlCiAgICBsZW4gPSBzdHJsZW4gKHRvX3BhcnNlKTsKCiAgaWYgKGxlbiA9PSAw KQogICAgcmV0dXJuIEFBUkNIX1BBUlNFX01JU1NJTkdfQVJHOwoKCiAgLyogTG9vcCB0aHJvdWdo IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBDUFVzIHRvIGZpbmQgYSBtYXRjaC4gICovCiAgZm9yIChj cHUgPSBhbGxfY29yZXM7IGNwdS0+bmFtZSAhPSBOVUxMOyBjcHUrKykKICAgIHsKICAgICAgaWYg KHN0cmxlbiAoY3B1LT5uYW1lKSA9PSBsZW4gJiYgc3RybmNtcCAoY3B1LT5uYW1lLCB0b19wYXJz ZSwgbGVuKSA9PSAwKQoJewoJICBhdXRvIGlzYV90ZW1wID0gY3B1LT5mbGFnczsKCgkgIGlmIChl eHQgIT0gTlVMTCkKCSAgICB7CgkgICAgICAvKiBUT19QQVJTRSBzdHJpbmcgY29udGFpbnMgYXQg bGVhc3Qgb25lIGV4dGVuc2lvbi4gICovCgkgICAgICBlbnVtIGFhcmNoX3BhcnNlX29wdF9yZXN1 bHQgZXh0X3JlcwoJCT0gYWFyY2g2NF9wYXJzZV9leHRlbnNpb24gKGV4dCwgJmlzYV90ZW1wLCBp bnZhbGlkX2V4dGVuc2lvbik7CgoJICAgICAgaWYgKGV4dF9yZXMgIT0gQUFSQ0hfUEFSU0VfT0sp CgkJcmV0dXJuIGV4dF9yZXM7CgkgICAgfQoJICAvKiBFeHRlbnNpb24gcGFyc2luZyB3YXMgc3Vj Y2Vzc2Z1bGwuICBDb25maXJtIHRoZSByZXN1bHQKCSAgICAgY3B1IGFuZCBJU0EgZmxhZ3MuICAq LwoJICAqcmVzID0gY3B1OwoJICAqaXNhX2ZsYWdzID0gaXNhX3RlbXA7CgkgIHJldHVybiBBQVJD SF9QQVJTRV9PSzsKCX0KICAgIH0KCiAgLyogQ1BVIG5hbWUgbm90IGZvdW5kIGluIGxpc3QuICAq LwogIHJldHVybiBBQVJDSF9QQVJTRV9JTlZBTElEX0FSRzsKfQoKLyogUGFyc2UgdGhlIFRPX1BB UlNFIHN0cmluZyBhbmQgcHV0IHRoZSBjcHUgaXQgc2VsZWN0cyBpbnRvIFJFUy4KICAgUmV0dXJu IGFuIGFhcmNoX3BhcnNlX29wdF9yZXN1bHQgZGVzY3JpYmluZyB0aGUgcGFyc2UgcmVzdWx0Lgog ICBJZiB0aGUgcGFyc2luZyBmYWlscyB0aGUgUkVTIGRvZXMgbm90IGNoYW5nZS4gICovCgpzdGF0 aWMgZW51bSBhYXJjaF9wYXJzZV9vcHRfcmVzdWx0CmFhcmNoNjRfcGFyc2VfdHVuZSAoY29uc3Qg Y2hhciAqdG9fcGFyc2UsIGNvbnN0IHN0cnVjdCBwcm9jZXNzb3IgKipyZXMpCnsKICBjb25zdCBz dHJ1Y3QgcHJvY2Vzc29yICpjcHU7CgogIC8qIExvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBzdXBw b3J0ZWQgQ1BVcyB0byBmaW5kIGEgbWF0Y2guICAqLwogIGZvciAoY3B1ID0gYWxsX2NvcmVzOyBj cHUtPm5hbWUgIT0gTlVMTDsgY3B1KyspCiAgICB7CiAgICAgIGlmIChzdHJjbXAgKGNwdS0+bmFt ZSwgdG9fcGFyc2UpID09IDApCgl7CgkgICpyZXMgPSBjcHU7CgkgIHJldHVybiBBQVJDSF9QQVJT RV9PSzsKCX0KICAgIH0KCiAgLyogQ1BVIG5hbWUgbm90IGZvdW5kIGluIGxpc3QuICAqLwogIHJl dHVybiBBQVJDSF9QQVJTRV9JTlZBTElEX0FSRzsKfQoKLyogUGFyc2UgVE9LRU4sIHdoaWNoIGhh cyBsZW5ndGggTEVOR1RIIHRvIHNlZSBpZiBpdCBpcyBhbiBvcHRpb24KICAgZGVzY3JpYmVkIGlu IEZMQUcuICBJZiBpdCBpcywgcmV0dXJuIHRoZSBpbmRleCBiaXQgZm9yIHRoYXQgZnVzaW9uIHR5 cGUuCiAgIElmIG5vdCwgZXJyb3IgKHByaW50aW5nIE9QVElPTl9OQU1FKSBhbmQgcmV0dXJuIHpl cm8uICAqLwoKc3RhdGljIHVuc2lnbmVkIGludAphYXJjaDY0X3BhcnNlX29uZV9vcHRpb25fdG9r ZW4gKGNvbnN0IGNoYXIgKnRva2VuLAoJCQkJc2l6ZV90IGxlbmd0aCwKCQkJCWNvbnN0IHN0cnVj dCBhYXJjaDY0X2ZsYWdfZGVzYyAqZmxhZywKCQkJCWNvbnN0IGNoYXIgKm9wdGlvbl9uYW1lKQp7 CiAgZm9yICg7IGZsYWctPm5hbWUgIT0gTlVMTDsgZmxhZysrKQogICAgewogICAgICBpZiAobGVu Z3RoID09IHN0cmxlbiAoZmxhZy0+bmFtZSkKCSAgJiYgIXN0cm5jbXAgKGZsYWctPm5hbWUsIHRv a2VuLCBsZW5ndGgpKQoJcmV0dXJuIGZsYWctPmZsYWc7CiAgICB9CgogIGVycm9yICgidW5rbm93 biBmbGFnIHBhc3NlZCBpbiAlPC1tb3ZlcnJpZGU9JXMlPiAoJXMpIiwgb3B0aW9uX25hbWUsIHRv a2VuKTsKICByZXR1cm4gMDsKfQoKLyogUGFyc2UgT1BUSU9OIHdoaWNoIGlzIGEgY29tbWEtc2Vw YXJhdGVkIGxpc3Qgb2YgZmxhZ3MgdG8gZW5hYmxlLgogICBGTEFHUyBnaXZlcyB0aGUgbGlzdCBv ZiBmbGFncyB3ZSB1bmRlcnN0YW5kLCBJTklUSUFMX1NUQVRFIGdpdmVzIGFueQogICBkZWZhdWx0 IHN0YXRlIHdlIGluaGVyaXQgZnJvbSB0aGUgQ1BVIHR1bmluZyBzdHJ1Y3R1cmVzLiAgT1BUSU9O X05BTUUKICAgZ2l2ZXMgdGhlIHRvcC1sZXZlbCBvcHRpb24gd2UgYXJlIHBhcnNpbmcgaW4gdGhl IC1tb3ZlcnJpZGUgc3RyaW5nLAogICBmb3IgdXNlIGluIGVycm9yIG1lc3NhZ2VzLiAgKi8KCnN0 YXRpYyB1bnNpZ25lZCBpbnQKYWFyY2g2NF9wYXJzZV9ib29sZWFuX29wdGlvbnMgKGNvbnN0IGNo YXIgKm9wdGlvbiwKCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhYXJjaDY0X2ZsYWdfZGVzYyAqZmxh Z3MsCgkJCSAgICAgICB1bnNpZ25lZCBpbnQgaW5pdGlhbF9zdGF0ZSwKCQkJICAgICAgIGNvbnN0 IGNoYXIgKm9wdGlvbl9uYW1lKQp7CiAgY29uc3QgY2hhciBzZXBhcmF0b3IgPSAnLic7CiAgY29u c3QgY2hhciogc3BlY3MgPSBvcHRpb247CiAgY29uc3QgY2hhciogbnRva2VuID0gb3B0aW9uOwog IHVuc2lnbmVkIGludCBmb3VuZF9mbGFncyA9IGluaXRpYWxfc3RhdGU7CgogIHdoaWxlICgobnRv a2VuID0gc3RyY2hyIChzcGVjcywgc2VwYXJhdG9yKSkpCiAgICB7CiAgICAgIHNpemVfdCB0b2tl bl9sZW5ndGggPSBudG9rZW4gLSBzcGVjczsKICAgICAgdW5zaWduZWQgdG9rZW5fb3BzID0gYWFy Y2g2NF9wYXJzZV9vbmVfb3B0aW9uX3Rva2VuIChzcGVjcywKCQkJCQkJCSAgIHRva2VuX2xlbmd0 aCwKCQkJCQkJCSAgIGZsYWdzLAoJCQkJCQkJICAgb3B0aW9uX25hbWUpOwogICAgICAvKiBJZiB3 ZSBmaW5kICJub25lIiAob3IsIGZvciBzaW1wbGljaXR5J3Mgc2FrZSwgYW4gZXJyb3IpIGFueXdo ZXJlCgkgaW4gdGhlIHRva2VuIHN0cmVhbSwgcmVzZXQgdGhlIHN1cHBvcnRlZCBvcGVyYXRpb25z LiAgU286CgoJICAgYWRycCthZGQuY21wK2JyYW5jaC5ub25lLmFkcnArYWRkCgoJICAgd291bGQg aGF2ZSB0aGUgcmVzdWx0IG9mIHR1cm5pbmcgb24gb25seSBhZHJwK2FkZCBmdXNpb24uICAqLwog ICAgICBpZiAoIXRva2VuX29wcykKCWZvdW5kX2ZsYWdzID0gMDsKCiAgICAgIGZvdW5kX2ZsYWdz IHw9IHRva2VuX29wczsKICAgICAgc3BlY3MgPSArK250b2tlbjsKICAgIH0KCiAgLyogV2UgZW5k ZWQgd2l0aCBhIGNvbW1hLCBwcmludCBzb21ldGhpbmcuICAqLwogIGlmICghKCpzcGVjcykpCiAg ICB7CiAgICAgIGVycm9yICgiJXFzIHN0cmluZyBpbGwtZm9ybWVkIiwgb3B0aW9uX25hbWUpOwog ICAgICByZXR1cm4gMDsKICAgIH0KCiAgLyogV2Ugc3RpbGwgaGF2ZSBvbmUgbW9yZSB0b2tlbiB0 byBwYXJzZS4gICovCiAgc2l6ZV90IHRva2VuX2xlbmd0aCA9IHN0cmxlbiAoc3BlY3MpOwogIHVu c2lnbmVkIHRva2VuX29wcyA9IGFhcmNoNjRfcGFyc2Vfb25lX29wdGlvbl90b2tlbiAoc3BlY3Ms CgkJCQkJCSAgICAgICB0b2tlbl9sZW5ndGgsCgkJCQkJCSAgICAgICBmbGFncywKCQkJCQkJICAg ICAgIG9wdGlvbl9uYW1lKTsKICAgaWYgKCF0b2tlbl9vcHMpCiAgICAgZm91bmRfZmxhZ3MgPSAw OwoKICBmb3VuZF9mbGFncyB8PSB0b2tlbl9vcHM7CiAgcmV0dXJuIGZvdW5kX2ZsYWdzOwp9Cgov KiBTdXBwb3J0IGZvciBvdmVycmlkaW5nIGluc3RydWN0aW9uIGZ1c2lvbi4gICovCgpzdGF0aWMg dm9pZAphYXJjaDY0X3BhcnNlX2Z1c2Vfc3RyaW5nIChjb25zdCBjaGFyICpmdXNlX3N0cmluZywK CQkJICAgIHN0cnVjdCB0dW5lX3BhcmFtcyAqdHVuZSkKewogIHR1bmUtPmZ1c2libGVfb3BzID0g YWFyY2g2NF9wYXJzZV9ib29sZWFuX29wdGlvbnMgKGZ1c2Vfc3RyaW5nLAoJCQkJCQkgICAgIGFh cmNoNjRfZnVzaWJsZV9wYWlycywKCQkJCQkJICAgICB0dW5lLT5mdXNpYmxlX29wcywKCQkJCQkJ ICAgICAiZnVzZT0iKTsKfQoKLyogU3VwcG9ydCBmb3Igb3ZlcnJpZGluZyBvdGhlciB0dW5pbmcg ZmxhZ3MuICAqLwoKc3RhdGljIHZvaWQKYWFyY2g2NF9wYXJzZV90dW5lX3N0cmluZyAoY29uc3Qg Y2hhciAqdHVuZV9zdHJpbmcsCgkJCSAgICBzdHJ1Y3QgdHVuZV9wYXJhbXMgKnR1bmUpCnsKICB0 dW5lLT5leHRyYV90dW5pbmdfZmxhZ3MKICAgID0gYWFyY2g2NF9wYXJzZV9ib29sZWFuX29wdGlv bnMgKHR1bmVfc3RyaW5nLAoJCQkJICAgICBhYXJjaDY0X3R1bmluZ19mbGFncywKCQkJCSAgICAg dHVuZS0+ZXh0cmFfdHVuaW5nX2ZsYWdzLAoJCQkJICAgICAidHVuZT0iKTsKfQoKLyogUGFyc2Ug dGhlIHN2ZV93aWR0aCB0dW5pbmcgbW92ZXJyaWRlIHN0cmluZyBpbiBUVU5FX1NUUklORy4KICAg QWNjZXB0IHRoZSB2YWxpZCBTVkUgdmVjdG9yIHdpZHRocyBhbGxvd2VkIGJ5CiAgIGFhcmNoNjRf c3ZlX3ZlY3Rvcl9iaXRzX2VudW0gYW5kIHVzZSBpdCB0byBvdmVycmlkZSBzdmVfd2lkdGgKICAg aW4gVFVORS4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X3BhcnNlX3N2ZV93aWR0aF9zdHJpbmcg KGNvbnN0IGNoYXIgKnR1bmVfc3RyaW5nLAoJCQkJc3RydWN0IHR1bmVfcGFyYW1zICp0dW5lKQp7 CiAgaW50IHdpZHRoID0gLTE7CgogIGludCBuID0gc3NjYW5mICh0dW5lX3N0cmluZywgIiVkIiwg JndpZHRoKTsKICBpZiAobiA9PSBFT0YpCiAgICB7CiAgICAgIGVycm9yICgiaW52YWxpZCBmb3Jt YXQgZm9yICU8c3ZlX3dpZHRoJT4iKTsKICAgICAgcmV0dXJuOwogICAgfQogIHN3aXRjaCAod2lk dGgpCiAgICB7CiAgICBjYXNlIFNWRV8xMjg6CiAgICBjYXNlIFNWRV8yNTY6CiAgICBjYXNlIFNW RV81MTI6CiAgICBjYXNlIFNWRV8xMDI0OgogICAgY2FzZSBTVkVfMjA0ODoKICAgICAgYnJlYWs7 CiAgICBkZWZhdWx0OgogICAgICBlcnJvciAoImludmFsaWQgJTxzdmVfd2lkdGglPiB2YWx1ZTog JWQiLCB3aWR0aCk7CiAgICB9CiAgdHVuZS0+c3ZlX3dpZHRoID0gKGVudW0gYWFyY2g2NF9zdmVf dmVjdG9yX2JpdHNfZW51bSkgd2lkdGg7Cn0KCi8qIFBhcnNlIFRPS0VOLCB3aGljaCBoYXMgbGVu Z3RoIExFTkdUSCB0byBzZWUgaWYgaXQgaXMgYSB0dW5pbmcgb3B0aW9uCiAgIHdlIHVuZGVyc3Rh bmQuICBJZiBpdCBpcywgZXh0cmFjdCB0aGUgb3B0aW9uIHN0cmluZyBhbmQgaGFuZG9mZiB0bwog ICB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb24uICAqLwoKdm9pZAphYXJjaDY0X3BhcnNlX29uZV9v dmVycmlkZV90b2tlbiAoY29uc3QgY2hhciogdG9rZW4sCgkJCQkgIHNpemVfdCBsZW5ndGgsCgkJ CQkgIHN0cnVjdCB0dW5lX3BhcmFtcyAqdHVuZSkKewogIGNvbnN0IHN0cnVjdCBhYXJjaDY0X3R1 bmluZ19vdmVycmlkZV9mdW5jdGlvbiAqZm4KICAgID0gYWFyY2g2NF90dW5pbmdfb3ZlcnJpZGVf ZnVuY3Rpb25zOwoKICBjb25zdCBjaGFyICpvcHRpb25fcGFydCA9IHN0cmNociAodG9rZW4sICc9 Jyk7CiAgaWYgKCFvcHRpb25fcGFydCkKICAgIHsKICAgICAgZXJyb3IgKCJ0dW5pbmcgc3RyaW5n IG1pc3NpbmcgaW4gb3B0aW9uICglcykiLCB0b2tlbik7CiAgICAgIHJldHVybjsKICAgIH0KCiAg LyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIG9wdGlvbiBuYW1lLiAgKi8KICBsZW5ndGggPSBvcHRp b25fcGFydCAtIHRva2VuOwogIC8qIFNraXAgdGhlICc9JyB0byBnZXQgdG8gdGhlIG9wdGlvbiBz dHJpbmcuICAqLwogIG9wdGlvbl9wYXJ0Kys7CgogIGZvciAoOyBmbi0+bmFtZSAhPSBOVUxMOyBm bisrKQogICAgewogICAgICBpZiAoIXN0cm5jbXAgKGZuLT5uYW1lLCB0b2tlbiwgbGVuZ3RoKSkK CXsKCSAgZm4tPnBhcnNlX292ZXJyaWRlIChvcHRpb25fcGFydCwgdHVuZSk7CgkgIHJldHVybjsK CX0KICAgIH0KCiAgZXJyb3IgKCJ1bmtub3duIHR1bmluZyBvcHRpb24gKCVzKSIsdG9rZW4pOwog IHJldHVybjsKfQoKLyogQSBjaGVja2luZyBtZWNoYW5pc20gZm9yIHRoZSBpbXBsZW1lbnRhdGlv biBvZiB0aGUgdGxzIHNpemUuICAqLwoKc3RhdGljIHZvaWQKaW5pdGlhbGl6ZV9hYXJjaDY0X3Rs c19zaXplIChzdHJ1Y3QgZ2NjX29wdGlvbnMgKm9wdHMpCnsKICBpZiAoYWFyY2g2NF90bHNfc2l6 ZSA9PSAwKQogICAgYWFyY2g2NF90bHNfc2l6ZSA9IDI0OwoKICBzd2l0Y2ggKG9wdHMtPnhfYWFy Y2g2NF9jbW9kZWxfdmFyKQogICAgewogICAgY2FzZSBBQVJDSDY0X0NNT0RFTF9USU5ZOgogICAg ICAvKiBCb3RoIHRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIFRMUyBzaXplIGFsbG93ZWQgdW5kZXIg dGlueSBpcyAxTSB3aGljaAoJIG5lZWRzIHR3byBpbnN0cnVjdGlvbnMgdG8gYWRkcmVzcywgc28g d2UgY2xhbXAgdGhlIHNpemUgdG8gMjQuICAqLwogICAgICBpZiAoYWFyY2g2NF90bHNfc2l6ZSA+ IDI0KQoJYWFyY2g2NF90bHNfc2l6ZSA9IDI0OwogICAgICBicmVhazsKICAgIGNhc2UgQUFSQ0g2 NF9DTU9ERUxfU01BTEw6CiAgICAgIC8qIFRoZSBtYXhpbXVtIFRMUyBzaXplIGFsbG93ZWQgdW5k ZXIgc21hbGwgaXMgNEcuICAqLwogICAgICBpZiAoYWFyY2g2NF90bHNfc2l6ZSA+IDMyKQoJYWFy Y2g2NF90bHNfc2l6ZSA9IDMyOwogICAgICBicmVhazsKICAgIGNhc2UgQUFSQ0g2NF9DTU9ERUxf TEFSR0U6CiAgICAgIC8qIFRoZSBtYXhpbXVtIFRMUyBzaXplIGFsbG93ZWQgdW5kZXIgbGFyZ2Ug aXMgMTZFLgoJIEZJWE1FOiAxNkUgc2hvdWxkIGJlIDY0Yml0LCB3ZSBvbmx5IHN1cHBvcnQgNDhi aXQgb2Zmc2V0IG5vdy4gICovCiAgICAgIGlmIChhYXJjaDY0X3Rsc19zaXplID4gNDgpCglhYXJj aDY0X3Rsc19zaXplID0gNDg7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZ2NjX3Vu cmVhY2hhYmxlICgpOwogICAgfQoKICByZXR1cm47Cn0KCi8qIFJldHVybiB0aGUgQ1BVIGNvcnJl c3BvbmRpbmcgdG8gdGhlIGVudW0gQ1BVLiAgKi8KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvY2Vz c29yICoKYWFyY2g2NF9nZXRfdHVuZV9jcHUgKGVudW0gYWFyY2g2NF9wcm9jZXNzb3IgY3B1KQp7 CiAgZ2NjX2Fzc2VydCAoY3B1ICE9IGFhcmNoNjRfbm9uZSk7CgogIHJldHVybiAmYWxsX2NvcmVz W2NwdV07Cn0KCi8qIFJldHVybiB0aGUgYXJjaGl0ZWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhl IGVudW0gQVJDSC4gICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nlc3NvciAqCmFhcmNoNjRf Z2V0X2FyY2ggKGVudW0gYWFyY2g2NF9hcmNoIGFyY2gpCnsKICBnY2NfYXNzZXJ0IChhcmNoICE9 IGFhcmNoNjRfbm9fYXJjaCk7CgogIHJldHVybiAmYWxsX2FyY2hpdGVjdHVyZXNbYXJjaF07Cn0K Ci8qIFBhcnNlIFNUUklORyBsb29raW5nIGZvciBvcHRpb25zIGluIHRoZSBmb3JtYXQ6CiAgICAg c3RyaW5nCTo6IG9wdGlvbjpzdHJpbmcKICAgICBvcHRpb24JOjogbmFtZT1zdWJzdHJpbmcKICAg ICBuYW1lCTo6IHthLXp9CiAgICAgc3Vic3RyaW5nCTo6IGRlZmluZWQgYnkgb3B0aW9uLiAgKi8K CnN0YXRpYyB2b2lkCmFhcmNoNjRfcGFyc2Vfb3ZlcnJpZGVfc3RyaW5nIChjb25zdCBjaGFyKiBp bnB1dF9zdHJpbmcsCgkJCSAgICAgICBzdHJ1Y3QgdHVuZV9wYXJhbXMqIHR1bmUpCnsKICBjb25z dCBjaGFyIHNlcGFyYXRvciA9ICc6JzsKICBzaXplX3Qgc3RyaW5nX2xlbmd0aCA9IHN0cmxlbiAo aW5wdXRfc3RyaW5nKSArIDE7CiAgY2hhciAqc3RyaW5nX3Jvb3QgPSAoY2hhciAqKSB4bWFsbG9j IChzaXplb2YgKCpzdHJpbmdfcm9vdCkgKiBzdHJpbmdfbGVuZ3RoKTsKICBjaGFyICpzdHJpbmcg PSBzdHJpbmdfcm9vdDsKICBzdHJuY3B5IChzdHJpbmcsIGlucHV0X3N0cmluZywgc3RyaW5nX2xl bmd0aCk7CiAgc3RyaW5nW3N0cmluZ19sZW5ndGggLSAxXSA9ICdcMCc7CgogIGNoYXIqIG50b2tl biA9IHN0cmluZzsKCiAgd2hpbGUgKChudG9rZW4gPSBzdHJjaHIgKHN0cmluZywgc2VwYXJhdG9y KSkpCiAgICB7CiAgICAgIHNpemVfdCB0b2tlbl9sZW5ndGggPSBudG9rZW4gLSBzdHJpbmc7CiAg ICAgIC8qIE1ha2UgdGhpcyBzdWJzdHJpbmcgbG9vayBsaWtlIGEgc3RyaW5nLiAgKi8KICAgICAg Km50b2tlbiA9ICdcMCc7CiAgICAgIGFhcmNoNjRfcGFyc2Vfb25lX292ZXJyaWRlX3Rva2VuIChz dHJpbmcsIHRva2VuX2xlbmd0aCwgdHVuZSk7CiAgICAgIHN0cmluZyA9ICsrbnRva2VuOwogICAg fQoKICAvKiBPbmUgbGFzdCBvcHRpb24gdG8gcGFyc2UuICAqLwogIGFhcmNoNjRfcGFyc2Vfb25l X292ZXJyaWRlX3Rva2VuIChzdHJpbmcsIHN0cmxlbiAoc3RyaW5nKSwgdHVuZSk7CiAgZnJlZSAo c3RyaW5nX3Jvb3QpOwp9CgovKiBBZGp1c3QgQ1VSUkVOVF9UVU5FIChhIGdlbmVyaWMgdHVuaW5n IHN0cnVjdCkgd2l0aCBzZXR0aW5ncyB0aGF0CiAgIGFyZSBiZXN0IGZvciBhIGdlbmVyaWMgdGFy Z2V0IHdpdGggdGhlIGN1cnJlbnRseS1lbmFibGVkIGFyY2hpdGVjdHVyZQogICBleHRlbnNpb25z LiAgKi8Kc3RhdGljIHZvaWQKYWFyY2g2NF9hZGp1c3RfZ2VuZXJpY19hcmNoX3R1bmluZyAoc3Ry dWN0IHR1bmVfcGFyYW1zICZjdXJyZW50X3R1bmUpCnsKICAvKiBOZW92ZXJzZSBWMSBpcyB0aGUg b25seSBjb3JlIHRoYXQgaXMga25vd24gdG8gYmVuZWZpdCBmcm9tCiAgICAgQUFSQ0g2NF9FWFRS QV9UVU5FX0NTRV9TVkVfVkxfQ09OU1RBTlRTLiAgVGhlcmUgaXMgdGhlcmVmb3JlIG5vCiAgICAg cG9pbnQgZW5hYmxpbmcgaXQgZm9yIFNWRTIgYW5kIGFib3ZlLiAgKi8KICBpZiAoVEFSR0VUX1NW RTIpCiAgICBjdXJyZW50X3R1bmUuZXh0cmFfdHVuaW5nX2ZsYWdzCiAgICAgICY9IH5BQVJDSDY0 X0VYVFJBX1RVTkVfQ1NFX1NWRV9WTF9DT05TVEFOVFM7Cn0KCnN0YXRpYyB2b2lkCmFhcmNoNjRf b3ZlcnJpZGVfb3B0aW9uc19hZnRlcl9jaGFuZ2VfMSAoc3RydWN0IGdjY19vcHRpb25zICpvcHRz KQp7CiAgaWYgKGFjY2VwdGVkX2JyYW5jaF9wcm90ZWN0aW9uX3N0cmluZykKICAgIHsKICAgICAg b3B0cy0+eF9hYXJjaDY0X2JyYW5jaF9wcm90ZWN0aW9uX3N0cmluZwoJPSB4c3RyZHVwIChhY2Nl cHRlZF9icmFuY2hfcHJvdGVjdGlvbl9zdHJpbmcpOwogICAgfQoKICAvKiBQUiA3MDA0NDogV2Ug aGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0IGJlaW5nIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3Ig dGhlCiAgICAgc2FtZSBmdW5jdGlvbi4gIFRoaXMgbWVhbnMgYWxsIGNoYW5nZXMgc2hvdWxkIGJl IHJlcGVhdGFibGUuICAqLwoKICAvKiBTZXQgYWFyY2g2NF91c2VfZnJhbWVfcG9pbnRlciBiYXNl ZCBvbiAtZm5vLW9taXQtZnJhbWUtcG9pbnRlci4KICAgICBEaXNhYmxlIHRoZSBmcmFtZSBwb2lu dGVyIGZsYWcgc28gdGhlIG1pZC1lbmQgd2lsbCBub3QgdXNlIGEgZnJhbWUKICAgICBwb2ludGVy IGluIGxlYWYgZnVuY3Rpb25zIGluIG9yZGVyIHRvIHN1cHBvcnQgLWZvbWl0LWxlYWYtZnJhbWUt cG9pbnRlci4KICAgICBTZXQgeF9mbGFnX29taXRfZnJhbWVfcG9pbnRlciB0byB0aGUgc3BlY2lh bCB2YWx1ZSAyIHRvIGRpZmZlcmVudGlhdGUKICAgICBiZXR3ZWVuIC1mb21pdC1mcmFtZS1wb2lu dGVyICgxKSBhbmQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgKDIpLiAgKi8KICBhYXJjaDY0X3Vz ZV9mcmFtZV9wb2ludGVyID0gb3B0cy0+eF9mbGFnX29taXRfZnJhbWVfcG9pbnRlciAhPSAxOwog IGlmIChvcHRzLT54X2ZsYWdfb21pdF9mcmFtZV9wb2ludGVyID09IDApCiAgICBvcHRzLT54X2Zs YWdfb21pdF9mcmFtZV9wb2ludGVyID0gMjsKCiAgLyogSWYgbm90IG9wdGltaXppbmcgZm9yIHNp emUsIHNldCB0aGUgZGVmYXVsdAogICAgIGFsaWdubWVudCB0byB3aGF0IHRoZSB0YXJnZXQgd2Fu dHMuICAqLwogIGlmICghb3B0cy0+eF9vcHRpbWl6ZV9zaXplKQogICAgewogICAgICBpZiAob3B0 cy0+eF9mbGFnX2FsaWduX2xvb3BzICYmICFvcHRzLT54X3N0cl9hbGlnbl9sb29wcykKCW9wdHMt Pnhfc3RyX2FsaWduX2xvb3BzID0gYWFyY2g2NF90dW5lX3BhcmFtcy5sb29wX2FsaWduOwogICAg ICBpZiAob3B0cy0+eF9mbGFnX2FsaWduX2p1bXBzICYmICFvcHRzLT54X3N0cl9hbGlnbl9qdW1w cykKCW9wdHMtPnhfc3RyX2FsaWduX2p1bXBzID0gYWFyY2g2NF90dW5lX3BhcmFtcy5qdW1wX2Fs aWduOwogICAgICBpZiAob3B0cy0+eF9mbGFnX2FsaWduX2Z1bmN0aW9ucyAmJiAhb3B0cy0+eF9z dHJfYWxpZ25fZnVuY3Rpb25zKQoJb3B0cy0+eF9zdHJfYWxpZ25fZnVuY3Rpb25zID0gYWFyY2g2 NF90dW5lX3BhcmFtcy5mdW5jdGlvbl9hbGlnbjsKICAgIH0KCiAgLyogV2UgZGVmYXVsdCB0byBu byBwYy1yZWxhdGl2ZSBsaXRlcmFsIGxvYWRzLiAgKi8KCiAgYWFyY2g2NF9wY3JlbGF0aXZlX2xp dGVyYWxfbG9hZHMgPSBmYWxzZTsKCiAgLyogSWYgLW1wYy1yZWxhdGl2ZS1saXRlcmFsLWxvYWRz IGlzIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGlzCiAgICAgaW1wbGllcyB0aGF0IHRoZSB1 c2VyIGFza2VkIGZvciBQQyByZWxhdGl2ZSBsaXRlcmFsIGxvYWRzLiAgKi8KICBpZiAob3B0cy0+ eF9wY3JlbGF0aXZlX2xpdGVyYWxfbG9hZHMgPT0gMSkKICAgIGFhcmNoNjRfcGNyZWxhdGl2ZV9s aXRlcmFsX2xvYWRzID0gdHJ1ZTsKCiAgLyogSW4gdGhlIHRpbnkgbWVtb3J5IG1vZGVsIGl0IG1h a2VzIG5vIHNlbnNlIHRvIGRpc2FsbG93IFBDIHJlbGF0aXZlCiAgICAgbGl0ZXJhbCBwb29sIGxv YWRzLiAgKi8KICBpZiAoYWFyY2g2NF9jbW9kZWwgPT0gQUFSQ0g2NF9DTU9ERUxfVElOWQogICAg ICB8fCBhYXJjaDY0X2Ntb2RlbCA9PSBBQVJDSDY0X0NNT0RFTF9USU5ZX1BJQykKICAgIGFhcmNo NjRfcGNyZWxhdGl2ZV9saXRlcmFsX2xvYWRzID0gdHJ1ZTsKCiAgLyogV2hlbiBlbmFibGluZyB0 aGUgbG93ZXIgcHJlY2lzaW9uIE5ld3RvbiBzZXJpZXMgZm9yIHRoZSBzcXVhcmUgcm9vdCwgYWxz bwogICAgIGVuYWJsZSBpdCBmb3IgdGhlIHJlY2lwcm9jYWwgc3F1YXJlIHJvb3QsIHNpbmNlIHRo ZSBsYXR0ZXIgaXMgYW4KICAgICBpbnRlcm1lZGlhcnkgc3RlcCBmb3IgdGhlIGZvcm1lci4gICov CiAgaWYgKGZsYWdfbWxvd19wcmVjaXNpb25fc3FydCkKICAgIGZsYWdfbXJlY2lwX2xvd19wcmVj aXNpb25fc3FydCA9IHRydWU7Cn0KCi8qICdVbnBhY2snIHVwIHRoZSBpbnRlcm5hbCB0dW5pbmcg c3RydWN0cyBhbmQgdXBkYXRlIHRoZSBvcHRpb25zCiAgICBpbiBPUFRTLiAgVGhlIGNhbGxlciBt dXN0IGhhdmUgc2V0IHVwIHNlbGVjdGVkX3R1bmUgYW5kIHNlbGVjdGVkX2FyY2gKICAgIGFzIGFs bCB0aGUgb3RoZXIgdGFyZ2V0LXNwZWNpZmljIGNvZGVnZW4gZGVjaXNpb25zIGFyZQogICAgZGVy aXZlZCBmcm9tIHRoZW0uICAqLwoKdm9pZAphYXJjaDY0X292ZXJyaWRlX29wdGlvbnNfaW50ZXJu YWwgKHN0cnVjdCBnY2Nfb3B0aW9ucyAqb3B0cykKewogIGNvbnN0IHN0cnVjdCBwcm9jZXNzb3Ig KnR1bmUgPSBhYXJjaDY0X2dldF90dW5lX2NwdSAob3B0cy0+eF9zZWxlY3RlZF90dW5lKTsKICBh YXJjaDY0X3R1bmVfZmxhZ3MgPSB0dW5lLT5mbGFnczsKICBhYXJjaDY0X3R1bmUgPSB0dW5lLT5z Y2hlZF9jb3JlOwogIC8qIE1ha2UgYSBjb3B5IG9mIHRoZSB0dW5pbmcgcGFyYW1ldGVycyBhdHRh Y2hlZCB0byB0aGUgY29yZSwgd2hpY2gKICAgICB3ZSBtYXkgbGF0ZXIgb3ZlcndyaXRlLiAgKi8K ICBhYXJjaDY0X3R1bmVfcGFyYW1zID0gKih0dW5lLT50dW5lKTsKICBpZiAodHVuZS0+dHVuZSA9 PSAmZ2VuZXJpY190dW5pbmdzKQogICAgYWFyY2g2NF9hZGp1c3RfZ2VuZXJpY19hcmNoX3R1bmlu ZyAoYWFyY2g2NF90dW5lX3BhcmFtcyk7CgogIGlmIChvcHRzLT54X2FhcmNoNjRfb3ZlcnJpZGVf dHVuZV9zdHJpbmcpCiAgICBhYXJjaDY0X3BhcnNlX292ZXJyaWRlX3N0cmluZyAob3B0cy0+eF9h YXJjaDY0X292ZXJyaWRlX3R1bmVfc3RyaW5nLAoJCQkJICAgJmFhcmNoNjRfdHVuZV9wYXJhbXMp OwoKICAvKiBUaGlzIHRhcmdldCBkZWZhdWx0cyB0byBzdHJpY3Qgdm9sYXRpbGUgYml0ZmllbGRz LiAgKi8KICBpZiAob3B0cy0+eF9mbGFnX3N0cmljdF92b2xhdGlsZV9iaXRmaWVsZHMgPCAwICYm IGFiaV92ZXJzaW9uX2F0X2xlYXN0ICgyKSkKICAgIG9wdHMtPnhfZmxhZ19zdHJpY3Rfdm9sYXRp bGVfYml0ZmllbGRzID0gMTsKCiAgaWYgKGFhcmNoNjRfc3RhY2tfcHJvdGVjdG9yX2d1YXJkID09 IFNTUF9HTE9CQUwKICAgICAgJiYgb3B0cy0+eF9hYXJjaDY0X3N0YWNrX3Byb3RlY3Rvcl9ndWFy ZF9vZmZzZXRfc3RyKQogICAgewogICAgICBlcnJvciAoImluY29tcGF0aWJsZSBvcHRpb25zICU8 LW1zdGFjay1wcm90ZWN0b3ItZ3VhcmQ9Z2xvYmFsJT4gYW5kICIKCSAgICAgIiU8LW1zdGFjay1w cm90ZWN0b3ItZ3VhcmQtb2Zmc2V0PSVzJT4iLAoJICAgICBhYXJjaDY0X3N0YWNrX3Byb3RlY3Rv cl9ndWFyZF9vZmZzZXRfc3RyKTsKICAgIH0KCiAgaWYgKGFhcmNoNjRfc3RhY2tfcHJvdGVjdG9y X2d1YXJkID09IFNTUF9TWVNSRUcKICAgICAgJiYgIShvcHRzLT54X2FhcmNoNjRfc3RhY2tfcHJv dGVjdG9yX2d1YXJkX29mZnNldF9zdHIKCSAgICYmIG9wdHMtPnhfYWFyY2g2NF9zdGFja19wcm90 ZWN0b3JfZ3VhcmRfcmVnX3N0cikpCiAgICB7CiAgICAgIGVycm9yICgiYm90aCAlPC1tc3RhY2st cHJvdGVjdG9yLWd1YXJkLW9mZnNldCU+IGFuZCAiCgkgICAgICIlPC1tc3RhY2stcHJvdGVjdG9y LWd1YXJkLXJlZyU+IG11c3QgYmUgdXNlZCAiCgkgICAgICJ3aXRoICU8LW1zdGFjay1wcm90ZWN0 b3ItZ3VhcmQ9c3lzcmVnJT4iKTsKICAgIH0KCiAgaWYgKG9wdHMtPnhfYWFyY2g2NF9zdGFja19w cm90ZWN0b3JfZ3VhcmRfcmVnX3N0cikKICAgIHsKICAgICAgaWYgKHN0cmxlbiAob3B0cy0+eF9h YXJjaDY0X3N0YWNrX3Byb3RlY3Rvcl9ndWFyZF9yZWdfc3RyKSA+IDEwMCkKCSAgZXJyb3IgKCJz cGVjaWZ5IGEgc3lzdGVtIHJlZ2lzdGVyIHdpdGggYSBzbWFsbCBzdHJpbmcgbGVuZ3RoIik7CiAg ICB9CgogIGlmIChvcHRzLT54X2FhcmNoNjRfc3RhY2tfcHJvdGVjdG9yX2d1YXJkX29mZnNldF9z dHIpCiAgICB7CiAgICAgIGNoYXIgKmVuZDsKICAgICAgY29uc3QgY2hhciAqc3RyID0gYWFyY2g2 NF9zdGFja19wcm90ZWN0b3JfZ3VhcmRfb2Zmc2V0X3N0cjsKICAgICAgZXJybm8gPSAwOwogICAg ICBsb25nIG9mZnMgPSBzdHJ0b2wgKGFhcmNoNjRfc3RhY2tfcHJvdGVjdG9yX2d1YXJkX29mZnNl dF9zdHIsICZlbmQsIDApOwogICAgICBpZiAoISpzdHIgfHwgKmVuZCB8fCBlcnJubykKCWVycm9y ICgiJXFzIGlzIG5vdCBhIHZhbGlkIG9mZnNldCBpbiAlcXMiLCBzdHIsCgkgICAgICAgIi1tc3Rh Y2stcHJvdGVjdG9yLWd1YXJkLW9mZnNldD0iKTsKICAgICAgYWFyY2g2NF9zdGFja19wcm90ZWN0 b3JfZ3VhcmRfb2Zmc2V0ID0gb2ZmczsKICAgIH0KCiAgaWYgKChmbGFnX3Nhbml0aXplICYgU0FO SVRJWkVfU0hBRE9XX0NBTExfU1RBQ0spCiAgICAgICYmICFmaXhlZF9yZWdzW1IxOF9SRUdOVU1d KQogICAgZXJyb3IgKCIlPC1mc2FuaXRpemU9c2hhZG93LWNhbGwtc3RhY2slPiByZXF1aXJlcyAl PC1mZml4ZWQteDE4JT4iKTsKCiAgaW5pdGlhbGl6ZV9hYXJjaDY0X2NvZGVfbW9kZWwgKG9wdHMp OwogIGluaXRpYWxpemVfYWFyY2g2NF90bHNfc2l6ZSAob3B0cyk7CiAgYWFyY2g2NF90cGlkcl9y ZWdpc3RlciA9IG9wdHMtPnhfYWFyY2g2NF90cGlkcl9yZWc7CgogIGludCBxdWV1ZV9kZXB0aCA9 IDA7CiAgc3dpdGNoIChhYXJjaDY0X3R1bmVfcGFyYW1zLmF1dG9wcmVmZXRjaGVyX21vZGVsKQog ICAgewogICAgICBjYXNlIHR1bmVfcGFyYW1zOjpBVVRPUFJFRkVUQ0hFUl9PRkY6CglxdWV1ZV9k ZXB0aCA9IC0xOwoJYnJlYWs7CiAgICAgIGNhc2UgdHVuZV9wYXJhbXM6OkFVVE9QUkVGRVRDSEVS X1dFQUs6CglxdWV1ZV9kZXB0aCA9IDA7CglicmVhazsKICAgICAgY2FzZSB0dW5lX3BhcmFtczo6 QVVUT1BSRUZFVENIRVJfU1RST05HOgoJcXVldWVfZGVwdGggPSBtYXhfaW5zbl9xdWV1ZV9pbmRl eCArIDE7CglicmVhazsKICAgICAgZGVmYXVsdDoKCWdjY191bnJlYWNoYWJsZSAoKTsKICAgIH0K CiAgLyogV2UgZG9uJ3QgbWluZCBwYXNzaW5nIGluIGdsb2JhbF9vcHRpb25zX3NldCBoZXJlIGFz IHdlIGRvbid0IHVzZQogICAgIHRoZSAqb3B0aW9uc19zZXQgc3RydWN0cyBhbnl3YXkuICAqLwog IFNFVF9PUFRJT05fSUZfVU5TRVQgKG9wdHMsICZnbG9iYWxfb3B0aW9uc19zZXQsCgkJICAgICAg IHBhcmFtX3NjaGVkX2F1dG9wcmVmX3F1ZXVlX2RlcHRoLCBxdWV1ZV9kZXB0aCk7CgogIC8qIElm IHVzaW5nIEFkdmFuY2VkIFNJTUQgb25seSBmb3IgYXV0b3ZlY3Rvcml6YXRpb24gZGlzYWJsZSBT VkUgdmVjdG9yIGNvc3RzCiAgICAgY29tcGFyaXNvbi4gICovCiAgaWYgKGFhcmNoNjRfYXV0b3Zl Y19wcmVmZXJlbmNlID09IDEpCiAgICBTRVRfT1BUSU9OX0lGX1VOU0VUIChvcHRzLCAmZ2xvYmFs X29wdGlvbnNfc2V0LAoJCQkgYWFyY2g2NF9zdmVfY29tcGFyZV9jb3N0cywgMCk7CgogIC8qIFNl dCB1cCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgaW4gcHJlZmV0Y2hpbmcgYWxnb3JpdGhtLiAgRG8g bm90CiAgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIHVubGVzcyB3ZSBhcmUgdHVuaW5nIGZvciBh IGNvcmUgd2UgaGF2ZQogICAgIHJlc2VhcmNoZWQgdmFsdWVzIGZvci4gICovCiAgaWYgKGFhcmNo NjRfdHVuZV9wYXJhbXMucHJlZmV0Y2gtPm51bV9zbG90cyA+IDApCiAgICBTRVRfT1BUSU9OX0lG X1VOU0VUIChvcHRzLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJCQkgcGFyYW1fc2ltdWx0YW5lb3Vz X3ByZWZldGNoZXMsCgkJCSBhYXJjaDY0X3R1bmVfcGFyYW1zLnByZWZldGNoLT5udW1fc2xvdHMp OwogIGlmIChhYXJjaDY0X3R1bmVfcGFyYW1zLnByZWZldGNoLT5sMV9jYWNoZV9zaXplID49IDAp CiAgICBTRVRfT1BUSU9OX0lGX1VOU0VUIChvcHRzLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJCQkg cGFyYW1fbDFfY2FjaGVfc2l6ZSwKCQkJIGFhcmNoNjRfdHVuZV9wYXJhbXMucHJlZmV0Y2gtPmwx X2NhY2hlX3NpemUpOwogIGlmIChhYXJjaDY0X3R1bmVfcGFyYW1zLnByZWZldGNoLT5sMV9jYWNo ZV9saW5lX3NpemUgPj0gMCkKICAgIFNFVF9PUFRJT05fSUZfVU5TRVQgKG9wdHMsICZnbG9iYWxf b3B0aW9uc19zZXQsCgkJCSBwYXJhbV9sMV9jYWNoZV9saW5lX3NpemUsCgkJCSBhYXJjaDY0X3R1 bmVfcGFyYW1zLnByZWZldGNoLT5sMV9jYWNoZV9saW5lX3NpemUpOwoKICBpZiAoYWFyY2g2NF90 dW5lX3BhcmFtcy5wcmVmZXRjaC0+bDFfY2FjaGVfbGluZV9zaXplID49IDApCiAgICB7CiAgICAg IFNFVF9PUFRJT05fSUZfVU5TRVQgKG9wdHMsICZnbG9iYWxfb3B0aW9uc19zZXQsCgkJCSAgIHBh cmFtX2Rlc3RydWN0X2ludGVyZmVyZV9zaXplLAoJCQkgICBhYXJjaDY0X3R1bmVfcGFyYW1zLnBy ZWZldGNoLT5sMV9jYWNoZV9saW5lX3NpemUpOwogICAgICBTRVRfT1BUSU9OX0lGX1VOU0VUIChv cHRzLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJCQkgICBwYXJhbV9jb25zdHJ1Y3RfaW50ZXJmZXJl X3NpemUsCgkJCSAgIGFhcmNoNjRfdHVuZV9wYXJhbXMucHJlZmV0Y2gtPmwxX2NhY2hlX2xpbmVf c2l6ZSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICAvKiBGb3IgYSBnZW5lcmljIEFBcmNoNjQg dGFyZ2V0LCBjb3ZlciB0aGUgY3VycmVudCByYW5nZSBvZiBjYWNoZSBsaW5lCgkgc2l6ZXMuICAq LwogICAgICBTRVRfT1BUSU9OX0lGX1VOU0VUIChvcHRzLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJ CQkgICBwYXJhbV9kZXN0cnVjdF9pbnRlcmZlcmVfc2l6ZSwKCQkJICAgMjU2KTsKICAgICAgU0VU X09QVElPTl9JRl9VTlNFVCAob3B0cywgJmdsb2JhbF9vcHRpb25zX3NldCwKCQkJICAgcGFyYW1f Y29uc3RydWN0X2ludGVyZmVyZV9zaXplLAoJCQkgICA2NCk7CiAgICB9CgogIGlmIChhYXJjaDY0 X3R1bmVfcGFyYW1zLnByZWZldGNoLT5sMl9jYWNoZV9zaXplID49IDApCiAgICBTRVRfT1BUSU9O X0lGX1VOU0VUIChvcHRzLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJCQkgcGFyYW1fbDJfY2FjaGVf c2l6ZSwKCQkJIGFhcmNoNjRfdHVuZV9wYXJhbXMucHJlZmV0Y2gtPmwyX2NhY2hlX3NpemUpOwog IGlmICghYWFyY2g2NF90dW5lX3BhcmFtcy5wcmVmZXRjaC0+cHJlZmV0Y2hfZHluYW1pY19zdHJp ZGVzKQogICAgU0VUX09QVElPTl9JRl9VTlNFVCAob3B0cywgJmdsb2JhbF9vcHRpb25zX3NldCwK CQkJIHBhcmFtX3ByZWZldGNoX2R5bmFtaWNfc3RyaWRlcywgMCk7CiAgaWYgKGFhcmNoNjRfdHVu ZV9wYXJhbXMucHJlZmV0Y2gtPm1pbmltdW1fc3RyaWRlID49IDApCiAgICBTRVRfT1BUSU9OX0lG X1VOU0VUIChvcHRzLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJCQkgcGFyYW1fcHJlZmV0Y2hfbWlu aW11bV9zdHJpZGUsCgkJCSBhYXJjaDY0X3R1bmVfcGFyYW1zLnByZWZldGNoLT5taW5pbXVtX3N0 cmlkZSk7CgogIC8qIFVzZSB0aGUgYWx0ZXJuYXRpdmUgc2NoZWR1bGluZy1wcmVzc3VyZSBhbGdv cml0aG0gYnkgZGVmYXVsdC4gICovCiAgU0VUX09QVElPTl9JRl9VTlNFVCAob3B0cywgJmdsb2Jh bF9vcHRpb25zX3NldCwKCQkgICAgICAgcGFyYW1fc2NoZWRfcHJlc3N1cmVfYWxnb3JpdGhtLAoJ CSAgICAgICBTQ0hFRF9QUkVTU1VSRV9NT0RFTCk7CgogIC8qIFZhbGlkYXRlIHRoZSBndWFyZCBz aXplLiAgKi8KICBpbnQgZ3VhcmRfc2l6ZSA9IHBhcmFtX3N0YWNrX2NsYXNoX3Byb3RlY3Rpb25f Z3VhcmRfc2l6ZTsKCiAgaWYgKGd1YXJkX3NpemUgIT0gMTIgJiYgZ3VhcmRfc2l6ZSAhPSAxNikK ICAgIGVycm9yICgib25seSB2YWx1ZXMgMTIgKDQgS0IpIGFuZCAxNiAoNjQgS0IpIGFyZSBzdXBw b3J0ZWQgZm9yIGd1YXJkICIKCSAgICJzaXplLiAgR2l2ZW4gdmFsdWUgJWQgKCVsbHUgS0IpIGlz IG91dCBvZiByYW5nZSIsCgkgICBndWFyZF9zaXplLCAoMVVMTCA8PCBndWFyZF9zaXplKSAvIDEw MjRVTEwpOwoKICAvKiBFbmZvcmNlIHRoYXQgaW50ZXJ2YWwgaXMgdGhlIHNhbWUgc2l6ZSBhcyBz aXplIHNvIHRoZSBtaWQtZW5kIGRvZXMgdGhlCiAgICAgcmlnaHQgdGhpbmcuICAqLwogIFNFVF9P UFRJT05fSUZfVU5TRVQgKG9wdHMsICZnbG9iYWxfb3B0aW9uc19zZXQsCgkJICAgICAgIHBhcmFt X3N0YWNrX2NsYXNoX3Byb3RlY3Rpb25fcHJvYmVfaW50ZXJ2YWwsCgkJICAgICAgIGd1YXJkX3Np emUpOwoKICAvKiBUaGUgbWF5YmVfc2V0IGNhbGxzIHdvbid0IHVwZGF0ZSB0aGUgdmFsdWUgaWYg dGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgc2V0CiAgICAgb25lLiAgV2hpY2ggbWVhbnMgd2UgbmVl ZCB0byB2YWxpZGF0ZSB0aGF0IHByb2JpbmcgaW50ZXJ2YWwgYW5kIGd1YXJkIHNpemUKICAgICBh cmUgZXF1YWwuICAqLwogIGludCBwcm9iZV9pbnRlcnZhbAogICAgPSBwYXJhbV9zdGFja19jbGFz aF9wcm90ZWN0aW9uX3Byb2JlX2ludGVydmFsOwogIGlmIChndWFyZF9zaXplICE9IHByb2JlX2lu dGVydmFsKQogICAgZXJyb3IgKCJzdGFjayBjbGFzaCBndWFyZCBzaXplICU8JWQlPiBtdXN0IGJl IGVxdWFsIHRvIHByb2JpbmcgaW50ZXJ2YWwgIgoJICAgIiU8JWQlPiIsIGd1YXJkX3NpemUsIHBy b2JlX2ludGVydmFsKTsKCiAgLyogRW5hYmxlIHN3IHByZWZldGNoaW5nIGF0IHNwZWNpZmllZCBv cHRpbWl6YXRpb24gbGV2ZWwgZm9yCiAgICAgQ1BVUyB0aGF0IGhhdmUgcHJlZmV0Y2guICBMb3dl ciBvcHRpbWl6YXRpb24gbGV2ZWwgdGhyZXNob2xkIGJ5IDEKICAgICB3aGVuIHByb2ZpbGluZyBp cyBlbmFibGVkLiAgKi8KICBpZiAob3B0cy0+eF9mbGFnX3ByZWZldGNoX2xvb3BfYXJyYXlzIDwg MAogICAgICAmJiAhb3B0cy0+eF9vcHRpbWl6ZV9zaXplCiAgICAgICYmIGFhcmNoNjRfdHVuZV9w YXJhbXMucHJlZmV0Y2gtPmRlZmF1bHRfb3B0X2xldmVsID49IDAKICAgICAgJiYgb3B0cy0+eF9v cHRpbWl6ZSA+PSBhYXJjaDY0X3R1bmVfcGFyYW1zLnByZWZldGNoLT5kZWZhdWx0X29wdF9sZXZl bCkKICAgIG9wdHMtPnhfZmxhZ19wcmVmZXRjaF9sb29wX2FycmF5cyA9IDE7CgogIGFhcmNoNjRf b3ZlcnJpZGVfb3B0aW9uc19hZnRlcl9jaGFuZ2VfMSAob3B0cyk7Cn0KCi8qIFByaW50IGEgaGlu dCB3aXRoIGEgc3VnZ2VzdGlvbiBmb3IgYSBjb3JlIG9yIGFyY2hpdGVjdHVyZSBuYW1lIHRoYXQK ICAgbW9zdCBjbG9zZWx5IHJlc2VtYmxlcyB3aGF0IHRoZSB1c2VyIHBhc3NlZCBpbiBTVFIuICBB UkNIIGlzIHRydWUgaWYKICAgdGhlIHVzZXIgaXMgYXNraW5nIGZvciBhbiBhcmNoaXRlY3R1cmUg bmFtZS4gIEFSQ0ggaXMgZmFsc2UgaWYgdGhlIHVzZXIKICAgaXMgYXNraW5nIGZvciBhIGNvcmUg bmFtZS4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X3ByaW50X2hpbnRfZm9yX2NvcmVfb3JfYXJj aCAoY29uc3QgY2hhciAqc3RyLCBib29sIGFyY2gpCnsKICBhdXRvX3ZlYzxjb25zdCBjaGFyICo+ IGNhbmRpZGF0ZXM7CiAgY29uc3Qgc3RydWN0IHByb2Nlc3NvciAqZW50cnkgPSBhcmNoID8gYWxs X2FyY2hpdGVjdHVyZXMgOiBhbGxfY29yZXM7CiAgZm9yICg7IGVudHJ5LT5uYW1lICE9IE5VTEw7 IGVudHJ5KyspCiAgICBjYW5kaWRhdGVzLnNhZmVfcHVzaCAoZW50cnktPm5hbWUpOwoKI2lmZGVm IEhBVkVfTE9DQUxfQ1BVX0RFVEVDVAogIC8qIEFkZCBhbHNvICJuYXRpdmUiIGFzIHBvc3NpYmxl IHZhbHVlLiAgKi8KICBpZiAoYXJjaCkKICAgIGNhbmRpZGF0ZXMuc2FmZV9wdXNoICgibmF0aXZl Iik7CiNlbmRpZgoKICBjaGFyICpzOwogIGNvbnN0IGNoYXIgKmhpbnQgPSBjYW5kaWRhdGVzX2xp c3RfYW5kX2hpbnQgKHN0ciwgcywgY2FuZGlkYXRlcyk7CiAgaWYgKGhpbnQpCiAgICBpbmZvcm0g KGlucHV0X2xvY2F0aW9uLCAidmFsaWQgYXJndW1lbnRzIGFyZTogJXM7IgoJCQkgICAgICIgZGlk IHlvdSBtZWFuICVxcz8iLCBzLCBoaW50KTsKICBlbHNlCiAgICBpbmZvcm0gKGlucHV0X2xvY2F0 aW9uLCAidmFsaWQgYXJndW1lbnRzIGFyZTogJXMiLCBzKTsKCiAgWERFTEVURVZFQyAocyk7Cn0K Ci8qIFByaW50IGEgaGludCB3aXRoIGEgc3VnZ2VzdGlvbiBmb3IgYSBjb3JlIG5hbWUgdGhhdCBt b3N0IGNsb3NlbHkgcmVzZW1ibGVzCiAgIHdoYXQgdGhlIHVzZXIgcGFzc2VkIGluIFNUUi4gICov CgppbmxpbmUgc3RhdGljIHZvaWQKYWFyY2g2NF9wcmludF9oaW50X2Zvcl9jb3JlIChjb25zdCBj aGFyICpzdHIpCnsKICBhYXJjaDY0X3ByaW50X2hpbnRfZm9yX2NvcmVfb3JfYXJjaCAoc3RyLCBm YWxzZSk7Cn0KCi8qIFByaW50IGEgaGludCB3aXRoIGEgc3VnZ2VzdGlvbiBmb3IgYW4gYXJjaGl0 ZWN0dXJlIG5hbWUgdGhhdCBtb3N0IGNsb3NlbHkKICAgcmVzZW1ibGVzIHdoYXQgdGhlIHVzZXIg cGFzc2VkIGluIFNUUi4gICovCgppbmxpbmUgc3RhdGljIHZvaWQKYWFyY2g2NF9wcmludF9oaW50 X2Zvcl9hcmNoIChjb25zdCBjaGFyICpzdHIpCnsKICBhYXJjaDY0X3ByaW50X2hpbnRfZm9yX2Nv cmVfb3JfYXJjaCAoc3RyLCB0cnVlKTsKfQoKCi8qIFByaW50IGEgaGludCB3aXRoIGEgc3VnZ2Vz dGlvbiBmb3IgYW4gZXh0ZW5zaW9uIG5hbWUKICAgdGhhdCBtb3N0IGNsb3NlbHkgcmVzZW1ibGVz IHdoYXQgdGhlIHVzZXIgcGFzc2VkIGluIFNUUi4gICovCgp2b2lkCmFhcmNoNjRfcHJpbnRfaGlu dF9mb3JfZXh0ZW5zaW9ucyAoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikKewogIGF1dG9fdmVjPGNv bnN0IGNoYXIgKj4gY2FuZGlkYXRlczsKICBhYXJjaDY0X2dldF9hbGxfZXh0ZW5zaW9uX2NhbmRp ZGF0ZXMgKCZjYW5kaWRhdGVzKTsKICBjaGFyICpzOwogIGNvbnN0IGNoYXIgKmhpbnQgPSBjYW5k aWRhdGVzX2xpc3RfYW5kX2hpbnQgKHN0ci5jX3N0ciAoKSwgcywgY2FuZGlkYXRlcyk7CiAgaWYg KGhpbnQpCiAgICBpbmZvcm0gKGlucHV0X2xvY2F0aW9uLCAidmFsaWQgYXJndW1lbnRzIGFyZTog JXM7IgoJCQkgICAgICIgZGlkIHlvdSBtZWFuICVxcz8iLCBzLCBoaW50KTsKICBlbHNlCiAgICBp bmZvcm0gKGlucHV0X2xvY2F0aW9uLCAidmFsaWQgYXJndW1lbnRzIGFyZTogJXMiLCBzKTsKCiAg WERFTEVURVZFQyAocyk7Cn0KCi8qIFZhbGlkYXRlIGEgY29tbWFuZC1saW5lIC1tY3B1IG9wdGlv bi4gIFBhcnNlIHRoZSBjcHUgYW5kIGV4dGVuc2lvbnMgKGlmIGFueSkKICAgc3BlY2lmaWVkIGlu IFNUUiBhbmQgdGhyb3cgZXJyb3JzIGlmIGFwcHJvcHJpYXRlLiAgUHV0IHRoZSByZXN1bHRzIGlm CiAgIHRoZXkgYXJlIHZhbGlkIGluIFJFUyBhbmQgSVNBX0ZMQUdTLiAgUmV0dXJuIHdoZXRoZXIg dGhlIG9wdGlvbiBpcwogICB2YWxpZC4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3ZhbGlkYXRl X21jcHUgKGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHByb2Nlc3NvciAqKnJlcywKCQkg ICAgICAgYWFyY2g2NF9mZWF0dXJlX2ZsYWdzICppc2FfZmxhZ3MpCnsKICBzdGQ6OnN0cmluZyBp bnZhbGlkX2V4dGVuc2lvbjsKICBlbnVtIGFhcmNoX3BhcnNlX29wdF9yZXN1bHQgcGFyc2VfcmVz CiAgICA9IGFhcmNoNjRfcGFyc2VfY3B1IChzdHIsIHJlcywgaXNhX2ZsYWdzLCAmaW52YWxpZF9l eHRlbnNpb24pOwoKICBpZiAocGFyc2VfcmVzID09IEFBUkNIX1BBUlNFX09LKQogICAgcmV0dXJu IHRydWU7CgogIHN3aXRjaCAocGFyc2VfcmVzKQogICAgewogICAgICBjYXNlIEFBUkNIX1BBUlNF X01JU1NJTkdfQVJHOgoJZXJyb3IgKCJtaXNzaW5nIGNwdSBuYW1lIGluICU8LW1jcHU9JXMlPiIs IHN0cik7CglicmVhazsKICAgICAgY2FzZSBBQVJDSF9QQVJTRV9JTlZBTElEX0FSRzoKCWVycm9y ICgidW5rbm93biB2YWx1ZSAlcXMgZm9yICU8LW1jcHUlPiIsIHN0cik7CglhYXJjaDY0X3ByaW50 X2hpbnRfZm9yX2NvcmUgKHN0cik7CgkvKiBBIGNvbW1vbiB1c2VyIGVycm9yIGlzIGNvbmZ1c2lu ZyAtbWFyY2ggYW5kIC1tY3B1LgoJICAgSWYgdGhlIC1tY3B1IHN0cmluZyBtYXRjaGVzIGEga25v d24gYXJjaGl0ZWN0dXJlIHRoZW4gc3VnZ2VzdAoJICAgLW1hcmNoPS4gICovCglwYXJzZV9yZXMg PSBhYXJjaDY0X3BhcnNlX2FyY2ggKHN0ciwgcmVzLCBpc2FfZmxhZ3MsICZpbnZhbGlkX2V4dGVu c2lvbik7CglpZiAocGFyc2VfcmVzID09IEFBUkNIX1BBUlNFX09LKQoJICBpbmZvcm0gKGlucHV0 X2xvY2F0aW9uLCAiZGlkIHlvdSBtZWFuICU8LW1hcmNoPSVzJT4/Iiwgc3RyKTsKCWJyZWFrOwog ICAgICBjYXNlIEFBUkNIX1BBUlNFX0lOVkFMSURfRkVBVFVSRToKCWVycm9yICgiaW52YWxpZCBm ZWF0dXJlIG1vZGlmaWVyICVxcyBpbiAlPC1tY3B1PSVzJT4iLAoJICAgICAgIGludmFsaWRfZXh0 ZW5zaW9uLmNfc3RyICgpLCBzdHIpOwoJYWFyY2g2NF9wcmludF9oaW50X2Zvcl9leHRlbnNpb25z IChpbnZhbGlkX2V4dGVuc2lvbik7CglicmVhazsKICAgICAgZGVmYXVsdDoKCWdjY191bnJlYWNo YWJsZSAoKTsKICAgIH0KCiAgcmV0dXJuIGZhbHNlOwp9CgovKiBTdHJhaWdodCBsaW5lIHNwZWN1 bGF0aW9uIGluZGljYXRvcnMuICAqLwplbnVtIGFhcmNoNjRfc2xzX2hhcmRlbmluZ190eXBlCnsK ICBTTFNfTk9ORSA9IDAsCiAgU0xTX1JFVEJSID0gMSwKICBTTFNfQkxSID0gMiwKICBTTFNfQUxM ID0gMywKfTsKc3RhdGljIGVudW0gYWFyY2g2NF9zbHNfaGFyZGVuaW5nX3R5cGUgYWFyY2g2NF9z bHNfaGFyZGVuaW5nOwoKLyogUmV0dXJuIHdoZXRoZXIgd2Ugc2hvdWxkIG1pdGlnYXRhdGUgU3Ry YWlnaHQgTGluZSBTcGVjdWxhdGlvbiBmb3IgdGhlIFJFVAogICBhbmQgQlIgaW5zdHJ1Y3Rpb25z LiAgKi8KYm9vbAphYXJjaDY0X2hhcmRlbl9zbHNfcmV0YnJfcCAodm9pZCkKewogIHJldHVybiBh YXJjaDY0X3Nsc19oYXJkZW5pbmcgJiBTTFNfUkVUQlI7Cn0KCi8qIFJldHVybiB3aGV0aGVyIHdl IHNob3VsZCBtaXRpZ2F0YXRlIFN0cmFpZ2h0IExpbmUgU3BlY3VsYXRpb24gZm9yIHRoZSBCTFIK ICAgaW5zdHJ1Y3Rpb24uICAqLwpib29sCmFhcmNoNjRfaGFyZGVuX3Nsc19ibHJfcCAodm9pZCkK ewogIHJldHVybiBhYXJjaDY0X3Nsc19oYXJkZW5pbmcgJiBTTFNfQkxSOwp9CgovKiBBcyBvZiB5 ZXQgd2Ugb25seSBhbGxvdyBzZXR0aW5nIHRoZXNlIG9wdGlvbnMgZ2xvYmFsbHksIGluIHRoZSBm dXR1cmUgd2UgbWF5CiAgIGFsbG93IHNldHRpbmcgdGhlbSBwZXIgZnVuY3Rpb24uICAqLwpzdGF0 aWMgdm9pZAphYXJjaDY0X3ZhbGlkYXRlX3Nsc19taXRpZ2F0aW9uIChjb25zdCBjaGFyICpjb25z dF9zdHIpCnsKICBjaGFyICp0b2tlbl9zYXZlID0gTlVMTDsKICBjaGFyICpzdHIgPSBOVUxMOwoK ICBpZiAoc3RyY21wIChjb25zdF9zdHIsICJub25lIikgPT0gMCkKICAgIHsKICAgICAgYWFyY2g2 NF9zbHNfaGFyZGVuaW5nID0gU0xTX05PTkU7CiAgICAgIHJldHVybjsKICAgIH0KICBpZiAoc3Ry Y21wIChjb25zdF9zdHIsICJhbGwiKSA9PSAwKQogICAgewogICAgICBhYXJjaDY0X3Nsc19oYXJk ZW5pbmcgPSBTTFNfQUxMOwogICAgICByZXR1cm47CiAgICB9CgogIGNoYXIgKnN0cl9yb290ID0g eHN0cmR1cCAoY29uc3Rfc3RyKTsKICBzdHIgPSBzdHJ0b2tfciAoc3RyX3Jvb3QsICIsIiwgJnRv a2VuX3NhdmUpOwogIGlmICghc3RyKQogICAgZXJyb3IgKCJpbnZhbGlkIGFyZ3VtZW50IGdpdmVu IHRvICU8LW1oYXJkZW4tc2xzPSU+Iik7CgogIGludCB0ZW1wID0gU0xTX05PTkU7CiAgd2hpbGUg KHN0cikKICAgIHsKICAgICAgaWYgKHN0cmNtcCAoc3RyLCAiYmxyIikgPT0gMCkKCXRlbXAgfD0g U0xTX0JMUjsKICAgICAgZWxzZSBpZiAoc3RyY21wIChzdHIsICJyZXRiciIpID09IDApCgl0ZW1w IHw9IFNMU19SRVRCUjsKICAgICAgZWxzZSBpZiAoc3RyY21wIChzdHIsICJub25lIikgPT0gMCB8 fCBzdHJjbXAgKHN0ciwgImFsbCIpID09IDApCgl7CgkgIGVycm9yICgiJXFzIG11c3QgYmUgYnkg aXRzZWxmIGZvciAlPC1taGFyZGVuLXNscz0lPiIsIHN0cik7CgkgIGJyZWFrOwoJfQogICAgICBl bHNlCgl7CgkgIGVycm9yICgiaW52YWxpZCBhcmd1bWVudCAlPCVzJT4gZm9yICU8LW1oYXJkZW4t c2xzPSU+Iiwgc3RyKTsKCSAgYnJlYWs7Cgl9CiAgICAgIHN0ciA9IHN0cnRva19yIChOVUxMLCAi LCIsICZ0b2tlbl9zYXZlKTsKICAgIH0KICBhYXJjaDY0X3Nsc19oYXJkZW5pbmcgPSAoYWFyY2g2 NF9zbHNfaGFyZGVuaW5nX3R5cGUpIHRlbXA7CiAgZnJlZSAoc3RyX3Jvb3QpOwp9CgovKiBWYWxp ZGF0ZSBhIGNvbW1hbmQtbGluZSAtbWFyY2ggb3B0aW9uLiAgUGFyc2UgdGhlIGFyY2ggYW5kIGV4 dGVuc2lvbnMKICAgKGlmIGFueSkgc3BlY2lmaWVkIGluIFNUUiBhbmQgdGhyb3cgZXJyb3JzIGlm IGFwcHJvcHJpYXRlLiAgUHV0IHRoZQogICByZXN1bHRzLCBpZiB0aGV5IGFyZSB2YWxpZCwgaW4g UkVTIGFuZCBJU0FfRkxBR1MuICBSZXR1cm4gd2hldGhlciB0aGUKICAgb3B0aW9uIGlzIHZhbGlk LiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfdmFsaWRhdGVfbWFyY2ggKGNvbnN0IGNoYXIgKnN0 ciwgY29uc3Qgc3RydWN0IHByb2Nlc3NvciAqKnJlcywKCQkJYWFyY2g2NF9mZWF0dXJlX2ZsYWdz ICppc2FfZmxhZ3MpCnsKICBzdGQ6OnN0cmluZyBpbnZhbGlkX2V4dGVuc2lvbjsKICBlbnVtIGFh cmNoX3BhcnNlX29wdF9yZXN1bHQgcGFyc2VfcmVzCiAgICA9IGFhcmNoNjRfcGFyc2VfYXJjaCAo c3RyLCByZXMsIGlzYV9mbGFncywgJmludmFsaWRfZXh0ZW5zaW9uKTsKCiAgaWYgKHBhcnNlX3Jl cyA9PSBBQVJDSF9QQVJTRV9PSykKICAgIHJldHVybiB0cnVlOwoKICBzd2l0Y2ggKHBhcnNlX3Jl cykKICAgIHsKICAgICAgY2FzZSBBQVJDSF9QQVJTRV9NSVNTSU5HX0FSRzoKCWVycm9yICgibWlz c2luZyBhcmNoIG5hbWUgaW4gJTwtbWFyY2g9JXMlPiIsIHN0cik7CglicmVhazsKICAgICAgY2Fz ZSBBQVJDSF9QQVJTRV9JTlZBTElEX0FSRzoKCWVycm9yICgidW5rbm93biB2YWx1ZSAlcXMgZm9y ICU8LW1hcmNoJT4iLCBzdHIpOwoJYWFyY2g2NF9wcmludF9oaW50X2Zvcl9hcmNoIChzdHIpOwoJ LyogQSBjb21tb24gdXNlciBlcnJvciBpcyBjb25mdXNpbmcgLW1hcmNoIGFuZCAtbWNwdS4KCSAg IElmIHRoZSAtbWFyY2ggc3RyaW5nIG1hdGNoZXMgYSBrbm93biBDUFUgc3VnZ2VzdCAtbWNwdS4g ICovCglwYXJzZV9yZXMgPSBhYXJjaDY0X3BhcnNlX2NwdSAoc3RyLCByZXMsIGlzYV9mbGFncywg JmludmFsaWRfZXh0ZW5zaW9uKTsKCWlmIChwYXJzZV9yZXMgPT0gQUFSQ0hfUEFSU0VfT0spCgkg IGluZm9ybSAoaW5wdXRfbG9jYXRpb24sICJkaWQgeW91IG1lYW4gJTwtbWNwdT0lcyU+PyIsIHN0 cik7CglicmVhazsKICAgICAgY2FzZSBBQVJDSF9QQVJTRV9JTlZBTElEX0ZFQVRVUkU6CgllcnJv ciAoImludmFsaWQgZmVhdHVyZSBtb2RpZmllciAlcXMgaW4gJTwtbWFyY2g9JXMlPiIsCgkgICAg ICAgaW52YWxpZF9leHRlbnNpb24uY19zdHIgKCksIHN0cik7CglhYXJjaDY0X3ByaW50X2hpbnRf Zm9yX2V4dGVuc2lvbnMgKGludmFsaWRfZXh0ZW5zaW9uKTsKCWJyZWFrOwogICAgICBkZWZhdWx0 OgoJZ2NjX3VucmVhY2hhYmxlICgpOwogICAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCi8qIFZhbGlk YXRlIGEgY29tbWFuZC1saW5lIC1tdHVuZSBvcHRpb24uICBQYXJzZSB0aGUgY3B1CiAgIHNwZWNp ZmllZCBpbiBTVFIgYW5kIHRocm93IGVycm9ycyBpZiBhcHByb3ByaWF0ZS4gIFB1dCB0aGUKICAg cmVzdWx0LCBpZiBpdCBpcyB2YWxpZCwgaW4gUkVTLiAgUmV0dXJuIHdoZXRoZXIgdGhlIG9wdGlv biBpcwogICB2YWxpZC4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3ZhbGlkYXRlX210dW5lIChj b25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBwcm9jZXNzb3IgKipyZXMpCnsKICBlbnVtIGFh cmNoX3BhcnNlX29wdF9yZXN1bHQgcGFyc2VfcmVzCiAgICA9IGFhcmNoNjRfcGFyc2VfdHVuZSAo c3RyLCByZXMpOwoKICBpZiAocGFyc2VfcmVzID09IEFBUkNIX1BBUlNFX09LKQogICAgcmV0dXJu IHRydWU7CgogIHN3aXRjaCAocGFyc2VfcmVzKQogICAgewogICAgICBjYXNlIEFBUkNIX1BBUlNF X01JU1NJTkdfQVJHOgoJZXJyb3IgKCJtaXNzaW5nIGNwdSBuYW1lIGluICU8LW10dW5lPSVzJT4i LCBzdHIpOwoJYnJlYWs7CiAgICAgIGNhc2UgQUFSQ0hfUEFSU0VfSU5WQUxJRF9BUkc6CgllcnJv ciAoInVua25vd24gdmFsdWUgJXFzIGZvciAlPC1tdHVuZSU+Iiwgc3RyKTsKCWFhcmNoNjRfcHJp bnRfaGludF9mb3JfY29yZSAoc3RyKTsKCWJyZWFrOwogICAgICBkZWZhdWx0OgoJZ2NjX3VucmVh Y2hhYmxlICgpOwogICAgfQogIHJldHVybiBmYWxzZTsKfQoKLyogUmV0dXJuIHRoZSBWRyB2YWx1 ZSBhc3NvY2lhdGVkIHdpdGggLW1zdmUtdmVjdG9yLWJpdHM9IHZhbHVlIFZBTFVFLiAgKi8KCnN0 YXRpYyBwb2x5X3VpbnQxNgphYXJjaDY0X2NvbnZlcnRfc3ZlX3ZlY3Rvcl9iaXRzIChhYXJjaDY0 X3N2ZV92ZWN0b3JfYml0c19lbnVtIHZhbHVlKQp7CiAgLyogMTI4LWJpdCBTVkUgYW5kIEFkdmFu Y2VkIFNJTUQgbW9kZXMgdXNlIGRpZmZlcmVudCByZWdpc3RlciBsYXlvdXRzCiAgICAgb24gYmln LWVuZGlhbiB0YXJnZXRzLCBzbyB3ZSB3b3VsZCBuZWVkIHRvIGZvcmJpZCBzdWJyZWdzIHRoYXQg Y29udmVydAogICAgIGZyb20gb25lIHRvIHRoZSBvdGhlci4gIEJ5IGRlZmF1bHQgYSByZWludGVy cHJldCBzZXF1ZW5jZSB3b3VsZCB0aGVuCiAgICAgaW52b2x2ZSBhIHN0b3JlIHRvIG1lbW9yeSBp biBvbmUgbW9kZSBhbmQgYSBsb2FkIGJhY2sgaW4gdGhlIG90aGVyLgogICAgIEV2ZW4gaWYgd2Ug b3B0aW1pemUgdGhhdCBzZXF1ZW5jZSB1c2luZyByZXZlcnNlIGluc3RydWN0aW9ucywKICAgICBp dCB3b3VsZCBzdGlsbCBiZSBhIHNpZ25pZmljYW50IHBvdGVudGlhbCBvdmVyaGVhZC4KCiAgICAg Rm9yIG5vdywgaXQgc2VlbXMgYmV0dGVyIHRvIGdlbmVyYXRlIGxlbmd0aC1hZ25vc3RpYyBjb2Rl IGZvciB0aGF0CiAgICAgY2FzZSBpbnN0ZWFkLiAgKi8KICBpZiAodmFsdWUgPT0gU1ZFX1NDQUxB QkxFCiAgICAgIHx8ICh2YWx1ZSA9PSBTVkVfMTI4ICYmIEJZVEVTX0JJR19FTkRJQU4pKQogICAg cmV0dXJuIHBvbHlfdWludDE2ICgyLCAyKTsKICBlbHNlCiAgICByZXR1cm4gKGludCkgdmFsdWUg LyA2NDsKfQoKLyogU2V0IHRoZSBnbG9iYWwgYWFyY2g2NF9hc21faXNhX2ZsYWdzIHRvIEZMQUdT IGFuZCB1cGRhdGUKICAgYWFyY2g2NF9pc2FfZmxhZ3MgYWNjb3JkaW5nbHkuICAqLwoKdm9pZAph YXJjaDY0X3NldF9hc21faXNhX2ZsYWdzIChhYXJjaDY0X2ZlYXR1cmVfZmxhZ3MgZmxhZ3MpCnsK ICBhYXJjaDY0X3NldF9hc21faXNhX2ZsYWdzICgmZ2xvYmFsX29wdGlvbnMsIGZsYWdzKTsKfQoK LyogSW1wbGVtZW50IFRBUkdFVF9PUFRJT05fT1ZFUlJJREUuICBUaGlzIGlzIGNhbGxlZCBvbmNl IGluIHRoZSBiZWdpbm5pbmcKICAgYW5kIGlzIHVzZWQgdG8gcGFyc2UgdGhlIC1te2NwdSx0dW5l LGFyY2h9IHN0cmluZ3MgYW5kIHNldHVwIHRoZSBpbml0aWFsCiAgIHR1bmluZyBzdHJ1Y3RzLiAg SW4gcGFydGljdWxhciBpdCBtdXN0IHNldCBzZWxlY3RlZF90dW5lIGFuZAogICBhYXJjaDY0X2Fz bV9pc2FfZmxhZ3MgdGhhdCBkZWZpbmUgdGhlIGF2YWlsYWJsZSBJU0EgZmVhdHVyZXMgYW5kIHR1 bmluZwogICBkZWNpc2lvbnMuICBJdCBtdXN0IGFsc28gc2V0IHNlbGVjdGVkX2FyY2ggYXMgdGhp cyB3aWxsIGJlIHVzZWQgdG8KICAgb3V0cHV0IHRoZSAuYXJjaCBhc20gdGFncyBmb3IgZWFjaCBm dW5jdGlvbi4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X292ZXJyaWRlX29wdGlvbnMgKHZvaWQp CnsKICBhYXJjaDY0X2ZlYXR1cmVfZmxhZ3MgY3B1X2lzYSA9IDA7CiAgYWFyY2g2NF9mZWF0dXJl X2ZsYWdzIGFyY2hfaXNhID0gMDsKICBhYXJjaDY0X3NldF9hc21faXNhX2ZsYWdzICgwKTsKCiAg Y29uc3Qgc3RydWN0IHByb2Nlc3NvciAqY3B1ID0gTlVMTDsKICBjb25zdCBzdHJ1Y3QgcHJvY2Vz c29yICphcmNoID0gTlVMTDsKICBjb25zdCBzdHJ1Y3QgcHJvY2Vzc29yICp0dW5lID0gTlVMTDsK CiAgaWYgKGFhcmNoNjRfaGFyZGVuX3Nsc19zdHJpbmcpCiAgICBhYXJjaDY0X3ZhbGlkYXRlX3Ns c19taXRpZ2F0aW9uIChhYXJjaDY0X2hhcmRlbl9zbHNfc3RyaW5nKTsKCiAgaWYgKGFhcmNoNjRf YnJhbmNoX3Byb3RlY3Rpb25fc3RyaW5nKQogICAgYWFyY2hfdmFsaWRhdGVfbWJyYW5jaF9wcm90 ZWN0aW9uIChhYXJjaDY0X2JyYW5jaF9wcm90ZWN0aW9uX3N0cmluZyk7CgogIC8qIC1tY3B1PUNQ VSBpcyBzaG9ydGhhbmQgZm9yIC1tYXJjaD1BUkNIX0ZPUl9DUFUsIC1tdHVuZT1DUFUuCiAgICAg SWYgZWl0aGVyIG9mIC1tYXJjaCBvciAtbXR1bmUgaXMgZ2l2ZW4sIHRoZXkgb3ZlcnJpZGUgdGhl aXIKICAgICByZXNwZWN0aXZlIGNvbXBvbmVudCBvZiAtbWNwdS4gICovCiAgaWYgKGFhcmNoNjRf Y3B1X3N0cmluZykKICAgIGFhcmNoNjRfdmFsaWRhdGVfbWNwdSAoYWFyY2g2NF9jcHVfc3RyaW5n LCAmY3B1LCAmY3B1X2lzYSk7CgogIGlmIChhYXJjaDY0X2FyY2hfc3RyaW5nKQogICAgYWFyY2g2 NF92YWxpZGF0ZV9tYXJjaCAoYWFyY2g2NF9hcmNoX3N0cmluZywgJmFyY2gsICZhcmNoX2lzYSk7 CgogIGlmIChhYXJjaDY0X3R1bmVfc3RyaW5nKQogICAgYWFyY2g2NF92YWxpZGF0ZV9tdHVuZSAo YWFyY2g2NF90dW5lX3N0cmluZywgJnR1bmUpOwoKI2lmZGVmIFNVQlRBUkdFVF9PVkVSUklERV9P UFRJT05TCiAgU1VCVEFSR0VUX09WRVJSSURFX09QVElPTlM7CiNlbmRpZgoKICBpZiAoY3B1ICYm IGFyY2gpCiAgICB7CiAgICAgIC8qIElmIGJvdGggLW1jcHUgYW5kIC1tYXJjaCBhcmUgc3BlY2lm aWVkLCB3YXJuIGlmIHRoZXkgYXJlIG5vdAoJIGFyY2hpdGVjdHVyYWxseSBjb21wYXRpYmxlIGFu ZCBwcmVmZXIgdGhlIC1tYXJjaCBJU0EgZmxhZ3MuICAqLwogICAgICBpZiAoYXJjaC0+YXJjaCAh PSBjcHUtPmFyY2gpCgl7CgkgIHdhcm5pbmcgKDAsICJzd2l0Y2ggJTwtbWNwdT0lcyU+IGNvbmZs aWN0cyB3aXRoICU8LW1hcmNoPSVzJT4gc3dpdGNoIiwKCQkgICAgICAgYWFyY2g2NF9jcHVfc3Ry aW5nLAoJCSAgICAgICBhYXJjaDY0X2FyY2hfc3RyaW5nKTsKCX0KCiAgICAgIHNlbGVjdGVkX2Fy Y2ggPSBhcmNoLT5hcmNoOwogICAgICBhYXJjaDY0X3NldF9hc21faXNhX2ZsYWdzIChhcmNoX2lz YSk7CiAgICB9CiAgZWxzZSBpZiAoY3B1KQogICAgewogICAgICBzZWxlY3RlZF9hcmNoID0gY3B1 LT5hcmNoOwogICAgICBhYXJjaDY0X3NldF9hc21faXNhX2ZsYWdzIChjcHVfaXNhKTsKICAgIH0K ICBlbHNlIGlmIChhcmNoKQogICAgewogICAgICBjcHUgPSAmYWxsX2NvcmVzW2FyY2gtPmlkZW50 XTsKICAgICAgc2VsZWN0ZWRfYXJjaCA9IGFyY2gtPmFyY2g7CiAgICAgIGFhcmNoNjRfc2V0X2Fz bV9pc2FfZmxhZ3MgKGFyY2hfaXNhKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIC8qIE5vIC1t Y3B1IG9yIC1tYXJjaCBzcGVjaWZpZWQsIHNvIHVzZSB0aGUgZGVmYXVsdCBDUFUuICAqLwogICAg ICBjcHUgPSAmYWxsX2NvcmVzW1RBUkdFVF9DUFVfREVGQVVMVF07CiAgICAgIHNlbGVjdGVkX2Fy Y2ggPSBjcHUtPmFyY2g7CiAgICAgIGFhcmNoNjRfc2V0X2FzbV9pc2FfZmxhZ3MgKGNwdS0+Zmxh Z3MpOwogICAgfQoKICBzZWxlY3RlZF90dW5lID0gdHVuZSA/IHR1bmUtPmlkZW50IDogY3B1LT5p ZGVudDsKCiAgaWYgKGFhcmNoX2VuYWJsZV9idGkgPT0gMikKICAgIHsKI2lmZGVmIFRBUkdFVF9F TkFCTEVfQlRJCiAgICAgIGFhcmNoX2VuYWJsZV9idGkgPSAxOwojZWxzZQogICAgICBhYXJjaF9l bmFibGVfYnRpID0gMDsKI2VuZGlmCiAgICB9CgogIC8qIFJldHVybiBhZGRyZXNzIHNpZ25pbmcg aXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZm9yIElMUDMyIHRhcmdldHMuICBGb3IKICAgICBM UDY0IHRhcmdldHMgdXNlIHRoZSBjb25maWd1cmVkIG9wdGlvbiBpbiB0aGUgYWJzZW5jZSBvZiBh IGNvbW1hbmQtbGluZQogICAgIG9wdGlvbiBmb3IgLW1icmFuY2gtcHJvdGVjdGlvbi4gICovCiAg aWYgKCFUQVJHRVRfSUxQMzIgJiYgYWNjZXB0ZWRfYnJhbmNoX3Byb3RlY3Rpb25fc3RyaW5nID09 IE5VTEwpCiAgICB7CiNpZmRlZiBUQVJHRVRfRU5BQkxFX1BBQ19SRVQKICAgICAgYWFyY2hfcmFf c2lnbl9zY29wZSA9IEFBUkNIX0ZVTkNUSU9OX05PTl9MRUFGOwojZWxzZQogICAgICBhYXJjaF9y YV9zaWduX3Njb3BlID0gQUFSQ0hfRlVOQ1RJT05fTk9ORTsKI2VuZGlmCiAgICB9CgojaWZuZGVm IEhBVkVfQVNfTUFCSV9PUFRJT04KICAvKiBUaGUgY29tcGlsZXIgbWF5IGhhdmUgYmVlbiBjb25m aWd1cmVkIHdpdGggMi4yMy4qIGJpbnV0aWxzLCB3aGljaCBkb2VzCiAgICAgbm90IGhhdmUgc3Vw cG9ydCBmb3IgSUxQMzIuICAqLwogIGlmIChUQVJHRVRfSUxQMzIpCiAgICBlcnJvciAoImFzc2Vt YmxlciBkb2VzIG5vdCBzdXBwb3J0ICU8LW1hYmk9aWxwMzIlPiIpOwojZW5kaWYKCiAgLyogQ29u dmVydCAtbXN2ZS12ZWN0b3ItYml0cyB0byBhIFZHIGNvdW50LiAgKi8KICBhYXJjaDY0X3N2ZV92 ZyA9IGFhcmNoNjRfY29udmVydF9zdmVfdmVjdG9yX2JpdHMgKGFhcmNoNjRfc3ZlX3ZlY3Rvcl9i aXRzKTsKCiAgaWYgKGFhcmNoX3JhX3NpZ25fc2NvcGUgIT0gQUFSQ0hfRlVOQ1RJT05fTk9ORSAm JiBUQVJHRVRfSUxQMzIpCiAgICBzb3JyeSAoInJldHVybiBhZGRyZXNzIHNpZ25pbmcgaXMgb25s eSBzdXBwb3J0ZWQgZm9yICU8LW1hYmk9bHA2NCU+Iik7CgogIC8qIFRoZSBwYXNzIHRvIGluc2Vy dCBzcGVjdWxhdGlvbiB0cmFja2luZyBydW5zIGJlZm9yZQogICAgIHNocmluay13cmFwcGluZyBh bmQgdGhlIGxhdHRlciBkb2VzIG5vdCBrbm93IGhvdyB0byB1cGRhdGUgdGhlCiAgICAgdHJhY2tp bmcgc3RhdHVzLiAgU28gZGlzYWJsZSBpdCBpbiB0aGlzIGNhc2UuICAqLwogIGlmIChhYXJjaDY0 X3RyYWNrX3NwZWN1bGF0aW9uKQogICAgZmxhZ19zaHJpbmtfd3JhcCA9IDA7CgogIGFhcmNoNjRf b3ZlcnJpZGVfb3B0aW9uc19pbnRlcm5hbCAoJmdsb2JhbF9vcHRpb25zKTsKCiAgLyogU2F2ZSB0 aGVzZSBvcHRpb25zIGFzIHRoZSBkZWZhdWx0IG9uZXMgaW4gY2FzZSB3ZSBwdXNoIGFuZCBwb3Ag dGhlbSBsYXRlcgogICAgIHdoaWxlIHByb2Nlc3NpbmcgZnVuY3Rpb25zIHdpdGggcG90ZW50aWFs IHRhcmdldCBhdHRyaWJ1dGVzLiAgKi8KICB0YXJnZXRfb3B0aW9uX2RlZmF1bHRfbm9kZSA9IHRh cmdldF9vcHRpb25fY3VycmVudF9ub2RlCiAgICA9IGJ1aWxkX3RhcmdldF9vcHRpb25fbm9kZSAo Jmdsb2JhbF9vcHRpb25zLCAmZ2xvYmFsX29wdGlvbnNfc2V0KTsKfQoKLyogSW1wbGVtZW50IHRh cmdldG0ub3ZlcnJpZGVfb3B0aW9uc19hZnRlcl9jaGFuZ2UuICAqLwoKc3RhdGljIHZvaWQKYWFy Y2g2NF9vdmVycmlkZV9vcHRpb25zX2FmdGVyX2NoYW5nZSAodm9pZCkKewogIGFhcmNoNjRfb3Zl cnJpZGVfb3B0aW9uc19hZnRlcl9jaGFuZ2VfMSAoJmdsb2JhbF9vcHRpb25zKTsKfQoKLyogSW1w bGVtZW50IHRoZSBUQVJHRVRfT0ZGTE9BRF9PUFRJT05TIGhvb2suICAqLwpzdGF0aWMgY2hhciAq CmFhcmNoNjRfb2ZmbG9hZF9vcHRpb25zICh2b2lkKQp7CiAgaWYgKFRBUkdFVF9JTFAzMikKICAg IHJldHVybiB4c3RyZHVwICgiLWZvZmZsb2FkLWFiaT1pbHAzMiIpOwogIGVsc2UKICAgIHJldHVy biB4c3RyZHVwICgiLWZvZmZsb2FkLWFiaT1scDY0Iik7Cn0KCnN0YXRpYyBzdHJ1Y3QgbWFjaGlu ZV9mdW5jdGlvbiAqCmFhcmNoNjRfaW5pdF9tYWNoaW5lX3N0YXR1cyAodm9pZCkKewogIHN0cnVj dCBtYWNoaW5lX2Z1bmN0aW9uICptYWNoaW5lOwogIG1hY2hpbmUgPSBnZ2NfY2xlYXJlZF9hbGxv YzxtYWNoaW5lX2Z1bmN0aW9uPiAoKTsKICByZXR1cm4gbWFjaGluZTsKfQoKdm9pZAphYXJjaDY0 X2luaXRfZXhwYW5kZXJzICh2b2lkKQp7CiAgaW5pdF9tYWNoaW5lX3N0YXR1cyA9IGFhcmNoNjRf aW5pdF9tYWNoaW5lX3N0YXR1czsKfQoKLyogQSBjaGVja2luZyBtZWNoYW5pc20gZm9yIHRoZSBp bXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBjb2RlIG1vZGVscy4gICovCnN0YXRpYyB2b2lk CmluaXRpYWxpemVfYWFyY2g2NF9jb2RlX21vZGVsIChzdHJ1Y3QgZ2NjX29wdGlvbnMgKm9wdHMp CnsKICBhYXJjaDY0X2Ntb2RlbCA9IG9wdHMtPnhfYWFyY2g2NF9jbW9kZWxfdmFyOwogIHN3aXRj aCAob3B0cy0+eF9hYXJjaDY0X2Ntb2RlbF92YXIpCiAgICB7CiAgICBjYXNlIEFBUkNINjRfQ01P REVMX1RJTlk6CiAgICAgIGlmIChvcHRzLT54X2ZsYWdfcGljKQoJYWFyY2g2NF9jbW9kZWwgPSBB QVJDSDY0X0NNT0RFTF9USU5ZX1BJQzsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFBUkNINjRfQ01P REVMX1NNQUxMOgogICAgICBpZiAob3B0cy0+eF9mbGFnX3BpYykKCXsKI2lmZGVmIEhBVkVfQVNf U01BTExfUElDX1JFTE9DUwoJICBhYXJjaDY0X2Ntb2RlbCA9IChmbGFnX3BpYyA9PSAyCgkJCSAg ICA/IEFBUkNINjRfQ01PREVMX1NNQUxMX1BJQwoJCQkgICAgOiBBQVJDSDY0X0NNT0RFTF9TTUFM TF9TUElDKTsKI2Vsc2UKCSAgYWFyY2g2NF9jbW9kZWwgPSBBQVJDSDY0X0NNT0RFTF9TTUFMTF9Q SUM7CiNlbmRpZgoJfQogICAgICBicmVhazsKICAgIGNhc2UgQUFSQ0g2NF9DTU9ERUxfTEFSR0U6 CiAgICAgIGlmIChvcHRzLT54X2ZsYWdfcGljKQoJc29ycnkgKCJjb2RlIG1vZGVsICVxcyB3aXRo ICU8LWYlcyU+IiwgImxhcmdlIiwKCSAgICAgICBvcHRzLT54X2ZsYWdfcGljID4gMSA/ICJQSUMi IDogInBpYyIpOwogICAgICBpZiAob3B0cy0+eF9hYXJjaDY0X2FiaSA9PSBBQVJDSDY0X0FCSV9J TFAzMikKCXNvcnJ5ICgiY29kZSBtb2RlbCAlcXMgbm90IHN1cHBvcnRlZCBpbiBpbHAzMiBtb2Rl IiwgImxhcmdlIik7CiAgICAgIGJyZWFrOwogICAgY2FzZSBBQVJDSDY0X0NNT0RFTF9USU5ZX1BJ QzoKICAgIGNhc2UgQUFSQ0g2NF9DTU9ERUxfU01BTExfUElDOgogICAgY2FzZSBBQVJDSDY0X0NN T0RFTF9TTUFMTF9TUElDOgogICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CiAgICB9Cn0KCi8qIElt cGxlbWVudHMgVEFSR0VUX09QVElPTl9SRVNUT1JFLiAgUmVzdG9yZSB0aGUgYmFja2VuZCBjb2Rl Z2VuIGRlY2lzaW9ucwogICB1c2luZyB0aGUgaW5mb3JtYXRpb24gc2F2ZWQgaW4gUFRSLiAgKi8K CnN0YXRpYyB2b2lkCmFhcmNoNjRfb3B0aW9uX3Jlc3RvcmUgKHN0cnVjdCBnY2Nfb3B0aW9ucyAq b3B0cywKCQkJc3RydWN0IGdjY19vcHRpb25zICogLyogb3B0c19zZXQgKi8sCgkJCXN0cnVjdCBj bF90YXJnZXRfb3B0aW9uICogLyogcHRyICovKQp7CiAgYWFyY2g2NF9vdmVycmlkZV9vcHRpb25z X2ludGVybmFsIChvcHRzKTsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9PUFRJT05fUFJJTlQuICAq LwoKc3RhdGljIHZvaWQKYWFyY2g2NF9vcHRpb25fcHJpbnQgKEZJTEUgKmZpbGUsIGludCBpbmRl bnQsIHN0cnVjdCBjbF90YXJnZXRfb3B0aW9uICpwdHIpCnsKICBjb25zdCBzdHJ1Y3QgcHJvY2Vz c29yICpjcHUKICAgID0gYWFyY2g2NF9nZXRfdHVuZV9jcHUgKHB0ci0+eF9zZWxlY3RlZF90dW5l KTsKICBjb25zdCBzdHJ1Y3QgcHJvY2Vzc29yICphcmNoID0gYWFyY2g2NF9nZXRfYXJjaCAocHRy LT54X3NlbGVjdGVkX2FyY2gpOwogIHN0ZDo6c3RyaW5nIGV4dGVuc2lvbgogICAgPSBhYXJjaDY0 X2dldF9leHRlbnNpb25fc3RyaW5nX2Zvcl9pc2FfZmxhZ3MgKHB0ci0+eF9hYXJjaDY0X2FzbV9p c2FfZmxhZ3MsCgkJCQkJCSAgYXJjaC0+ZmxhZ3MpOwoKICBmcHJpbnRmIChmaWxlLCAiJSpzc2Vs ZWN0ZWQgdHVuZSA9ICVzXG4iLCBpbmRlbnQsICIiLCBjcHUtPm5hbWUpOwogIGZwcmludGYgKGZp bGUsICIlKnNzZWxlY3RlZCBhcmNoID0gJXMlc1xuIiwgaW5kZW50LCAiIiwKCSAgIGFyY2gtPm5h bWUsIGV4dGVuc2lvbi5jX3N0ciAoKSk7Cn0KCnN0YXRpYyBHVFkoKCkpIHRyZWUgYWFyY2g2NF9w cmV2aW91c19mbmRlY2w7Cgp2b2lkCmFhcmNoNjRfcmVzZXRfcHJldmlvdXNfZm5kZWNsICh2b2lk KQp7CiAgYWFyY2g2NF9wcmV2aW91c19mbmRlY2wgPSBOVUxMOwp9CgovKiBSZXN0b3JlIG9yIHNh dmUgdGhlIFRSRUVfVEFSR0VUX0dMT0JBTFMgZnJvbSBvciB0byBORVdfVFJFRS4KICAgVXNlZCBi eSBhYXJjaDY0X3NldF9jdXJyZW50X2Z1bmN0aW9uIGFuZCBhYXJjaDY0X3ByYWdtYV90YXJnZXRf cGFyc2UgdG8KICAgbWFrZSBzdXJlIG9wdGFiIGF2YWlsYWJpbGl0eSBwcmVkaWNhdGVzIGFyZSBy ZWNvbXB1dGVkIHdoZW4gbmVjZXNzYXJ5LiAgKi8KCnZvaWQKYWFyY2g2NF9zYXZlX3Jlc3RvcmVf dGFyZ2V0X2dsb2JhbHMgKHRyZWUgbmV3X3RyZWUpCnsKICBpZiAoVFJFRV9UQVJHRVRfR0xPQkFM UyAobmV3X3RyZWUpKQogICAgcmVzdG9yZV90YXJnZXRfZ2xvYmFscyAoVFJFRV9UQVJHRVRfR0xP QkFMUyAobmV3X3RyZWUpKTsKICBlbHNlIGlmIChuZXdfdHJlZSA9PSB0YXJnZXRfb3B0aW9uX2Rl ZmF1bHRfbm9kZSkKICAgIHJlc3RvcmVfdGFyZ2V0X2dsb2JhbHMgKCZkZWZhdWx0X3RhcmdldF9n bG9iYWxzKTsKICBlbHNlCiAgICBUUkVFX1RBUkdFVF9HTE9CQUxTIChuZXdfdHJlZSkgPSBzYXZl X3RhcmdldF9nbG9iYWxzX2RlZmF1bHRfb3B0cyAoKTsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9T RVRfQ1VSUkVOVF9GVU5DVElPTi4gIFVucGFjayB0aGUgY29kZWdlbiBkZWNpc2lvbnMKICAgbGlr ZSB0dW5pbmcgYW5kIElTQSBmZWF0dXJlcyBmcm9tIHRoZSBERUNMX0ZVTkNUSU9OX1NQRUNJRklD X1RBUkdFVAogICBvZiB0aGUgZnVuY3Rpb24sIGlmIHN1Y2ggZXhpc3RzLiAgVGhpcyBmdW5jdGlv biBtYXkgYmUgY2FsbGVkIG11bHRpcGxlCiAgIHRpbWVzIG9uIGEgc2luZ2xlIGZ1bmN0aW9uIHNv IHVzZSBhYXJjaDY0X3ByZXZpb3VzX2ZuZGVjbCB0byBhdm9pZAogICBzZXR0aW5nIHVwIGlkZW50 aWNhbCBzdGF0ZS4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X3NldF9jdXJyZW50X2Z1bmN0aW9u ICh0cmVlIGZuZGVjbCkKewogIGlmICghZm5kZWNsIHx8IGZuZGVjbCA9PSBhYXJjaDY0X3ByZXZp b3VzX2ZuZGVjbCkKICAgIHJldHVybjsKCiAgdHJlZSBvbGRfdHJlZSA9IChhYXJjaDY0X3ByZXZp b3VzX2ZuZGVjbAoJCSAgID8gREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGFhcmNoNjRf cHJldmlvdXNfZm5kZWNsKQoJCSAgIDogTlVMTF9UUkVFKTsKCiAgdHJlZSBuZXdfdHJlZSA9IERF Q0xfRlVOQ1RJT05fU1BFQ0lGSUNfVEFSR0VUIChmbmRlY2wpOwoKICAvKiBJZiBjdXJyZW50IGZ1 bmN0aW9uIGhhcyBubyBhdHRyaWJ1dGVzIGJ1dCB0aGUgcHJldmlvdXMgb25lIGRpZCwKICAgICB1 c2UgdGhlIGRlZmF1bHQgbm9kZS4gICovCiAgaWYgKCFuZXdfdHJlZSAmJiBvbGRfdHJlZSkKICAg IG5ld190cmVlID0gdGFyZ2V0X29wdGlvbl9kZWZhdWx0X25vZGU7CgogIC8qIElmIG5vdGhpbmcg dG8gZG8sIHJldHVybi4gICNwcmFnbWEgR0NDIHJlc2V0IG9yICNwcmFnbWEgR0NDIHBvcCB0bwog ICAgIHRoZSBkZWZhdWx0IGhhdmUgYmVlbiBoYW5kbGVkIGJ5IGFhcmNoNjRfc2F2ZV9yZXN0b3Jl X3RhcmdldF9nbG9iYWxzIGZyb20KICAgICBhYXJjaDY0X3ByYWdtYV90YXJnZXRfcGFyc2UuICAq LwogIGlmIChvbGRfdHJlZSA9PSBuZXdfdHJlZSkKICAgIHJldHVybjsKCiAgYWFyY2g2NF9wcmV2 aW91c19mbmRlY2wgPSBmbmRlY2w7CgogIC8qIEZpcnN0IHNldCB0aGUgdGFyZ2V0IG9wdGlvbnMu ICAqLwogIGNsX3RhcmdldF9vcHRpb25fcmVzdG9yZSAoJmdsb2JhbF9vcHRpb25zLCAmZ2xvYmFs X29wdGlvbnNfc2V0LAoJCQkgICAgVFJFRV9UQVJHRVRfT1BUSU9OIChuZXdfdHJlZSkpOwoKICBh YXJjaDY0X3NhdmVfcmVzdG9yZV90YXJnZXRfZ2xvYmFscyAobmV3X3RyZWUpOwp9CgovKiBFbnVt IGRlc2NyaWJpbmcgdGhlIHZhcmlvdXMgd2F5cyB3ZSBjYW4gaGFuZGxlIGF0dHJpYnV0ZXMuCiAg IEluIG1hbnkgY2FzZXMgd2UgY2FuIHJldXNlIHRoZSBnZW5lcmljIG9wdGlvbiBoYW5kbGluZyBt YWNoaW5lcnkuICAqLwoKZW51bSBhYXJjaDY0X2F0dHJfb3B0X3R5cGUKewogIGFhcmNoNjRfYXR0 cl9tYXNrLAkvKiBBdHRyaWJ1dGUgc2hvdWxkIHNldCBhIGJpdCBpbiB0YXJnZXRfZmxhZ3MuICAq LwogIGFhcmNoNjRfYXR0cl9ib29sLAkvKiBBdHRyaWJ1dGUgc2V0cyBvciB1bnNldHMgYSBib29s ZWFuIHZhcmlhYmxlLiAgKi8KICBhYXJjaDY0X2F0dHJfZW51bSwJLyogQXR0cmlidXRlIHNldHMg YW4gZW51bSB2YXJpYWJsZS4gICovCiAgYWFyY2g2NF9hdHRyX2N1c3RvbQkvKiBBdHRyaWJ1dGUg cmVxdWlyZXMgYSBjdXN0b20gaGFuZGxpbmcgZnVuY3Rpb24uICAqLwp9OwoKLyogQWxsIHRoZSBp bmZvcm1hdGlvbiBuZWVkZWQgdG8gaGFuZGxlIGEgdGFyZ2V0IGF0dHJpYnV0ZS4KICAgTkFNRSBp cyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgogICBBVFRSX1RZUEUgc3BlY2lmaWVzIHRoZSB0 eXBlIG9mIGJlaGF2aW9yIG9mIHRoZSBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkCiAgIGluIHRoZSBk ZWZpbml0aW9uIG9mIGVudW0gYWFyY2g2NF9hdHRyX29wdF90eXBlLgogICBBTExPV19ORUcgaXMg dHJ1ZSBpZiB0aGUgYXR0cmlidXRlIHN1cHBvcnRzIGEgIm5vLSIgZm9ybS4KICAgSEFORExFUiBp cyB0aGUgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgYXR0cmlidXRlIHN0cmluZyBhcyBhbiBhcmd1 bWVudAogICBJdCBpcyBuZWVkZWQgb25seSB3aGVuIHRoZSBBVFRSX1RZUEUgaXMgYWFyY2g2NF9h dHRyX2N1c3RvbS4KICAgT1BUX05VTSBpcyB0aGUgZW51bSBzcGVjaWZ5aW5nIHRoZSBvcHRpb24g dGhhdCB0aGUgYXR0cmlidXRlIG1vZGlmaWVzLgogICBUaGlzIGlzIG5lZWRlZCBmb3IgYXR0cmli dXRlcyB0aGF0IG1pcnJvciB0aGUgYmVoYXZpb3Igb2YgYSBjb21tYW5kLWxpbmUKICAgb3B0aW9u LCB0aGF0IGlzIGl0IGhhcyBBVFRSX1RZUEUgYWFyY2g2NF9hdHRyX21hc2ssIGFhcmNoNjRfYXR0 cl9ib29sIG9yCiAgIGFhcmNoNjRfYXR0cl9lbnVtLiAgKi8KCnN0cnVjdCBhYXJjaDY0X2F0dHJp YnV0ZV9pbmZvCnsKICBjb25zdCBjaGFyICpuYW1lOwogIGVudW0gYWFyY2g2NF9hdHRyX29wdF90 eXBlIGF0dHJfdHlwZTsKICBib29sIGFsbG93X25lZzsKICBib29sICgqaGFuZGxlcikgKGNvbnN0 IGNoYXIgKik7CiAgZW51bSBvcHRfY29kZSBvcHRfbnVtOwp9OwoKLyogSGFuZGxlIHRoZSBBUkNI X1NUUiBhcmd1bWVudCB0byB0aGUgYXJjaD0gdGFyZ2V0IGF0dHJpYnV0ZS4gICovCgpzdGF0aWMg Ym9vbAphYXJjaDY0X2hhbmRsZV9hdHRyX2FyY2ggKGNvbnN0IGNoYXIgKnN0cikKewogIGNvbnN0 IHN0cnVjdCBwcm9jZXNzb3IgKnRtcF9hcmNoID0gTlVMTDsKICBzdGQ6OnN0cmluZyBpbnZhbGlk X2V4dGVuc2lvbjsKICBhYXJjaDY0X2ZlYXR1cmVfZmxhZ3MgdG1wX2ZsYWdzOwogIGVudW0gYWFy Y2hfcGFyc2Vfb3B0X3Jlc3VsdCBwYXJzZV9yZXMKICAgID0gYWFyY2g2NF9wYXJzZV9hcmNoIChz dHIsICZ0bXBfYXJjaCwgJnRtcF9mbGFncywgJmludmFsaWRfZXh0ZW5zaW9uKTsKCiAgaWYgKHBh cnNlX3JlcyA9PSBBQVJDSF9QQVJTRV9PSykKICAgIHsKICAgICAgZ2NjX2Fzc2VydCAodG1wX2Fy Y2gpOwogICAgICBzZWxlY3RlZF9hcmNoID0gdG1wX2FyY2gtPmFyY2g7CiAgICAgIGFhcmNoNjRf c2V0X2FzbV9pc2FfZmxhZ3MgKHRtcF9mbGFncyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoK ICBzd2l0Y2ggKHBhcnNlX3JlcykKICAgIHsKICAgICAgY2FzZSBBQVJDSF9QQVJTRV9NSVNTSU5H X0FSRzoKCWVycm9yICgibWlzc2luZyBuYW1lIGluICU8dGFyZ2V0KFwiYXJjaD1cIiklPiBwcmFn bWEgb3IgYXR0cmlidXRlIik7CglicmVhazsKICAgICAgY2FzZSBBQVJDSF9QQVJTRV9JTlZBTElE X0FSRzoKCWVycm9yICgiaW52YWxpZCBuYW1lICVxcyBpbiAlPHRhcmdldChcImFyY2g9XCIpJT4g cHJhZ21hIG9yIGF0dHJpYnV0ZSIsIHN0cik7CglhYXJjaDY0X3ByaW50X2hpbnRfZm9yX2FyY2gg KHN0cik7CglicmVhazsKICAgICAgY2FzZSBBQVJDSF9QQVJTRV9JTlZBTElEX0ZFQVRVUkU6Cgll cnJvciAoImludmFsaWQgZmVhdHVyZSBtb2RpZmllciAlcyBvZiB2YWx1ZSAlcXMgaW4gIgoJICAg ICAgICIlPHRhcmdldCgpJT4gcHJhZ21hIG9yIGF0dHJpYnV0ZSIsIGludmFsaWRfZXh0ZW5zaW9u LmNfc3RyICgpLCBzdHIpOwoJYWFyY2g2NF9wcmludF9oaW50X2Zvcl9leHRlbnNpb25zIChpbnZh bGlkX2V4dGVuc2lvbik7CglicmVhazsKICAgICAgZGVmYXVsdDoKCWdjY191bnJlYWNoYWJsZSAo KTsKICAgIH0KCiAgcmV0dXJuIGZhbHNlOwp9CgovKiBIYW5kbGUgdGhlIGFyZ3VtZW50IENQVV9T VFIgdG8gdGhlIGNwdT0gdGFyZ2V0IGF0dHJpYnV0ZS4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0 X2hhbmRsZV9hdHRyX2NwdSAoY29uc3QgY2hhciAqc3RyKQp7CiAgY29uc3Qgc3RydWN0IHByb2Nl c3NvciAqdG1wX2NwdSA9IE5VTEw7CiAgc3RkOjpzdHJpbmcgaW52YWxpZF9leHRlbnNpb247CiAg YWFyY2g2NF9mZWF0dXJlX2ZsYWdzIHRtcF9mbGFnczsKICBlbnVtIGFhcmNoX3BhcnNlX29wdF9y ZXN1bHQgcGFyc2VfcmVzCiAgICA9IGFhcmNoNjRfcGFyc2VfY3B1IChzdHIsICZ0bXBfY3B1LCAm dG1wX2ZsYWdzLCAmaW52YWxpZF9leHRlbnNpb24pOwoKICBpZiAocGFyc2VfcmVzID09IEFBUkNI X1BBUlNFX09LKQogICAgewogICAgICBnY2NfYXNzZXJ0ICh0bXBfY3B1KTsKICAgICAgc2VsZWN0 ZWRfdHVuZSA9IHRtcF9jcHUtPmlkZW50OwogICAgICBzZWxlY3RlZF9hcmNoID0gdG1wX2NwdS0+ YXJjaDsKICAgICAgYWFyY2g2NF9zZXRfYXNtX2lzYV9mbGFncyAodG1wX2ZsYWdzKTsKICAgICAg cmV0dXJuIHRydWU7CiAgICB9CgogIHN3aXRjaCAocGFyc2VfcmVzKQogICAgewogICAgICBjYXNl IEFBUkNIX1BBUlNFX01JU1NJTkdfQVJHOgoJZXJyb3IgKCJtaXNzaW5nIG5hbWUgaW4gJTx0YXJn ZXQoXCJjcHU9XCIpJT4gcHJhZ21hIG9yIGF0dHJpYnV0ZSIpOwoJYnJlYWs7CiAgICAgIGNhc2Ug QUFSQ0hfUEFSU0VfSU5WQUxJRF9BUkc6CgllcnJvciAoImludmFsaWQgbmFtZSAlcXMgaW4gJTx0 YXJnZXQoXCJjcHU9XCIpJT4gcHJhZ21hIG9yIGF0dHJpYnV0ZSIsIHN0cik7CglhYXJjaDY0X3By aW50X2hpbnRfZm9yX2NvcmUgKHN0cik7CglicmVhazsKICAgICAgY2FzZSBBQVJDSF9QQVJTRV9J TlZBTElEX0ZFQVRVUkU6CgllcnJvciAoImludmFsaWQgZmVhdHVyZSBtb2RpZmllciAlcXMgb2Yg dmFsdWUgJXFzIGluICIKCSAgICAgICAiJTx0YXJnZXQoKSU+IHByYWdtYSBvciBhdHRyaWJ1dGUi LCBpbnZhbGlkX2V4dGVuc2lvbi5jX3N0ciAoKSwgc3RyKTsKCWFhcmNoNjRfcHJpbnRfaGludF9m b3JfZXh0ZW5zaW9ucyAoaW52YWxpZF9leHRlbnNpb24pOwoJYnJlYWs7CiAgICAgIGRlZmF1bHQ6 CglnY2NfdW5yZWFjaGFibGUgKCk7CiAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKLyogSGFuZGxl IHRoZSBhcmd1bWVudCBTVFIgdG8gdGhlIGJyYW5jaC1wcm90ZWN0aW9uPSBhdHRyaWJ1dGUuICAq LwoKIHN0YXRpYyBib29sCiBhYXJjaDY0X2hhbmRsZV9hdHRyX2JyYW5jaF9wcm90ZWN0aW9uIChj b25zdCBjaGFyKiBzdHIpCiB7CiAgY2hhciAqZXJyX3N0ciA9IChjaGFyICopIHhtYWxsb2MgKHN0 cmxlbiAoc3RyKSArIDEpOwogIGVudW0gYWFyY2hfcGFyc2Vfb3B0X3Jlc3VsdCByZXMgPSBhYXJj aF9wYXJzZV9icmFuY2hfcHJvdGVjdGlvbiAoc3RyLAoJCQkJCQkJCSAgICZlcnJfc3RyKTsKICBi b29sIHN1Y2Nlc3MgPSBmYWxzZTsKICBzd2l0Y2ggKHJlcykKICAgIHsKICAgICBjYXNlIEFBUkNI X1BBUlNFX01JU1NJTkdfQVJHOgogICAgICAgZXJyb3IgKCJtaXNzaW5nIGFyZ3VtZW50IHRvICU8 dGFyZ2V0KFwiYnJhbmNoLXByb3RlY3Rpb249XCIpJT4gcHJhZ21hIG9yIgoJICAgICAgIiBhdHRy aWJ1dGUiKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFSQ0hfUEFSU0VfSU5WQUxJRF9BUkc6 CiAgICAgICBlcnJvciAoImludmFsaWQgcHJvdGVjdGlvbiB0eXBlICVxcyBpbiAlPHRhcmdldChc ImJyYW5jaC1wcm90ZWN0aW9uIgoJICAgICAgIj1cIiklPiBwcmFnbWEgb3IgYXR0cmlidXRlIiwg ZXJyX3N0cik7CiAgICAgICBicmVhazsKICAgICBjYXNlIEFBUkNIX1BBUlNFX09LOgogICAgICAg c3VjY2VzcyA9IHRydWU7CiAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCiAgICAgY2FzZSBBQVJD SF9QQVJTRV9JTlZBTElEX0ZFQVRVUkU6CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAg ICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgfQogIGZyZWUgKGVycl9zdHIpOwogIHJldHVybiBz dWNjZXNzOwogfQoKLyogSGFuZGxlIHRoZSBhcmd1bWVudCBTVFIgdG8gdGhlIHR1bmU9IHRhcmdl dCBhdHRyaWJ1dGUuICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF9oYW5kbGVfYXR0cl90dW5lIChj b25zdCBjaGFyICpzdHIpCnsKICBjb25zdCBzdHJ1Y3QgcHJvY2Vzc29yICp0bXBfdHVuZSA9IE5V TEw7CiAgZW51bSBhYXJjaF9wYXJzZV9vcHRfcmVzdWx0IHBhcnNlX3JlcwogICAgPSBhYXJjaDY0 X3BhcnNlX3R1bmUgKHN0ciwgJnRtcF90dW5lKTsKCiAgaWYgKHBhcnNlX3JlcyA9PSBBQVJDSF9Q QVJTRV9PSykKICAgIHsKICAgICAgZ2NjX2Fzc2VydCAodG1wX3R1bmUpOwogICAgICBzZWxlY3Rl ZF90dW5lID0gdG1wX3R1bmUtPmlkZW50OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgc3dp dGNoIChwYXJzZV9yZXMpCiAgICB7CiAgICAgIGNhc2UgQUFSQ0hfUEFSU0VfSU5WQUxJRF9BUkc6 CgllcnJvciAoImludmFsaWQgbmFtZSAlcXMgaW4gJTx0YXJnZXQoXCJ0dW5lPVwiKSU+IHByYWdt YSBvciBhdHRyaWJ1dGUiLCBzdHIpOwoJYWFyY2g2NF9wcmludF9oaW50X2Zvcl9jb3JlIChzdHIp OwoJYnJlYWs7CiAgICAgIGRlZmF1bHQ6CglnY2NfdW5yZWFjaGFibGUgKCk7CiAgICB9CgogIHJl dHVybiBmYWxzZTsKfQoKLyogUGFyc2UgYW4gYXJjaGl0ZWN0dXJlIGV4dGVuc2lvbnMgdGFyZ2V0 IGF0dHJpYnV0ZSBzdHJpbmcgc3BlY2lmaWVkIGluIFNUUi4KICAgRm9yIGV4YW1wbGUgIitmcCtu b3NpbWQiLiAgU2hvdyBhbnkgZXJyb3JzIGlmIG5lZWRlZC4gIFJldHVybiBUUlVFCiAgIGlmIHN1 Y2Nlc3NmdWwuICBVcGRhdGUgYWFyY2g2NF9pc2FfZmxhZ3MgdG8gcmVmbGVjdCB0aGUgSVNBIGZl YXR1cmVzCiAgIG1vZGlmaWVkLiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfaGFuZGxlX2F0dHJf aXNhX2ZsYWdzIChjaGFyICpzdHIpCnsKICBlbnVtIGFhcmNoX3BhcnNlX29wdF9yZXN1bHQgcGFy c2VfcmVzOwogIGF1dG8gaXNhX2ZsYWdzID0gYWFyY2g2NF9hc21faXNhX2ZsYWdzOwoKICAvKiBX ZSBhbGxvdyAiK25vdGhpbmciIGluIHRoZSBiZWdpbm5pbmcgdG8gY2xlYXIgb3V0IGFsbCBhcmNo aXRlY3R1cmFsCiAgICAgZmVhdHVyZXMgaWYgdGhlIHVzZXIgd2FudHMgdG8gaGFuZHBpY2sgc3Bl Y2lmaWMgZmVhdHVyZXMuICAqLwogIGlmIChzdHJuY21wICgiK25vdGhpbmciLCBzdHIsIDgpID09 IDApCiAgICB7CiAgICAgIGlzYV9mbGFncyA9IDA7CiAgICAgIHN0ciArPSA4OwogICAgfQoKICBz dGQ6OnN0cmluZyBpbnZhbGlkX2V4dGVuc2lvbjsKICBwYXJzZV9yZXMgPSBhYXJjaDY0X3BhcnNl X2V4dGVuc2lvbiAoc3RyLCAmaXNhX2ZsYWdzLCAmaW52YWxpZF9leHRlbnNpb24pOwoKICBpZiAo cGFyc2VfcmVzID09IEFBUkNIX1BBUlNFX09LKQogICAgewogICAgICBhYXJjaDY0X3NldF9hc21f aXNhX2ZsYWdzIChpc2FfZmxhZ3MpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgc3dpdGNo IChwYXJzZV9yZXMpCiAgICB7CiAgICAgIGNhc2UgQUFSQ0hfUEFSU0VfTUlTU0lOR19BUkc6Cgll cnJvciAoIm1pc3NpbmcgdmFsdWUgaW4gJTx0YXJnZXQoKSU+IHByYWdtYSBvciBhdHRyaWJ1dGUi KTsKCWJyZWFrOwoKICAgICAgY2FzZSBBQVJDSF9QQVJTRV9JTlZBTElEX0ZFQVRVUkU6CgllcnJv ciAoImludmFsaWQgZmVhdHVyZSBtb2RpZmllciAlcXMgb2YgdmFsdWUgJXFzIGluICIKCSAgICAg ICAiJTx0YXJnZXQoKSU+IHByYWdtYSBvciBhdHRyaWJ1dGUiLCBpbnZhbGlkX2V4dGVuc2lvbi5j X3N0ciAoKSwgc3RyKTsKCWJyZWFrOwoKICAgICAgZGVmYXVsdDoKCWdjY191bnJlYWNoYWJsZSAo KTsKICAgIH0KCiByZXR1cm4gZmFsc2U7Cn0KCi8qIFRoZSB0YXJnZXQgYXR0cmlidXRlcyB0aGF0 IHdlIHN1cHBvcnQuICBPbiB0b3Agb2YgdGhlc2Ugd2UgYWxzbyBzdXBwb3J0IGp1c3QKICAgSVNB IGV4dGVuc2lvbnMsIGxpa2UgIF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCIrY3JjIikpKSwgYnV0 IHRoYXQgY2FzZSBpcwogICBoYW5kbGVkIGV4cGxpY2l0bHkgaW4gYWFyY2g2NF9wcm9jZXNzX29u ZV90YXJnZXRfYXR0ci4gICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IGFhcmNoNjRfYXR0cmlidXRl X2luZm8gYWFyY2g2NF9hdHRyaWJ1dGVzW10gPQp7CiAgeyAiZ2VuZXJhbC1yZWdzLW9ubHkiLCBh YXJjaDY0X2F0dHJfbWFzaywgZmFsc2UsIE5VTEwsCiAgICAgT1BUX21nZW5lcmFsX3JlZ3Nfb25s eSB9LAogIHsgImZpeC1jb3J0ZXgtYTUzLTgzNTc2OSIsIGFhcmNoNjRfYXR0cl9ib29sLCB0cnVl LCBOVUxMLAogICAgIE9QVF9tZml4X2NvcnRleF9hNTNfODM1NzY5IH0sCiAgeyAiZml4LWNvcnRl eC1hNTMtODQzNDE5IiwgYWFyY2g2NF9hdHRyX2Jvb2wsIHRydWUsIE5VTEwsCiAgICAgT1BUX21m aXhfY29ydGV4X2E1M184NDM0MTkgfSwKICB7ICJjbW9kZWwiLCBhYXJjaDY0X2F0dHJfZW51bSwg ZmFsc2UsIE5VTEwsIE9QVF9tY21vZGVsXyB9LAogIHsgInN0cmljdC1hbGlnbiIsIGFhcmNoNjRf YXR0cl9tYXNrLCB0cnVlLCBOVUxMLCBPUFRfbXN0cmljdF9hbGlnbiB9LAogIHsgIm9taXQtbGVh Zi1mcmFtZS1wb2ludGVyIiwgYWFyY2g2NF9hdHRyX2Jvb2wsIHRydWUsIE5VTEwsCiAgICAgT1BU X21vbWl0X2xlYWZfZnJhbWVfcG9pbnRlciB9LAogIHsgInRscy1kaWFsZWN0IiwgYWFyY2g2NF9h dHRyX2VudW0sIGZhbHNlLCBOVUxMLCBPUFRfbXRsc19kaWFsZWN0XyB9LAogIHsgImFyY2giLCBh YXJjaDY0X2F0dHJfY3VzdG9tLCBmYWxzZSwgYWFyY2g2NF9oYW5kbGVfYXR0cl9hcmNoLAogICAg IE9QVF9tYXJjaF8gfSwKICB7ICJjcHUiLCBhYXJjaDY0X2F0dHJfY3VzdG9tLCBmYWxzZSwgYWFy Y2g2NF9oYW5kbGVfYXR0cl9jcHUsIE9QVF9tY3B1XyB9LAogIHsgInR1bmUiLCBhYXJjaDY0X2F0 dHJfY3VzdG9tLCBmYWxzZSwgYWFyY2g2NF9oYW5kbGVfYXR0cl90dW5lLAogICAgIE9QVF9tdHVu ZV8gfSwKICB7ICJicmFuY2gtcHJvdGVjdGlvbiIsIGFhcmNoNjRfYXR0cl9jdXN0b20sIGZhbHNl LAogICAgIGFhcmNoNjRfaGFuZGxlX2F0dHJfYnJhbmNoX3Byb3RlY3Rpb24sIE9QVF9tYnJhbmNo X3Byb3RlY3Rpb25fIH0sCiAgeyAic2lnbi1yZXR1cm4tYWRkcmVzcyIsIGFhcmNoNjRfYXR0cl9l bnVtLCBmYWxzZSwgTlVMTCwKICAgICBPUFRfbXNpZ25fcmV0dXJuX2FkZHJlc3NfIH0sCiAgeyAi b3V0bGluZS1hdG9taWNzIiwgYWFyY2g2NF9hdHRyX2Jvb2wsIHRydWUsIE5VTEwsCiAgICAgT1BU X21vdXRsaW5lX2F0b21pY3N9LAogIHsgTlVMTCwgYWFyY2g2NF9hdHRyX2N1c3RvbSwgZmFsc2Us IE5VTEwsIE9QVF9fX18gfQp9OwoKLyogUGFyc2UgQVJHX1NUUiB3aGljaCBjb250YWlucyB0aGUg ZGVmaW5pdGlvbiBvZiBvbmUgdGFyZ2V0IGF0dHJpYnV0ZS4KICAgU2hvdyBhcHByb3ByaWF0ZSBl cnJvcnMgaWYgYW55IG9yIHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdmFsaWQuICAq LwoKc3RhdGljIGJvb2wKYWFyY2g2NF9wcm9jZXNzX29uZV90YXJnZXRfYXR0ciAoY2hhciAqYXJn X3N0cikKewogIGJvb2wgaW52ZXJ0ID0gZmFsc2U7CgogIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFy Z19zdHIpOwoKICBpZiAobGVuID09IDApCiAgICB7CiAgICAgIGVycm9yICgibWFsZm9ybWVkICU8 dGFyZ2V0KCklPiBwcmFnbWEgb3IgYXR0cmlidXRlIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAg IH0KCiAgY2hhciAqc3RyX3RvX2NoZWNrID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKICBz dHJjcHkgKHN0cl90b19jaGVjaywgYXJnX3N0cik7CgogIC8qIFdlIGhhdmUgc29tZXRoaW5nIGxp a2UgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCAoIitmcCtub3NpbWQiKSkpLgogICAgIEl0IGlzIGVh c2llciB0byBkZXRlY3QgYW5kIGhhbmRsZSBpdCBleHBsaWNpdGx5IGhlcmUgcmF0aGVyIHRoYW4g Z29pbmcKICAgICB0aHJvdWdoIHRoZSBtYWNoaW5lcnkgZm9yIHRoZSByZXN0IG9mIHRoZSB0YXJn ZXQgYXR0cmlidXRlcyBpbiB0aGlzCiAgICAgZnVuY3Rpb24uICAqLwogIGlmICgqc3RyX3RvX2No ZWNrID09ICcrJykKICAgIHJldHVybiBhYXJjaDY0X2hhbmRsZV9hdHRyX2lzYV9mbGFncyAoc3Ry X3RvX2NoZWNrKTsKCiAgaWYgKGxlbiA+IDMgJiYgc3RhcnRzd2l0aCAoc3RyX3RvX2NoZWNrLCAi bm8tIikpCiAgICB7CiAgICAgIGludmVydCA9IHRydWU7CiAgICAgIHN0cl90b19jaGVjayArPSAz OwogICAgfQogIGNoYXIgKmFyZyA9IHN0cmNociAoc3RyX3RvX2NoZWNrLCAnPScpOwoKICAvKiBJ ZiB3ZSBmb3VuZCBvcHQ9Zm9vIHRoZW4gdGVybWluYXRlIFNUUl9UT19DSEVDSyBhdCB0aGUgJz0n CiAgICAgYW5kIHBvaW50IEFSRyB0byAiZm9vIi4gICovCiAgaWYgKGFyZykKICAgIHsKICAgICAg KmFyZyA9ICdcMCc7CiAgICAgIGFyZysrOwogICAgfQogIGNvbnN0IHN0cnVjdCBhYXJjaDY0X2F0 dHJpYnV0ZV9pbmZvICpwX2F0dHI7CiAgYm9vbCBmb3VuZCA9IGZhbHNlOwogIGZvciAocF9hdHRy ID0gYWFyY2g2NF9hdHRyaWJ1dGVzOyBwX2F0dHItPm5hbWU7IHBfYXR0cisrKQogICAgewogICAg ICAvKiBJZiB0aGUgbmFtZXMgZG9uJ3QgbWF0Y2ggdXAsIG9yIHRoZSB1c2VyIGhhcyBnaXZlbiBh biBhcmd1bWVudAoJIHRvIGFuIGF0dHJpYnV0ZSB0aGF0IGRvZXNuJ3QgYWNjZXB0IG9uZSwgb3Ig ZGlkbid0IGdpdmUgYW4gYXJndW1lbnQKCSB0byBhbiBhdHRyaWJ1dGUgdGhhdCBleHBlY3RzIG9u ZSwgZmFpbCB0byBtYXRjaC4gICovCiAgICAgIGlmIChzdHJjbXAgKHN0cl90b19jaGVjaywgcF9h dHRyLT5uYW1lKSAhPSAwKQoJY29udGludWU7CgogICAgICBmb3VuZCA9IHRydWU7CiAgICAgIGJv b2wgYXR0cl9uZWVkX2FyZ19wID0gcF9hdHRyLT5hdHRyX3R5cGUgPT0gYWFyY2g2NF9hdHRyX2N1 c3RvbQoJCQkgICAgICB8fCBwX2F0dHItPmF0dHJfdHlwZSA9PSBhYXJjaDY0X2F0dHJfZW51bTsK CiAgICAgIGlmIChhdHRyX25lZWRfYXJnX3AgXiAoYXJnICE9IE5VTEwpKQoJewoJICBlcnJvciAo InByYWdtYSBvciBhdHRyaWJ1dGUgJTx0YXJnZXQoXCIlc1wiKSU+IGRvZXMgbm90IGFjY2VwdCBh biBhcmd1bWVudCIsIHN0cl90b19jaGVjayk7CgkgIHJldHVybiBmYWxzZTsKCX0KCiAgICAgIC8q IElmIHRoZSBuYW1lIG1hdGNoZXMgYnV0IHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgYWxsb3cgIm5v LSIgdmVyc2lvbnMKCSB0aGVuIHdlIGNhbid0IG1hdGNoLiAgKi8KICAgICAgaWYgKGludmVydCAm JiAhcF9hdHRyLT5hbGxvd19uZWcpCgl7CgkgIGVycm9yICgicHJhZ21hIG9yIGF0dHJpYnV0ZSAl PHRhcmdldChcIiVzXCIpJT4gZG9lcyBub3QgYWxsb3cgYSBuZWdhdGVkIGZvcm0iLCBzdHJfdG9f Y2hlY2spOwoJICByZXR1cm4gZmFsc2U7Cgl9CgogICAgICBzd2l0Y2ggKHBfYXR0ci0+YXR0cl90 eXBlKQoJewoJLyogSGFzIGEgY3VzdG9tIGhhbmRsZXIgcmVnaXN0ZXJlZC4KCSAgIEZvciBleGFt cGxlLCBjcHU9LCBhcmNoPSwgdHVuZT0uICAqLwoJICBjYXNlIGFhcmNoNjRfYXR0cl9jdXN0b206 CgkgICAgZ2NjX2Fzc2VydCAocF9hdHRyLT5oYW5kbGVyKTsKCSAgICBpZiAoIXBfYXR0ci0+aGFu ZGxlciAoYXJnKSkKCSAgICAgIHJldHVybiBmYWxzZTsKCSAgICBicmVhazsKCgkgIC8qIEVpdGhl ciBzZXQgb3IgdW5zZXQgYSBib29sZWFuIG9wdGlvbi4gICovCgkgIGNhc2UgYWFyY2g2NF9hdHRy X2Jvb2w6CgkgICAgewoJICAgICAgc3RydWN0IGNsX2RlY29kZWRfb3B0aW9uIGRlY29kZWQ7CgoJ ICAgICAgZ2VuZXJhdGVfb3B0aW9uIChwX2F0dHItPm9wdF9udW0sIE5VTEwsICFpbnZlcnQsCgkJ CSAgICAgICBDTF9UQVJHRVQsICZkZWNvZGVkKTsKCSAgICAgIGFhcmNoNjRfaGFuZGxlX29wdGlv biAoJmdsb2JhbF9vcHRpb25zLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJCQkJICAgICAgJmRlY29k ZWQsIGlucHV0X2xvY2F0aW9uKTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCSAgLyogU2V0IG9yIHVu c2V0IGEgYml0IGluIHRoZSB0YXJnZXRfZmxhZ3MuICBhYXJjaDY0X2hhbmRsZV9vcHRpb24KCSAg ICAgc2hvdWxkIGtub3cgd2hhdCBtYXNrIHRvIGFwcGx5IGdpdmVuIHRoZSBvcHRpb24gbnVtYmVy LiAgKi8KCSAgY2FzZSBhYXJjaDY0X2F0dHJfbWFzazoKCSAgICB7CgkgICAgICBzdHJ1Y3QgY2xf ZGVjb2RlZF9vcHRpb24gZGVjb2RlZDsKCSAgICAgIC8qIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5 IHRoZSBvcHRpb24gbnVtYmVyLgoJCSBhYXJjaDY0X2hhbmRsZV9vcHRpb24gd2lsbCBrbm93IHdo aWNoIG1hc2sgdG8gYXBwbHkuICAqLwoJICAgICAgZGVjb2RlZC5vcHRfaW5kZXggPSBwX2F0dHIt Pm9wdF9udW07CgkgICAgICBkZWNvZGVkLnZhbHVlID0gIWludmVydDsKCSAgICAgIGFhcmNoNjRf aGFuZGxlX29wdGlvbiAoJmdsb2JhbF9vcHRpb25zLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJCQkJ ICAgICAgJmRlY29kZWQsIGlucHV0X2xvY2F0aW9uKTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCSAg LyogVXNlIHRoZSBvcHRpb24gc2V0dGluZyBtYWNoaW5lcnkgdG8gc2V0IGFuIG9wdGlvbiB0byBh biBlbnVtLiAgKi8KCSAgY2FzZSBhYXJjaDY0X2F0dHJfZW51bToKCSAgICB7CgkgICAgICBnY2Nf YXNzZXJ0IChhcmcpOwoJICAgICAgYm9vbCB2YWxpZDsKCSAgICAgIGludCB2YWx1ZTsKCSAgICAg IHZhbGlkID0gb3B0X2VudW1fYXJnX3RvX3ZhbHVlIChwX2F0dHItPm9wdF9udW0sIGFyZywKCQkJ CQkgICAgICAmdmFsdWUsIENMX1RBUkdFVCk7CgkgICAgICBpZiAodmFsaWQpCgkJewoJCSAgc2V0 X29wdGlvbiAoJmdsb2JhbF9vcHRpb25zLCBOVUxMLCBwX2F0dHItPm9wdF9udW0sIHZhbHVlLAoJ CQkgICAgICBOVUxMLCBES19VTlNQRUNJRklFRCwgaW5wdXRfbG9jYXRpb24sCgkJCSAgICAgIGds b2JhbF9kYyk7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgIGVycm9yICgicHJhZ21hIG9yIGF0dHJp YnV0ZSAlPHRhcmdldChcIiVzPSVzXCIpJT4gaXMgbm90IHZhbGlkIiwgc3RyX3RvX2NoZWNrLCBh cmcpOwoJCX0KCSAgICAgIGJyZWFrOwoJICAgIH0KCSAgZGVmYXVsdDoKCSAgICBnY2NfdW5yZWFj aGFibGUgKCk7Cgl9CiAgICB9CgogIC8qIElmIHdlIHJlYWNoZWQgaGVyZSB3ZSBlaXRoZXIgaGF2 ZSBmb3VuZCBhbiBhdHRyaWJ1dGUgYW5kIHZhbGlkYXRlZAogICAgIGl0IG9yIGRpZG4ndCBtYXRj aCBhbnkuICBJZiB3ZSBtYXRjaGVkIGFuIGF0dHJpYnV0ZSBidXQgaXRzIGFyZ3VtZW50cwogICAg IHdlcmUgbWFsZm9ybWVkIHdlIHdpbGwgaGF2ZSByZXR1cm5lZCBmYWxzZSBhbHJlYWR5LiAgKi8K ICByZXR1cm4gZm91bmQ7Cn0KCi8qIENvdW50IGhvdyBtYW55IHRpbWVzIHRoZSBjaGFyYWN0ZXIg QyBhcHBlYXJzIGluCiAgIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgU1RSLiAgKi8KCnN0YXRpYyB1 bnNpZ25lZCBpbnQKbnVtX29jY3VyZW5jZXNfaW5fc3RyIChjaGFyIGMsIGNoYXIgKnN0cikKewog IHVuc2lnbmVkIGludCByZXMgPSAwOwogIHdoaWxlICgqc3RyICE9ICdcMCcpCiAgICB7CiAgICAg IGlmICgqc3RyID09IGMpCglyZXMrKzsKCiAgICAgIHN0cisrOwogICAgfQoKICByZXR1cm4gcmVz Owp9CgovKiBQYXJzZSB0aGUgdHJlZSBpbiBBUkdTIHRoYXQgY29udGFpbnMgdGhlIHRhcmdldCBh dHRyaWJ1dGUgaW5mb3JtYXRpb24KICAgYW5kIHVwZGF0ZSB0aGUgZ2xvYmFsIHRhcmdldCBvcHRp b25zIHNwYWNlLiAgKi8KCmJvb2wKYWFyY2g2NF9wcm9jZXNzX3RhcmdldF9hdHRyICh0cmVlIGFy Z3MpCnsKICBpZiAoVFJFRV9DT0RFIChhcmdzKSA9PSBUUkVFX0xJU1QpCiAgICB7CiAgICAgIGRv Cgl7CgkgIHRyZWUgaGVhZCA9IFRSRUVfVkFMVUUgKGFyZ3MpOwoJICBpZiAoaGVhZCkKCSAgICB7 CgkgICAgICBpZiAoIWFhcmNoNjRfcHJvY2Vzc190YXJnZXRfYXR0ciAoaGVhZCkpCgkJcmV0dXJu IGZhbHNlOwoJICAgIH0KCSAgYXJncyA9IFRSRUVfQ0hBSU4gKGFyZ3MpOwoJfSB3aGlsZSAoYXJn cyk7CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgaWYgKFRSRUVfQ09ERSAoYXJncykgIT0g U1RSSU5HX0NTVCkKICAgIHsKICAgICAgZXJyb3IgKCJhdHRyaWJ1dGUgJTx0YXJnZXQlPiBhcmd1 bWVudCBub3QgYSBzdHJpbmciKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICBzaXplX3Qg bGVuID0gc3RybGVuIChUUkVFX1NUUklOR19QT0lOVEVSIChhcmdzKSk7CiAgY2hhciAqc3RyX3Rv X2NoZWNrID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKICBzdHJjcHkgKHN0cl90b19jaGVj aywgVFJFRV9TVFJJTkdfUE9JTlRFUiAoYXJncykpOwoKICBpZiAobGVuID09IDApCiAgICB7CiAg ICAgIGVycm9yICgibWFsZm9ybWVkICU8dGFyZ2V0KCklPiBwcmFnbWEgb3IgYXR0cmlidXRlIik7 CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgLyogVXNlZCB0byBjYXRjaCBlbXB0eSBzcGFj ZXMgYmV0d2VlbiBjb21tYXMgaS5lLgogICAgIGF0dHJpYnV0ZSAoKHRhcmdldCAoImF0dHIxLCxh dHRyMiIpKSkuICAqLwogIHVuc2lnbmVkIGludCBudW1fY29tbWFzID0gbnVtX29jY3VyZW5jZXNf aW5fc3RyICgnLCcsIHN0cl90b19jaGVjayk7CgogIC8qIEhhbmRsZSBtdWx0aXBsZSB0YXJnZXQg YXR0cmlidXRlcyBzZXBhcmF0ZWQgYnkgJywnLiAgKi8KICBjaGFyICp0b2tlbiA9IHN0cnRva19y IChzdHJfdG9fY2hlY2ssICIsIiwgJnN0cl90b19jaGVjayk7CgogIHVuc2lnbmVkIGludCBudW1f YXR0cnMgPSAwOwogIHdoaWxlICh0b2tlbikKICAgIHsKICAgICAgbnVtX2F0dHJzKys7CiAgICAg IGlmICghYWFyY2g2NF9wcm9jZXNzX29uZV90YXJnZXRfYXR0ciAodG9rZW4pKQoJewoJICAvKiBD aGVjayBpZiB0b2tlbiBpcyBwb3NzaWJseSBhbiBhcmNoIGV4dGVuc2lvbiB3aXRob3V0CgkgICAg IGxlYWRpbmcgJysnLiAgKi8KCSAgYWFyY2g2NF9mZWF0dXJlX2ZsYWdzIGlzYV90ZW1wID0gMDsK CSAgYXV0byB3aXRoX3BsdXMgPSBzdGQ6OnN0cmluZyAoIisiKSArIHRva2VuOwoJICBlbnVtIGFh cmNoX3BhcnNlX29wdF9yZXN1bHQgZXh0X3JlcwoJICAgID0gYWFyY2g2NF9wYXJzZV9leHRlbnNp b24gKHdpdGhfcGx1cy5jX3N0ciAoKSwgJmlzYV90ZW1wLCBudWxscHRyKTsKCgkgIGlmIChleHRf cmVzID09IEFBUkNIX1BBUlNFX09LKQoJICAgIGVycm9yICgiYXJjaCBleHRlbnNpb24gJTwlcyU+ IHNob3VsZCBiZSBwcmVmaXhlZCBieSAlPCslPiIsCgkJICAgdG9rZW4pOwoJICBlbHNlCgkgICAg ZXJyb3IgKCJwcmFnbWEgb3IgYXR0cmlidXRlICU8dGFyZ2V0KFwiJXNcIiklPiBpcyBub3QgdmFs aWQiLCB0b2tlbik7CgkgIHJldHVybiBmYWxzZTsKCX0KCiAgICAgIHRva2VuID0gc3RydG9rX3Ig KE5VTEwsICIsIiwgJnN0cl90b19jaGVjayk7CiAgICB9CgogIGlmIChudW1fYXR0cnMgIT0gbnVt X2NvbW1hcyArIDEpCiAgICB7CiAgICAgIGVycm9yICgibWFsZm9ybWVkICU8dGFyZ2V0KFwiJXNc IiklPiBwcmFnbWEgb3IgYXR0cmlidXRlIiwgVFJFRV9TVFJJTkdfUE9JTlRFUiAoYXJncykpOwog ICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogIHJldHVybiB0cnVlOwp9CgovKiBJbXBsZW1lbnQg VEFSR0VUX09QVElPTl9WQUxJRF9BVFRSSUJVVEVfUC4gIFRoaXMgaXMgdXNlZCB0bwogICBwcm9j ZXNzIGF0dHJpYnV0ZSAoKHRhcmdldCAoIi4uLiIpKSkuICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2 NF9vcHRpb25fdmFsaWRfYXR0cmlidXRlX3AgKHRyZWUgZm5kZWNsLCB0cmVlLCB0cmVlIGFyZ3Ms IGludCkKewogIHN0cnVjdCBjbF90YXJnZXRfb3B0aW9uIGN1cl90YXJnZXQ7CiAgYm9vbCByZXQ7 CiAgdHJlZSBvbGRfb3B0aW1pemU7CiAgdHJlZSBuZXdfdGFyZ2V0LCBuZXdfb3B0aW1pemU7CiAg dHJlZSBleGlzdGluZ190YXJnZXQgPSBERUNMX0ZVTkNUSU9OX1NQRUNJRklDX1RBUkdFVCAoZm5k ZWNsKTsKCiAgLyogSWYgd2hhdCB3ZSdyZSBwcm9jZXNzaW5nIGlzIHRoZSBjdXJyZW50IHByYWdt YSBzdHJpbmcgdGhlbiB0aGUKICAgICB0YXJnZXQgb3B0aW9uIG5vZGUgaXMgYWxyZWFkeSBzdG9y ZWQgaW4gdGFyZ2V0X29wdGlvbl9jdXJyZW50X25vZGUKICAgICBieSBhYXJjaDY0X3ByYWdtYV90 YXJnZXRfcGFyc2UgaW4gYWFyY2g2NC1jLmNjLiAgVXNlIHRoYXQgdG8gYXZvaWQKICAgICBoYXZp bmcgdG8gcmUtcGFyc2UgdGhlIHN0cmluZy4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgdG8g a2VlcAogICAgIGFybV9uZW9uLmggY29tcGlsZSB0aW1lcyBkb3duIHNpbmNlIHRoYXQgaGVhZGVy IGNvbnRhaW5zIGEgbG90CiAgICAgb2YgaW50cmluc2ljcyBlbmNsb3NlZCBpbiBwcmFnbWFzLiAg Ki8KICBpZiAoIWV4aXN0aW5nX3RhcmdldCAmJiBhcmdzID09IGN1cnJlbnRfdGFyZ2V0X3ByYWdt YSkKICAgIHsKICAgICAgREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGZuZGVjbCkgPSB0 YXJnZXRfb3B0aW9uX2N1cnJlbnRfbm9kZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgdHJl ZSBmdW5jX29wdGltaXplID0gREVDTF9GVU5DVElPTl9TUEVDSUZJQ19PUFRJTUlaQVRJT04gKGZu ZGVjbCk7CgogIG9sZF9vcHRpbWl6ZQogICAgPSBidWlsZF9vcHRpbWl6YXRpb25fbm9kZSAoJmds b2JhbF9vcHRpb25zLCAmZ2xvYmFsX29wdGlvbnNfc2V0KTsKICBmdW5jX29wdGltaXplID0gREVD TF9GVU5DVElPTl9TUEVDSUZJQ19PUFRJTUlaQVRJT04gKGZuZGVjbCk7CgogIC8qIElmIHRoZSBm dW5jdGlvbiBjaGFuZ2VkIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWxzIGFzIHdlbGwgYXMgc2V0dGlu ZwogICAgIHRhcmdldCBvcHRpb25zLCBzdGFydCB3aXRoIHRoZSBvcHRpbWl6YXRpb25zIHNwZWNp ZmllZC4gICovCiAgaWYgKGZ1bmNfb3B0aW1pemUgJiYgZnVuY19vcHRpbWl6ZSAhPSBvbGRfb3B0 aW1pemUpCiAgICBjbF9vcHRpbWl6YXRpb25fcmVzdG9yZSAoJmdsb2JhbF9vcHRpb25zLCAmZ2xv YmFsX29wdGlvbnNfc2V0LAoJCQkgICAgIFRSRUVfT1BUSU1JWkFUSU9OIChmdW5jX29wdGltaXpl KSk7CgogIC8qIFNhdmUgdGhlIGN1cnJlbnQgdGFyZ2V0IG9wdGlvbnMgdG8gcmVzdG9yZSBhdCB0 aGUgZW5kLiAgKi8KICBjbF90YXJnZXRfb3B0aW9uX3NhdmUgKCZjdXJfdGFyZ2V0LCAmZ2xvYmFs X29wdGlvbnMsICZnbG9iYWxfb3B0aW9uc19zZXQpOwoKICAvKiBJZiBmbmRlY2wgYWxyZWFkeSBo YXMgc29tZSB0YXJnZXQgYXR0cmlidXRlcyBhcHBsaWVkIHRvIGl0LCB1bnBhY2sKICAgICB0aGVt IHNvIHRoYXQgd2UgYWRkIHRoaXMgYXR0cmlidXRlIG9uIHRvcCBvZiB0aGVtLCByYXRoZXIgdGhh bgogICAgIG92ZXJ3cml0aW5nIHRoZW0uICAqLwogIGlmIChleGlzdGluZ190YXJnZXQpCiAgICB7 CiAgICAgIHN0cnVjdCBjbF90YXJnZXRfb3B0aW9uICpleGlzdGluZ19vcHRpb25zCgk9IFRSRUVf VEFSR0VUX09QVElPTiAoZXhpc3RpbmdfdGFyZ2V0KTsKCiAgICAgIGlmIChleGlzdGluZ19vcHRp b25zKQoJY2xfdGFyZ2V0X29wdGlvbl9yZXN0b3JlICgmZ2xvYmFsX29wdGlvbnMsICZnbG9iYWxf b3B0aW9uc19zZXQsCgkJCQkgIGV4aXN0aW5nX29wdGlvbnMpOwogICAgfQogIGVsc2UKICAgIGNs X3RhcmdldF9vcHRpb25fcmVzdG9yZSAoJmdsb2JhbF9vcHRpb25zLCAmZ2xvYmFsX29wdGlvbnNf c2V0LAoJCQkgICAgICBUUkVFX1RBUkdFVF9PUFRJT04gKHRhcmdldF9vcHRpb25fY3VycmVudF9u b2RlKSk7CgogIHJldCA9IGFhcmNoNjRfcHJvY2Vzc190YXJnZXRfYXR0ciAoYXJncyk7CgogIC8q IFNldCB1cCBhbnkgYWRkaXRpb25hbCBzdGF0ZS4gICovCiAgaWYgKHJldCkKICAgIHsKICAgICAg YWFyY2g2NF9vdmVycmlkZV9vcHRpb25zX2ludGVybmFsICgmZ2xvYmFsX29wdGlvbnMpOwogICAg ICBuZXdfdGFyZ2V0ID0gYnVpbGRfdGFyZ2V0X29wdGlvbl9ub2RlICgmZ2xvYmFsX29wdGlvbnMs CgkJCQkJICAgICAmZ2xvYmFsX29wdGlvbnNfc2V0KTsKICAgIH0KICBlbHNlCiAgICBuZXdfdGFy Z2V0ID0gTlVMTDsKCiAgbmV3X29wdGltaXplID0gYnVpbGRfb3B0aW1pemF0aW9uX25vZGUgKCZn bG9iYWxfb3B0aW9ucywKCQkJCQkgICZnbG9iYWxfb3B0aW9uc19zZXQpOwoKICBpZiAoZm5kZWNs ICYmIHJldCkKICAgIHsKICAgICAgREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGZuZGVj bCkgPSBuZXdfdGFyZ2V0OwoKICAgICAgaWYgKG9sZF9vcHRpbWl6ZSAhPSBuZXdfb3B0aW1pemUp CglERUNMX0ZVTkNUSU9OX1NQRUNJRklDX09QVElNSVpBVElPTiAoZm5kZWNsKSA9IG5ld19vcHRp bWl6ZTsKICAgIH0KCiAgY2xfdGFyZ2V0X29wdGlvbl9yZXN0b3JlICgmZ2xvYmFsX29wdGlvbnMs ICZnbG9iYWxfb3B0aW9uc19zZXQsICZjdXJfdGFyZ2V0KTsKCiAgaWYgKG9sZF9vcHRpbWl6ZSAh PSBuZXdfb3B0aW1pemUpCiAgICBjbF9vcHRpbWl6YXRpb25fcmVzdG9yZSAoJmdsb2JhbF9vcHRp b25zLCAmZ2xvYmFsX29wdGlvbnNfc2V0LAoJCQkgICAgIFRSRUVfT1BUSU1JWkFUSU9OIChvbGRf b3B0aW1pemUpKTsKICByZXR1cm4gcmV0Owp9CgovKiBIZWxwZXIgZm9yIGFhcmNoNjRfY2FuX2lu bGluZV9wLiAgSW4gdGhlIGNhc2Ugd2hlcmUgQ0FMTEVSIGFuZCBDQUxMRUUgYXJlCiAgIHRyaS1i b29sIG9wdGlvbnMgKHllcywgbm8sIGRvbid0IGNhcmUpIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBp cwogICBERUYsIGRldGVybWluZSB3aGV0aGVyIHRvIHJlamVjdCBpbmxpbmluZy4gICovCgpzdGF0 aWMgYm9vbAphYXJjaDY0X3RyaWJvb2xzX29rX2Zvcl9pbmxpbmluZ19wIChpbnQgY2FsbGVyLCBp bnQgY2FsbGVlLAoJCQkJICAgICBpbnQgZG9udF9jYXJlLCBpbnQgZGVmKQp7CiAgLyogSWYgdGhl IGNhbGxlZSBkb2Vzbid0IGNhcmUsIGFsd2F5cyBhbGxvdyBpbmxpbmluZy4gICovCiAgaWYgKGNh bGxlZSA9PSBkb250X2NhcmUpCiAgICByZXR1cm4gdHJ1ZTsKCiAgLyogSWYgdGhlIGNhbGxlciBk b2Vzbid0IGNhcmUsIGFsd2F5cyBhbGxvdyBpbmxpbmluZy4gICovCiAgaWYgKGNhbGxlciA9PSBk b250X2NhcmUpCiAgICByZXR1cm4gdHJ1ZTsKCiAgLyogT3RoZXJ3aXNlLCBhbGxvdyBpbmxpbmlu ZyBpZiBlaXRoZXIgdGhlIGNhbGxlZSBhbmQgY2FsbGVyIHZhbHVlcwogICAgIGFncmVlLCBvciBp ZiB0aGUgY2FsbGVlIGlzIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KICByZXR1cm4gKGNh bGxlZSA9PSBjYWxsZXIgfHwgY2FsbGVlID09IGRlZik7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRf Q0FOX0lOTElORV9QLiAgRGVjaWRlIHdoZXRoZXIgaXQgaXMgdmFsaWQKICAgdG8gaW5saW5lIENB TExFRSBpbnRvIENBTExFUiBiYXNlZCBvbiB0YXJnZXQtc3BlY2lmaWMgaW5mby4KICAgTWFrZSBz dXJlIHRoYXQgdGhlIGNhbGxlciBhbmQgY2FsbGVlIGhhdmUgY29tcGF0aWJsZSBhcmNoaXRlY3R1 cmFsCiAgIGZlYXR1cmVzLiAgVGhlbiBnbyB0aHJvdWdoIHRoZSBvdGhlciBwb3NzaWJsZSB0YXJn ZXQgYXR0cmlidXRlcwogICBhbmQgc2VlIGlmIHRoZXkgY2FuIGJsb2NrIGlubGluaW5nLiAgVHJ5 IG5vdCB0byByZWplY3QgYWx3YXlzX2lubGluZQogICBjYWxsZWVzIHVubGVzcyB0aGV5IGFyZSBp bmNvbXBhdGlibGUgYXJjaGl0ZWN0dXJhbGx5LiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfY2Fu X2lubGluZV9wICh0cmVlIGNhbGxlciwgdHJlZSBjYWxsZWUpCnsKICB0cmVlIGNhbGxlcl90cmVl ID0gREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGNhbGxlcik7CiAgdHJlZSBjYWxsZWVf dHJlZSA9IERFQ0xfRlVOQ1RJT05fU1BFQ0lGSUNfVEFSR0VUIChjYWxsZWUpOwoKICBzdHJ1Y3Qg Y2xfdGFyZ2V0X29wdGlvbiAqY2FsbGVyX29wdHMKCT0gVFJFRV9UQVJHRVRfT1BUSU9OIChjYWxs ZXJfdHJlZSA/IGNhbGxlcl90cmVlCgkJCQkJICAgOiB0YXJnZXRfb3B0aW9uX2RlZmF1bHRfbm9k ZSk7CgogIHN0cnVjdCBjbF90YXJnZXRfb3B0aW9uICpjYWxsZWVfb3B0cwoJPSBUUkVFX1RBUkdF VF9PUFRJT04gKGNhbGxlZV90cmVlID8gY2FsbGVlX3RyZWUKCQkJCQkgICA6IHRhcmdldF9vcHRp b25fZGVmYXVsdF9ub2RlKTsKCiAgLyogQ2FsbGVlJ3MgSVNBIGZsYWdzIHNob3VsZCBiZSBhIHN1 YnNldCBvZiB0aGUgY2FsbGVyJ3MuICAqLwogIGlmICgoY2FsbGVyX29wdHMtPnhfYWFyY2g2NF9h c21faXNhX2ZsYWdzCiAgICAgICAmIGNhbGxlZV9vcHRzLT54X2FhcmNoNjRfYXNtX2lzYV9mbGFn cykKICAgICAgIT0gY2FsbGVlX29wdHMtPnhfYWFyY2g2NF9hc21faXNhX2ZsYWdzKQogICAgcmV0 dXJuIGZhbHNlOwogIGlmICgoY2FsbGVyX29wdHMtPnhfYWFyY2g2NF9pc2FfZmxhZ3MgJiBjYWxs ZWVfb3B0cy0+eF9hYXJjaDY0X2lzYV9mbGFncykKICAgICAgIT0gY2FsbGVlX29wdHMtPnhfYWFy Y2g2NF9pc2FfZmxhZ3MpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIEFsbG93IG5vbi1zdHJpY3Qg YWxpZ25lZCBmdW5jdGlvbnMgaW5saW5pbmcgaW50byBzdHJpY3QKICAgICBhbGlnbmVkIG9uZXMu ICAqLwogIGlmICgoVEFSR0VUX1NUUklDVF9BTElHTl9QIChjYWxsZXJfb3B0cy0+eF90YXJnZXRf ZmxhZ3MpCiAgICAgICAhPSBUQVJHRVRfU1RSSUNUX0FMSUdOX1AgKGNhbGxlZV9vcHRzLT54X3Rh cmdldF9mbGFncykpCiAgICAgICYmICEoIVRBUkdFVF9TVFJJQ1RfQUxJR05fUCAoY2FsbGVlX29w dHMtPnhfdGFyZ2V0X2ZsYWdzKQoJICAgJiYgVEFSR0VUX1NUUklDVF9BTElHTl9QIChjYWxsZXJf b3B0cy0+eF90YXJnZXRfZmxhZ3MpKSkKICAgIHJldHVybiBmYWxzZTsKCiAgYm9vbCBhbHdheXNf aW5saW5lID0gbG9va3VwX2F0dHJpYnV0ZSAoImFsd2F5c19pbmxpbmUiLAoJCQkJCSAgREVDTF9B VFRSSUJVVEVTIChjYWxsZWUpKTsKCiAgLyogSWYgdGhlIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMg bWF0Y2ggdXAgYW5kIHRoZSBjYWxsZWUgaXMgYWx3YXlzX2lubGluZQogICAgIHRoZW4gdGhlIG90 aGVyIGF0dHJpYnV0ZXMgZG9uJ3QgbWF0dGVyLiAgKi8KICBpZiAoYWx3YXlzX2lubGluZSkKICAg IHJldHVybiB0cnVlOwoKICBpZiAoY2FsbGVyX29wdHMtPnhfYWFyY2g2NF9jbW9kZWxfdmFyCiAg ICAgICE9IGNhbGxlZV9vcHRzLT54X2FhcmNoNjRfY21vZGVsX3ZhcikKICAgIHJldHVybiBmYWxz ZTsKCiAgaWYgKGNhbGxlcl9vcHRzLT54X2FhcmNoNjRfdGxzX2RpYWxlY3QKICAgICAgIT0gY2Fs bGVlX29wdHMtPnhfYWFyY2g2NF90bHNfZGlhbGVjdCkKICAgIHJldHVybiBmYWxzZTsKCiAgLyog SG9ub3VyIGV4cGxpY2l0IHJlcXVlc3RzIHRvIHdvcmthcm91bmQgZXJyYXRhLiAgKi8KICBpZiAo IWFhcmNoNjRfdHJpYm9vbHNfb2tfZm9yX2lubGluaW5nX3AgKAoJICBjYWxsZXJfb3B0cy0+eF9h YXJjaDY0X2ZpeF9hNTNfZXJyODM1NzY5LAoJICBjYWxsZWVfb3B0cy0+eF9hYXJjaDY0X2ZpeF9h NTNfZXJyODM1NzY5LAoJICAyLCBUQVJHRVRfRklYX0VSUl9BNTNfODM1NzY5X0RFRkFVTFQpKQog ICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoIWFhcmNoNjRfdHJpYm9vbHNfb2tfZm9yX2lubGluaW5n X3AgKAoJICBjYWxsZXJfb3B0cy0+eF9hYXJjaDY0X2ZpeF9hNTNfZXJyODQzNDE5LAoJICBjYWxs ZWVfb3B0cy0+eF9hYXJjaDY0X2ZpeF9hNTNfZXJyODQzNDE5LAoJICAyLCBUQVJHRVRfRklYX0VS Ul9BNTNfODQzNDE5KSkKICAgIHJldHVybiBmYWxzZTsKCiAgLyogSWYgdGhlIHVzZXIgZXhwbGlj aXRseSBzcGVjaWZpZWQgLW1vbWl0LWxlYWYtZnJhbWUtcG9pbnRlciBmb3IgdGhlCiAgICAgY2Fs bGVyIGFuZCBjYWxsZSBhbmQgdGhleSBkb24ndCBtYXRjaCB1cCwgcmVqZWN0IGlubGluaW5nLiAg Ki8KICBpZiAoIWFhcmNoNjRfdHJpYm9vbHNfb2tfZm9yX2lubGluaW5nX3AgKAoJICBjYWxsZXJf b3B0cy0+eF9mbGFnX29taXRfbGVhZl9mcmFtZV9wb2ludGVyLAoJICBjYWxsZWVfb3B0cy0+eF9m bGFnX29taXRfbGVhZl9mcmFtZV9wb2ludGVyLAoJICAyLCAxKSkKICAgIHJldHVybiBmYWxzZTsK CiAgLyogSWYgdGhlIGNhbGxlZSBoYXMgc3BlY2lmaWMgdHVuaW5nIG92ZXJyaWRlcywgcmVzcGVj dCB0aGVtLiAgKi8KICBpZiAoY2FsbGVlX29wdHMtPnhfYWFyY2g2NF9vdmVycmlkZV90dW5lX3N0 cmluZyAhPSBOVUxMCiAgICAgICYmIGNhbGxlcl9vcHRzLT54X2FhcmNoNjRfb3ZlcnJpZGVfdHVu ZV9zdHJpbmcgPT0gTlVMTCkKICAgIHJldHVybiBmYWxzZTsKCiAgLyogSWYgdGhlIHVzZXIgc3Bl Y2lmaWVkIHR1bmluZyBvdmVycmlkZSBzdHJpbmdzIGZvciB0aGUKICAgICBjYWxsZXIgYW5kIGNh bGxlZSBhbmQgdGhleSBkb24ndCBtYXRjaCB1cCwgcmVqZWN0IGlubGluaW5nLgogICAgIFdlIGp1 c3QgZG8gYSBzdHJpbmcgY29tcGFyZSBoZXJlLCB3ZSBkb24ndCBhbmFseXplIHRoZSBtZWFuaW5n CiAgICAgb2YgdGhlIHN0cmluZywgYXMgaXQgd291bGQgYmUgdG9vIGNvc3RseSBmb3IgbGl0dGxl IGdhaW4uICAqLwogIGlmIChjYWxsZWVfb3B0cy0+eF9hYXJjaDY0X292ZXJyaWRlX3R1bmVfc3Ry aW5nCiAgICAgICYmIGNhbGxlcl9vcHRzLT54X2FhcmNoNjRfb3ZlcnJpZGVfdHVuZV9zdHJpbmcK ICAgICAgJiYgKHN0cmNtcCAoY2FsbGVlX29wdHMtPnhfYWFyY2g2NF9vdmVycmlkZV90dW5lX3N0 cmluZywKCQkgIGNhbGxlcl9vcHRzLT54X2FhcmNoNjRfb3ZlcnJpZGVfdHVuZV9zdHJpbmcpICE9 IDApKQogICAgcmV0dXJuIGZhbHNlOwoKICByZXR1cm4gdHJ1ZTsKfQoKLyogUmV0dXJuIHRoZSBJ RCBvZiB0aGUgVExERVNDIEFCSSwgaW5pdGlhbGl6aW5nIHRoZSBkZXNjcmlwdG9yIGlmIGhhc24n dAogICBiZWVuIGFscmVhZHkuICAqLwoKdW5zaWduZWQgaW50CmFhcmNoNjRfdGxzZGVzY19hYmlf aWQgKCkKewogIHByZWRlZmluZWRfZnVuY3Rpb25fYWJpICZ0bHNkZXNjX2FiaSA9IGZ1bmN0aW9u X2FiaXNbQVJNX1BDU19UTFNERVNDXTsKICBpZiAoIXRsc2Rlc2NfYWJpLmluaXRpYWxpemVkX3Ag KCkpCiAgICB7CiAgICAgIEhBUkRfUkVHX1NFVCBmdWxsX3JlZ19jbG9iYmVyczsKICAgICAgQ0xF QVJfSEFSRF9SRUdfU0VUIChmdWxsX3JlZ19jbG9iYmVycyk7CiAgICAgIFNFVF9IQVJEX1JFR19C SVQgKGZ1bGxfcmVnX2Nsb2JiZXJzLCBSMF9SRUdOVU0pOwogICAgICBTRVRfSEFSRF9SRUdfQklU IChmdWxsX3JlZ19jbG9iYmVycywgQ0NfUkVHTlVNKTsKICAgICAgZm9yIChpbnQgcmVnbm8gPSBQ MF9SRUdOVU07IHJlZ25vIDw9IFAxNV9SRUdOVU07ICsrcmVnbm8pCglTRVRfSEFSRF9SRUdfQklU IChmdWxsX3JlZ19jbG9iYmVycywgcmVnbm8pOwogICAgICB0bHNkZXNjX2FiaS5pbml0aWFsaXpl IChBUk1fUENTX1RMU0RFU0MsIGZ1bGxfcmVnX2Nsb2JiZXJzKTsKICAgIH0KICByZXR1cm4gdGxz ZGVzY19hYmkuaWQgKCk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIFNZTUJPTF9SRUYgWCBiaW5kcyBs b2NhbGx5LiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfc3ltYm9sX2JpbmRzX2xvY2FsX3AgKGNv bnN0X3J0eCB4KQp7CiAgcmV0dXJuIChTWU1CT0xfUkVGX0RFQ0wgKHgpCgkgID8gdGFyZ2V0bS5i aW5kc19sb2NhbF9wIChTWU1CT0xfUkVGX0RFQ0wgKHgpKQoJICA6IFNZTUJPTF9SRUZfTE9DQUxf UCAoeCkpOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBTWU1CT0xfUkVGIFggaXMgdGhyZWFkIGxvY2Fs ICovCnN0YXRpYyBib29sCmFhcmNoNjRfdGxzX3N5bWJvbF9wIChydHggeCkKewogIGlmICghIFRB UkdFVF9IQVZFX1RMUykKICAgIHJldHVybiBmYWxzZTsKCiAgeCA9IHN0cmlwX3NhbHQgKHgpOwog IGlmICghU1lNQk9MX1JFRl9QICh4KSkKICAgIHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIFNZTUJP TF9SRUZfVExTX01PREVMICh4KSAhPSAwOwp9CgovKiBDbGFzc2lmeSBhIFRMUyBzeW1ib2wgaW50 byBvbmUgb2YgdGhlIFRMUyBraW5kcy4gICovCmVudW0gYWFyY2g2NF9zeW1ib2xfdHlwZQphYXJj aDY0X2NsYXNzaWZ5X3Rsc19zeW1ib2wgKHJ0eCB4KQp7CiAgZW51bSB0bHNfbW9kZWwgdGxzX2tp bmQgPSB0bHNfc3ltYm9saWNfb3BlcmFuZF90eXBlICh4KTsKCiAgc3dpdGNoICh0bHNfa2luZCkK ICAgIHsKICAgIGNhc2UgVExTX01PREVMX0dMT0JBTF9EWU5BTUlDOgogICAgY2FzZSBUTFNfTU9E RUxfTE9DQUxfRFlOQU1JQzoKICAgICAgcmV0dXJuIFRBUkdFVF9UTFNfREVTQyA/IFNZTUJPTF9T TUFMTF9UTFNERVNDIDogU1lNQk9MX1NNQUxMX1RMU0dEOwoKICAgIGNhc2UgVExTX01PREVMX0lO SVRJQUxfRVhFQzoKICAgICAgc3dpdGNoIChhYXJjaDY0X2Ntb2RlbCkKCXsKCWNhc2UgQUFSQ0g2 NF9DTU9ERUxfVElOWToKCWNhc2UgQUFSQ0g2NF9DTU9ERUxfVElOWV9QSUM6CgkgIHJldHVybiBT WU1CT0xfVElOWV9UTFNJRTsKCWRlZmF1bHQ6CgkgIHJldHVybiBTWU1CT0xfU01BTExfVExTSUU7 Cgl9CgogICAgY2FzZSBUTFNfTU9ERUxfTE9DQUxfRVhFQzoKICAgICAgaWYgKGFhcmNoNjRfdGxz X3NpemUgPT0gMTIpCglyZXR1cm4gU1lNQk9MX1RMU0xFMTI7CiAgICAgIGVsc2UgaWYgKGFhcmNo NjRfdGxzX3NpemUgPT0gMjQpCglyZXR1cm4gU1lNQk9MX1RMU0xFMjQ7CiAgICAgIGVsc2UgaWYg KGFhcmNoNjRfdGxzX3NpemUgPT0gMzIpCglyZXR1cm4gU1lNQk9MX1RMU0xFMzI7CiAgICAgIGVs c2UgaWYgKGFhcmNoNjRfdGxzX3NpemUgPT0gNDgpCglyZXR1cm4gU1lNQk9MX1RMU0xFNDg7CiAg ICAgIGVsc2UKCWdjY191bnJlYWNoYWJsZSAoKTsKCiAgICBjYXNlIFRMU19NT0RFTF9FTVVMQVRF RDoKICAgIGNhc2UgVExTX01PREVMX05PTkU6CiAgICAgIHJldHVybiBTWU1CT0xfRk9SQ0VfVE9f TUVNOwoKICAgIGRlZmF1bHQ6CiAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsKICAgIH0KfQoKLyog UmV0dXJuIHRoZSBjb3JyZWN0IG1ldGhvZCBmb3IgYWNjZXNzaW5nIFggKyBPRkZTRVQsIHdoZXJl IFggaXMgZWl0aGVyCiAgIGEgU1lNQk9MX1JFRiBvciBMQUJFTF9SRUYuICAqLwoKZW51bSBhYXJj aDY0X3N5bWJvbF90eXBlCmFhcmNoNjRfY2xhc3NpZnlfc3ltYm9sIChydHggeCwgSE9TVF9XSURF X0lOVCBvZmZzZXQpCnsKICB4ID0gc3RyaXBfc2FsdCAoeCk7CgogIGlmIChMQUJFTF9SRUZfUCAo eCkpCiAgICB7CiAgICAgIHN3aXRjaCAoYWFyY2g2NF9jbW9kZWwpCgl7CgljYXNlIEFBUkNINjRf Q01PREVMX0xBUkdFOgoJICByZXR1cm4gU1lNQk9MX0ZPUkNFX1RPX01FTTsKCgljYXNlIEFBUkNI NjRfQ01PREVMX1RJTllfUElDOgoJY2FzZSBBQVJDSDY0X0NNT0RFTF9USU5ZOgoJICByZXR1cm4g U1lNQk9MX1RJTllfQUJTT0xVVEU7CgoJY2FzZSBBQVJDSDY0X0NNT0RFTF9TTUFMTF9TUElDOgoJ Y2FzZSBBQVJDSDY0X0NNT0RFTF9TTUFMTF9QSUM6CgljYXNlIEFBUkNINjRfQ01PREVMX1NNQUxM OgoJICByZXR1cm4gU1lNQk9MX1NNQUxMX0FCU09MVVRFOwoKCWRlZmF1bHQ6CgkgIGdjY191bnJl YWNoYWJsZSAoKTsKCX0KICAgIH0KCiAgaWYgKFNZTUJPTF9SRUZfUCAoeCkpCiAgICB7CiAgICAg IGlmIChhYXJjaDY0X3Rsc19zeW1ib2xfcCAoeCkpCglyZXR1cm4gYWFyY2g2NF9jbGFzc2lmeV90 bHNfc3ltYm9sICh4KTsKCiAgICAgIHN3aXRjaCAoYWFyY2g2NF9jbW9kZWwpCgl7CgljYXNlIEFB UkNINjRfQ01PREVMX1RJTllfUElDOgoJY2FzZSBBQVJDSDY0X0NNT0RFTF9USU5ZOgoJICAvKiBX aXRoIC1mUElDIG5vbi1sb2NhbCBzeW1ib2xzIHVzZSB0aGUgR09ULiAgRm9yIG9ydGhvZ29uYWxp dHkKCSAgICAgYWx3YXlzIHVzZSB0aGUgR09UIGZvciBleHRlcm4gd2VhayBzeW1ib2xzLiAgKi8K CSAgaWYgKChmbGFnX3BpYyB8fCBTWU1CT0xfUkVGX1dFQUsgKHgpKQoJICAgICAgJiYgIWFhcmNo NjRfc3ltYm9sX2JpbmRzX2xvY2FsX3AgKHgpKQoJICAgIHJldHVybiBTWU1CT0xfVElOWV9HT1Q7 CgoJICAvKiBXaGVuIHdlIHJldHJpZXZlIHN5bWJvbCArIG9mZnNldCBhZGRyZXNzLCB3ZSBoYXZl IHRvIG1ha2Ugc3VyZQoJICAgICB0aGUgb2Zmc2V0IGRvZXMgbm90IGNhdXNlIG92ZXJmbG93IG9m IHRoZSBmaW5hbCBhZGRyZXNzLiAgQnV0CgkgICAgIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcg dGhlIGFkZHJlc3Mgb2Ygc3ltYm9sIGF0IGNvbXBpbGUgdGltZQoJICAgICBzbyB3ZSBjYW4ndCBh Y2N1cmF0ZWx5IHNheSBpZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgUEMgYW5kCgkgICAgIHN5 bWJvbCArIG9mZnNldCBpcyBvdXRzaWRlIHRoZSBhZGRyZXNzaWJsZSByYW5nZSBvZiArLy0xTUIg aW4gdGhlCgkgICAgIFRJTlkgY29kZSBtb2RlbC4gIFNvIHdlIGxpbWl0IHRoZSBtYXhpbXVtIG9m ZnNldCB0byArLy02NEtCIGFuZAoJICAgICBhc3N1bWUgdGhlIG9mZnNldCB0byB0aGUgc3ltYm9s IGlzIG5vdCBsYXJnZXIgdGhhbiArLy0oMU1CIC0gNjRLQikuCgkgICAgIElmIG9mZnNldF93aXRo aW5fYmxvY2tfcCBpcyB0cnVlIHdlIGFsbG93IGxhcmdlciBvZmZzZXRzLiAgKi8KCSAgaWYgKCEo SU5fUkFOR0UgKG9mZnNldCwgLTB4MTAwMDAsIDB4MTAwMDApCgkJfHwgb2Zmc2V0X3dpdGhpbl9i bG9ja19wICh4LCBvZmZzZXQpKSkKCSAgICByZXR1cm4gU1lNQk9MX0ZPUkNFX1RPX01FTTsKCgkg IHJldHVybiBTWU1CT0xfVElOWV9BQlNPTFVURTsKCgoJY2FzZSBBQVJDSDY0X0NNT0RFTF9TTUFM TF9TUElDOgoJY2FzZSBBQVJDSDY0X0NNT0RFTF9TTUFMTF9QSUM6CgljYXNlIEFBUkNINjRfQ01P REVMX1NNQUxMOgoJICBpZiAoKGZsYWdfcGljIHx8IFNZTUJPTF9SRUZfV0VBSyAoeCkpCgkgICAg ICAmJiAhYWFyY2g2NF9zeW1ib2xfYmluZHNfbG9jYWxfcCAoeCkpCgkgICAgcmV0dXJuIGFhcmNo NjRfY21vZGVsID09IEFBUkNINjRfQ01PREVMX1NNQUxMX1NQSUMKCQkgICAgPyBTWU1CT0xfU01B TExfR09UXzI4SyA6IFNZTUJPTF9TTUFMTF9HT1RfNEc7CgoJICAvKiBTYW1lIHJlYXNvbmluZyBh cyB0aGUgdGlueSBjb2RlIG1vZGVsLCBidXQgdGhlIG9mZnNldCBjYXAgaGVyZSBpcwoJICAgICAx TUIsIGFsbG93aW5nICsvLTMuOUdCIGZvciB0aGUgb2Zmc2V0IHRvIHRoZSBzeW1ib2wuICAqLwoJ ICBpZiAoIShJTl9SQU5HRSAob2Zmc2V0LCAtMHgxMDAwMDAsIDB4MTAwMDAwKQoJCXx8IG9mZnNl dF93aXRoaW5fYmxvY2tfcCAoeCwgb2Zmc2V0KSkpCgkgICAgcmV0dXJuIFNZTUJPTF9GT1JDRV9U T19NRU07CgoJICByZXR1cm4gU1lNQk9MX1NNQUxMX0FCU09MVVRFOwoKCWNhc2UgQUFSQ0g2NF9D TU9ERUxfTEFSR0U6CgkgIC8qIFRoaXMgaXMgYWxyaWdodCBldmVuIGluIFBJQyBjb2RlIGFzIHRo ZSBjb25zdGFudAoJICAgICBwb29sIHJlZmVyZW5jZSBpcyBhbHdheXMgUEMgcmVsYXRpdmUgYW5k IHdpdGhpbgoJICAgICB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0LiAgKi8KCSAgaWYgKCFhYXJj aDY0X3BjcmVsYXRpdmVfbGl0ZXJhbF9sb2FkcyAmJiBDT05TVEFOVF9QT09MX0FERFJFU1NfUCAo eCkpCgkgICAgcmV0dXJuIFNZTUJPTF9TTUFMTF9BQlNPTFVURTsKCSAgZWxzZQoJICAgIHJldHVy biBTWU1CT0xfRk9SQ0VfVE9fTUVNOwoKCWRlZmF1bHQ6CgkgIGdjY191bnJlYWNoYWJsZSAoKTsK CX0KICAgIH0KCiAgLyogQnkgZGVmYXVsdCBwdXNoIGV2ZXJ5dGhpbmcgaW50byB0aGUgY29uc3Rh bnQgcG9vbC4gICovCiAgcmV0dXJuIFNZTUJPTF9GT1JDRV9UT19NRU07Cn0KCmJvb2wKYWFyY2g2 NF9jb25zdGFudF9hZGRyZXNzX3AgKHJ0eCB4KQp7CiAgcmV0dXJuIChDT05TVEFOVF9QICh4KSAm JiBtZW1vcnlfYWRkcmVzc19wIChESW1vZGUsIHgpKTsKfQoKYm9vbAphYXJjaDY0X2xlZ2l0aW1h dGVfcGljX29wZXJhbmRfcCAocnR4IHgpCnsKICBwb2x5X2ludDY0IG9mZnNldDsKICB4ID0gc3Ry aXBfb2Zmc2V0X2FuZF9zYWx0ICh4LCAmb2Zmc2V0KTsKICBpZiAoU1lNQk9MX1JFRl9QICh4KSkK ICAgIHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIHRydWU7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRf TEVHSVRJTUFURV9DT05TVEFOVF9QIGhvb2suICBSZXR1cm4gdHJ1ZSBmb3IgY29uc3RhbnRzCiAg IHRoYXQgc2hvdWxkIGJlIHJlbWF0ZXJpYWxpemVkIHJhdGhlciB0aGFuIHNwaWxsZWQuICAqLwoK c3RhdGljIGJvb2wKYWFyY2g2NF9sZWdpdGltYXRlX2NvbnN0YW50X3AgKG1hY2hpbmVfbW9kZSBt b2RlLCBydHggeCkKewogIC8qIFN1cHBvcnQgQ1NFIGFuZCByZW1hdGVyaWFsaXphdGlvbiBvZiBj b21tb24gY29uc3RhbnRzLiAgKi8KICBpZiAoQ09OU1RfSU5UX1AgKHgpCiAgICAgIHx8IENPTlNU X0RPVUJMRV9QICh4KSkKICAgIHJldHVybiB0cnVlOwoKICAvKiBPbmx5IGFjY2VwdCB2YXJpYWJs ZS1sZW5ndGggdmVjdG9yIGNvbnN0YW50cyBpZiB0aGV5IGNhbiBiZQogICAgIGhhbmRsZWQgZGly ZWN0bHkuCgogICAgID8/PyBJdCB3b3VsZCBiZSBwb3NzaWJsZSAoYnV0IGNvbXBsZXgpIHRvIGhh bmRsZSByZW1hdGVyaWFsaXphdGlvbgogICAgIG9mIG90aGVyIGNvbnN0YW50cyB2aWEgc2Vjb25k YXJ5IHJlbG9hZHMuICAqLwogIGlmICghR0VUX01PREVfU0laRSAobW9kZSkuaXNfY29uc3RhbnQg KCkpCiAgICByZXR1cm4gYWFyY2g2NF9zaW1kX3ZhbGlkX2ltbWVkaWF0ZSAoeCwgTlVMTCk7Cgog IC8qIE90aGVyd2lzZSwgYWNjZXB0IGFueSBDT05TVF9WRUNUT1IgdGhhdCwgaWYgYWxsIGVsc2Ug ZmFpbHMsIGNhbiBhdAogICAgIGxlYXN0IGJlIGZvcmNlZCB0byBtZW1vcnkgYW5kIGxvYWRlZCBm cm9tIHRoZXJlLiAgKi8KICBpZiAoQ09OU1RfVkVDVE9SX1AgKHgpKQogICAgcmV0dXJuICF0YXJn ZXRtLmNhbm5vdF9mb3JjZV9jb25zdF9tZW0gKG1vZGUsIHgpOwoKICAvKiBEbyBub3QgYWxsb3cg dmVjdG9yIHN0cnVjdCBtb2RlIGNvbnN0YW50cyBmb3IgQWR2YW5jZWQgU0lNRC4KICAgICBXZSBj b3VsZCBzdXBwb3J0IDAgYW5kIC0xIGVhc2lseSwgYnV0IHRoZXkgbmVlZCBzdXBwb3J0IGluCiAg ICAgYWFyY2g2NC1zaW1kLm1kLiAgKi8KICB1bnNpZ25lZCBpbnQgdmVjX2ZsYWdzID0gYWFyY2g2 NF9jbGFzc2lmeV92ZWN0b3JfbW9kZSAobW9kZSk7CiAgaWYgKHZlY19mbGFncyA9PSAoVkVDX0FE VlNJTUQgfCBWRUNfU1RSVUNUKSkKICAgIHJldHVybiBmYWxzZTsKCiAgaWYgKEdFVF9DT0RFICh4 KSA9PSBISUdIKQogICAgeCA9IFhFWFAgKHgsIDApOwoKICAvKiBBY2NlcHQgcG9seW5vbWlhbCBj b25zdGFudHMgdGhhdCBjYW4gYmUgY2FsY3VsYXRlZCBieSB1c2luZyB0aGUKICAgICBkZXN0aW5h dGlvbiBvZiBhIG1vdmUgYXMgdGhlIHNvbGUgdGVtcG9yYXJ5LiAgQ29uc3RhbnRzIHRoYXQKICAg ICByZXF1aXJlIGEgc2Vjb25kIHRlbXBvcmFyeSBjYW5ub3QgYmUgcmVtYXRlcmlhbGl6ZWQgKHRo ZXkgY2FuJ3QgYmUKICAgICBmb3JjZWQgdG8gbWVtb3J5IGFuZCBhbHNvIGFyZW4ndCBsZWdpdGlt YXRlIGNvbnN0YW50cykuICAqLwogIHBvbHlfaW50NjQgb2Zmc2V0OwogIGlmIChwb2x5X2ludF9y dHhfcCAoeCwgJm9mZnNldCkpCiAgICByZXR1cm4gYWFyY2g2NF9vZmZzZXRfdGVtcG9yYXJpZXMg KGZhbHNlLCBvZmZzZXQpIDw9IDE7CgogIC8qIElmIGFuIG9mZnNldCBpcyBiZWluZyBhZGRlZCB0 byBzb21ldGhpbmcgZWxzZSwgd2UgbmVlZCB0byBhbGxvdyB0aGUKICAgICBiYXNlIHRvIGJlIG1v dmVkIGludG8gdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLCBtZWFuaW5nIHRoYXQgdGhlcmUKICAg ICBhcmUgbm8gZnJlZSB0ZW1wb3JhcmllcyBmb3IgdGhlIG9mZnNldC4gICovCiAgeCA9IHN0cmlw X29mZnNldF9hbmRfc2FsdCAoeCwgJm9mZnNldCk7CiAgaWYgKCFvZmZzZXQuaXNfY29uc3RhbnQg KCkgJiYgYWFyY2g2NF9vZmZzZXRfdGVtcG9yYXJpZXMgKHRydWUsIG9mZnNldCkgPiAwKQogICAg cmV0dXJuIGZhbHNlOwoKICAvKiBEbyBub3QgYWxsb3cgY29uc3QgKHBsdXMgKGFuY2hvcl9zeW1i b2wsIGNvbnN0X2ludCkpLiAgKi8KICBpZiAobWF5YmVfbmUgKG9mZnNldCwgMCkgJiYgU1lNQk9M X1JFRl9QICh4KSAmJiBTWU1CT0xfUkVGX0FOQ0hPUl9QICh4KSkKICAgIHJldHVybiBmYWxzZTsK CiAgLyogVHJlYXQgc3ltYm9scyBhcyBjb25zdGFudHMuICBBdm9pZCBUTFMgc3ltYm9scyBhcyB0 aGV5IGFyZSBjb21wbGV4LAogICAgIHNvIHNwaWxsaW5nIHRoZW0gaXMgYmV0dGVyIHRoYW4gcmVt YXRlcmlhbGl6YXRpb24uICAqLwogIGlmIChTWU1CT0xfUkVGX1AgKHgpICYmICFTWU1CT0xfUkVG X1RMU19NT0RFTCAoeCkpCiAgICByZXR1cm4gdHJ1ZTsKCiAgLyogTGFiZWwgcmVmZXJlbmNlcyBh cmUgYWx3YXlzIGNvbnN0YW50LiAgKi8KICBpZiAoTEFCRUxfUkVGX1AgKHgpKQogICAgcmV0dXJu IHRydWU7CgogIHJldHVybiBmYWxzZTsKfQoKcnR4CmFhcmNoNjRfbG9hZF90cCAocnR4IHRhcmdl dCkKewogIGlmICghdGFyZ2V0CiAgICAgIHx8IEdFVF9NT0RFICh0YXJnZXQpICE9IFBtb2RlCiAg ICAgIHx8ICFyZWdpc3Rlcl9vcGVyYW5kICh0YXJnZXQsIFBtb2RlKSkKICAgIHRhcmdldCA9IGdl bl9yZWdfcnR4IChQbW9kZSk7CgogIC8qIENhbiByZXR1cm4gaW4gYW55IHJlZy4gICovCiAgZW1p dF9pbnNuIChnZW5fYWFyY2g2NF9sb2FkX3RwX2hhcmQgKHRhcmdldCkpOwogIHJldHVybiB0YXJn ZXQ7Cn0KCi8qIE9uIEFBUENTIHN5c3RlbXMsIHRoaXMgaXMgdGhlICJzdHJ1Y3QgX192YV9saXN0 Ii4gICovCnN0YXRpYyBHVFkoKCkpIHRyZWUgdmFfbGlzdF90eXBlOwoKLyogSW1wbGVtZW50IFRB UkdFVF9CVUlMRF9CVUlMVElOX1ZBX0xJU1QuCiAgIFJldHVybiB0aGUgdHlwZSB0byB1c2UgYXMg X19idWlsdGluX3ZhX2xpc3QuCgogICBBQVBDUzY0IFxTIDcuMS40IHJlcXVpcmVzIHRoYXQgdmFf bGlzdCBiZSBhIHR5cGVkZWYgZm9yIGEgdHlwZSBkZWZpbmVkIGFzOgoKICAgc3RydWN0IF9fdmFf bGlzdAogICB7CiAgICAgdm9pZCAqX19zdGFjazsKICAgICB2b2lkICpfX2dyX3RvcDsKICAgICB2 b2lkICpfX3ZyX3RvcDsKICAgICBpbnQgICBfX2dyX29mZnM7CiAgICAgaW50ICAgX192cl9vZmZz OwogICB9OyAgKi8KCnN0YXRpYyB0cmVlCmFhcmNoNjRfYnVpbGRfYnVpbHRpbl92YV9saXN0ICh2 b2lkKQp7CiAgdHJlZSB2YV9saXN0X25hbWU7CiAgdHJlZSBmX3N0YWNrLCBmX2dydG9wLCBmX3Zy dG9wLCBmX2dyb2ZmLCBmX3Zyb2ZmOwoKICAvKiBDcmVhdGUgdGhlIHR5cGUuICAqLwogIHZhX2xp c3RfdHlwZSA9IGxhbmdfaG9va3MudHlwZXMubWFrZV90eXBlIChSRUNPUkRfVFlQRSk7CiAgLyog R2l2ZSBpdCB0aGUgcmVxdWlyZWQgbmFtZS4gICovCiAgdmFfbGlzdF9uYW1lID0gYnVpbGRfZGVj bCAoQlVJTFRJTlNfTE9DQVRJT04sCgkJCSAgICAgVFlQRV9ERUNMLAoJCQkgICAgIGdldF9pZGVu dGlmaWVyICgiX192YV9saXN0IiksCgkJCSAgICAgdmFfbGlzdF90eXBlKTsKICBERUNMX0FSVElG SUNJQUwgKHZhX2xpc3RfbmFtZSkgPSAxOwogIFRZUEVfTkFNRSAodmFfbGlzdF90eXBlKSA9IHZh X2xpc3RfbmFtZTsKICBUWVBFX1NUVUJfREVDTCAodmFfbGlzdF90eXBlKSA9IHZhX2xpc3RfbmFt ZTsKCiAgLyogQ3JlYXRlIHRoZSBmaWVsZHMuICAqLwogIGZfc3RhY2sgPSBidWlsZF9kZWNsIChC VUlMVElOU19MT0NBVElPTiwKCQkJRklFTERfREVDTCwgZ2V0X2lkZW50aWZpZXIgKCJfX3N0YWNr IiksCgkJCXB0cl90eXBlX25vZGUpOwogIGZfZ3J0b3AgPSBidWlsZF9kZWNsIChCVUlMVElOU19M T0NBVElPTiwKCQkJRklFTERfREVDTCwgZ2V0X2lkZW50aWZpZXIgKCJfX2dyX3RvcCIpLAoJCQlw dHJfdHlwZV9ub2RlKTsKICBmX3ZydG9wID0gYnVpbGRfZGVjbCAoQlVJTFRJTlNfTE9DQVRJT04s CgkJCUZJRUxEX0RFQ0wsIGdldF9pZGVudGlmaWVyICgiX192cl90b3AiKSwKCQkJcHRyX3R5cGVf bm9kZSk7CiAgZl9ncm9mZiA9IGJ1aWxkX2RlY2wgKEJVSUxUSU5TX0xPQ0FUSU9OLAoJCQlGSUVM RF9ERUNMLCBnZXRfaWRlbnRpZmllciAoIl9fZ3Jfb2ZmcyIpLAoJCQlpbnRlZ2VyX3R5cGVfbm9k ZSk7CiAgZl92cm9mZiA9IGJ1aWxkX2RlY2wgKEJVSUxUSU5TX0xPQ0FUSU9OLAoJCQlGSUVMRF9E RUNMLCBnZXRfaWRlbnRpZmllciAoIl9fdnJfb2ZmcyIpLAoJCQlpbnRlZ2VyX3R5cGVfbm9kZSk7 CgogIC8qIFRlbGwgdHJlZS1zdGRhcmcgcGFzcyBhYm91dCBvdXIgaW50ZXJuYWwgb2Zmc2V0IGZp ZWxkcy4KICAgICBOT1RFOiB2YV9saXN0X2dwci9mcHJfY291bnRlcl9maWVsZCBhcmUgb25seSB1 c2VkIGZvciB0cmVlIGNvbXBhcmlzaW9uCiAgICAgcHVycG9zZSB0byBpZGVudGlmeSB3aGV0aGVy IHRoZSBjb2RlIGlzIHVwZGF0aW5nIHZhX2xpc3QgaW50ZXJuYWwKICAgICBvZmZzZXQgZmllbGRz IHRocm91Z2ggaXJyZWd1bGFyIHdheS4gICovCiAgdmFfbGlzdF9ncHJfY291bnRlcl9maWVsZCA9 IGZfZ3JvZmY7CiAgdmFfbGlzdF9mcHJfY291bnRlcl9maWVsZCA9IGZfdnJvZmY7CgogIERFQ0xf QVJUSUZJQ0lBTCAoZl9zdGFjaykgPSAxOwogIERFQ0xfQVJUSUZJQ0lBTCAoZl9ncnRvcCkgPSAx OwogIERFQ0xfQVJUSUZJQ0lBTCAoZl92cnRvcCkgPSAxOwogIERFQ0xfQVJUSUZJQ0lBTCAoZl9n cm9mZikgPSAxOwogIERFQ0xfQVJUSUZJQ0lBTCAoZl92cm9mZikgPSAxOwoKICBERUNMX0ZJRUxE X0NPTlRFWFQgKGZfc3RhY2spID0gdmFfbGlzdF90eXBlOwogIERFQ0xfRklFTERfQ09OVEVYVCAo Zl9ncnRvcCkgPSB2YV9saXN0X3R5cGU7CiAgREVDTF9GSUVMRF9DT05URVhUIChmX3ZydG9wKSA9 IHZhX2xpc3RfdHlwZTsKICBERUNMX0ZJRUxEX0NPTlRFWFQgKGZfZ3JvZmYpID0gdmFfbGlzdF90 eXBlOwogIERFQ0xfRklFTERfQ09OVEVYVCAoZl92cm9mZikgPSB2YV9saXN0X3R5cGU7CgogIFRZ UEVfRklFTERTICh2YV9saXN0X3R5cGUpID0gZl9zdGFjazsKICBERUNMX0NIQUlOIChmX3N0YWNr KSA9IGZfZ3J0b3A7CiAgREVDTF9DSEFJTiAoZl9ncnRvcCkgPSBmX3ZydG9wOwogIERFQ0xfQ0hB SU4gKGZfdnJ0b3ApID0gZl9ncm9mZjsKICBERUNMX0NIQUlOIChmX2dyb2ZmKSA9IGZfdnJvZmY7 CgogIC8qIENvbXB1dGUgaXRzIGxheW91dC4gICovCiAgbGF5b3V0X3R5cGUgKHZhX2xpc3RfdHlw ZSk7CgogIHJldHVybiB2YV9saXN0X3R5cGU7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfRVhQQU5E X0JVSUxUSU5fVkFfU1RBUlQuICAqLwpzdGF0aWMgdm9pZAphYXJjaDY0X2V4cGFuZF9idWlsdGlu X3ZhX3N0YXJ0ICh0cmVlIHZhbGlzdCwgcnR4IG5leHRhcmcgQVRUUklCVVRFX1VOVVNFRCkKewog IGNvbnN0IENVTVVMQVRJVkVfQVJHUyAqY3VtOwogIHRyZWUgZl9zdGFjaywgZl9ncnRvcCwgZl92 cnRvcCwgZl9ncm9mZiwgZl92cm9mZjsKICB0cmVlIHN0YWNrLCBncnRvcCwgdnJ0b3AsIGdyb2Zm LCB2cm9mZjsKICB0cmVlIHQ7CiAgaW50IGdyX3NhdmVfYXJlYV9zaXplID0gY2Z1bi0+dmFfbGlz dF9ncHJfc2l6ZTsKICBpbnQgdnJfc2F2ZV9hcmVhX3NpemUgPSBjZnVuLT52YV9saXN0X2Zwcl9z aXplOwogIGludCB2cl9vZmZzZXQ7CgogIGN1bSA9ICZjcnRsLT5hcmdzLmluZm87CiAgaWYgKGNm dW4tPnZhX2xpc3RfZ3ByX3NpemUpCiAgICBncl9zYXZlX2FyZWFfc2l6ZSA9IE1JTiAoKE5VTV9B UkdfUkVHUyAtIGN1bS0+YWFwY3NfbmNybikgKiBVTklUU19QRVJfV09SRCwKCQkJICAgICBjZnVu LT52YV9saXN0X2dwcl9zaXplKTsKICBpZiAoY2Z1bi0+dmFfbGlzdF9mcHJfc2l6ZSkKICAgIHZy X3NhdmVfYXJlYV9zaXplID0gTUlOICgoTlVNX0ZQX0FSR19SRUdTIC0gY3VtLT5hYXBjc19udnJu KQoJCQkgICAgICogVU5JVFNfUEVSX1ZSRUcsIGNmdW4tPnZhX2xpc3RfZnByX3NpemUpOwoKICBp ZiAoIVRBUkdFVF9GTE9BVCkKICAgIHsKICAgICAgZ2NjX2Fzc2VydCAoY3VtLT5hYXBjc19udnJu ID09IDApOwogICAgICB2cl9zYXZlX2FyZWFfc2l6ZSA9IDA7CiAgICB9CgogIGZfc3RhY2sgPSBU WVBFX0ZJRUxEUyAodmFfbGlzdF90eXBlX25vZGUpOwogIGZfZ3J0b3AgPSBERUNMX0NIQUlOIChm X3N0YWNrKTsKICBmX3ZydG9wID0gREVDTF9DSEFJTiAoZl9ncnRvcCk7CiAgZl9ncm9mZiA9IERF Q0xfQ0hBSU4gKGZfdnJ0b3ApOwogIGZfdnJvZmYgPSBERUNMX0NIQUlOIChmX2dyb2ZmKTsKCiAg c3RhY2sgPSBidWlsZDMgKENPTVBPTkVOVF9SRUYsIFRSRUVfVFlQRSAoZl9zdGFjayksIHZhbGlz dCwgZl9zdGFjaywKCQkgIE5VTExfVFJFRSk7CiAgZ3J0b3AgPSBidWlsZDMgKENPTVBPTkVOVF9S RUYsIFRSRUVfVFlQRSAoZl9ncnRvcCksIHZhbGlzdCwgZl9ncnRvcCwKCQkgIE5VTExfVFJFRSk7 CiAgdnJ0b3AgPSBidWlsZDMgKENPTVBPTkVOVF9SRUYsIFRSRUVfVFlQRSAoZl92cnRvcCksIHZh bGlzdCwgZl92cnRvcCwKCQkgIE5VTExfVFJFRSk7CiAgZ3JvZmYgPSBidWlsZDMgKENPTVBPTkVO VF9SRUYsIFRSRUVfVFlQRSAoZl9ncm9mZiksIHZhbGlzdCwgZl9ncm9mZiwKCQkgIE5VTExfVFJF RSk7CiAgdnJvZmYgPSBidWlsZDMgKENPTVBPTkVOVF9SRUYsIFRSRUVfVFlQRSAoZl92cm9mZiks IHZhbGlzdCwgZl92cm9mZiwKCQkgIE5VTExfVFJFRSk7CgogIC8qIEVtaXQgY29kZSB0byBpbml0 aWFsaXplIFNUQUNLLCB3aGljaCBwb2ludHMgdG8gdGhlIG5leHQgdmFyYXJncyBzdGFjawogICAg IGFyZ3VtZW50LiAgQ1VNLT5BQVBDU19TVEFDS19TSVpFIGdpdmVzIHRoZSBudW1iZXIgb2Ygc3Rh Y2sgd29yZHMgdXNlZAogICAgIGJ5IG5hbWVkIGFyZ3VtZW50cy4gIFNUQUNLIGlzIDgtYnl0ZSBh bGlnbmVkLiAgKi8KICB0ID0gbWFrZV90cmVlIChUUkVFX1RZUEUgKHN0YWNrKSwgdmlydHVhbF9p bmNvbWluZ19hcmdzX3J0eCk7CiAgaWYgKGN1bS0+YWFwY3Nfc3RhY2tfc2l6ZSA+IDApCiAgICB0 ID0gZm9sZF9idWlsZF9wb2ludGVyX3BsdXNfaHdpICh0LCBjdW0tPmFhcGNzX3N0YWNrX3NpemUg KiBVTklUU19QRVJfV09SRCk7CiAgdCA9IGJ1aWxkMiAoTU9ESUZZX0VYUFIsIFRSRUVfVFlQRSAo c3RhY2spLCBzdGFjaywgdCk7CiAgZXhwYW5kX2V4cHIgKHQsIGNvbnN0MF9ydHgsIFZPSURtb2Rl LCBFWFBBTkRfTk9STUFMKTsKCiAgLyogRW1pdCBjb2RlIHRvIGluaXRpYWxpemUgR1JUT1AsIHRo ZSB0b3Agb2YgdGhlIEdSIHNhdmUgYXJlYS4KICAgICB2aXJ0dWFsX2luY29taW5nX2FyZ3NfcnR4 IHNob3VsZCBoYXZlIGJlZW4gMTYgYnl0ZSBhbGlnbmVkLiAgKi8KICB0ID0gbWFrZV90cmVlIChU UkVFX1RZUEUgKGdydG9wKSwgdmlydHVhbF9pbmNvbWluZ19hcmdzX3J0eCk7CiAgdCA9IGJ1aWxk MiAoTU9ESUZZX0VYUFIsIFRSRUVfVFlQRSAoZ3J0b3ApLCBncnRvcCwgdCk7CiAgZXhwYW5kX2V4 cHIgKHQsIGNvbnN0MF9ydHgsIFZPSURtb2RlLCBFWFBBTkRfTk9STUFMKTsKCiAgLyogRW1pdCBj b2RlIHRvIGluaXRpYWxpemUgVlJUT1AsIHRoZSB0b3Agb2YgdGhlIFZSIHNhdmUgYXJlYS4KICAg ICBUaGlzIGFkZHJlc3MgaXMgZ3Jfc2F2ZV9hcmVhX2J5dGVzIGJlbG93IEdSVE9QLCByb3VuZGVk CiAgICAgZG93biB0byB0aGUgbmV4dCAxNi1ieXRlIGJvdW5kYXJ5LiAgKi8KICB0ID0gbWFrZV90 cmVlIChUUkVFX1RZUEUgKHZydG9wKSwgdmlydHVhbF9pbmNvbWluZ19hcmdzX3J0eCk7CiAgdnJf b2Zmc2V0ID0gUk9VTkRfVVAgKGdyX3NhdmVfYXJlYV9zaXplLAoJCQlTVEFDS19CT1VOREFSWSAv IEJJVFNfUEVSX1VOSVQpOwoKICBpZiAodnJfb2Zmc2V0KQogICAgdCA9IGZvbGRfYnVpbGRfcG9p bnRlcl9wbHVzX2h3aSAodCwgLXZyX29mZnNldCk7CiAgdCA9IGJ1aWxkMiAoTU9ESUZZX0VYUFIs IFRSRUVfVFlQRSAodnJ0b3ApLCB2cnRvcCwgdCk7CiAgZXhwYW5kX2V4cHIgKHQsIGNvbnN0MF9y dHgsIFZPSURtb2RlLCBFWFBBTkRfTk9STUFMKTsKCiAgLyogRW1pdCBjb2RlIHRvIGluaXRpYWxp emUgR1JPRkYsIHRoZSBvZmZzZXQgZnJvbSBHUlRPUCBvZiB0aGUKICAgICBuZXh0IEdQUiBhcmd1 bWVudC4gICovCiAgdCA9IGJ1aWxkMiAoTU9ESUZZX0VYUFIsIFRSRUVfVFlQRSAoZ3JvZmYpLCBn cm9mZiwKCSAgICAgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAoZ3JvZmYpLCAtZ3Jfc2F2ZV9h cmVhX3NpemUpKTsKICBleHBhbmRfZXhwciAodCwgY29uc3QwX3J0eCwgVk9JRG1vZGUsIEVYUEFO RF9OT1JNQUwpOwoKICAvKiBMaWtld2lzZSBlbWl0IGNvZGUgdG8gaW5pdGlhbGl6ZSBWUk9GRiwg dGhlIG9mZnNldCBmcm9tIEZUT1AKICAgICBvZiB0aGUgbmV4dCBWUiBhcmd1bWVudC4gICovCiAg dCA9IGJ1aWxkMiAoTU9ESUZZX0VYUFIsIFRSRUVfVFlQRSAodnJvZmYpLCB2cm9mZiwKCSAgICAg IGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAodnJvZmYpLCAtdnJfc2F2ZV9hcmVhX3NpemUpKTsK ICBleHBhbmRfZXhwciAodCwgY29uc3QwX3J0eCwgVk9JRG1vZGUsIEVYUEFORF9OT1JNQUwpOwp9 CgovKiBJbXBsZW1lbnQgVEFSR0VUX0dJTVBMSUZZX1ZBX0FSR19FWFBSLiAgKi8KCnN0YXRpYyB0 cmVlCmFhcmNoNjRfZ2ltcGxpZnlfdmFfYXJnX2V4cHIgKHRyZWUgdmFsaXN0LCB0cmVlIHR5cGUs IGdpbXBsZV9zZXEgKnByZV9wLAoJCQkgICAgICBnaW1wbGVfc2VxICpwb3N0X3AgQVRUUklCVVRF X1VOVVNFRCkKewogIHRyZWUgYWRkcjsKICBib29sIGluZGlyZWN0X3A7CiAgYm9vbCBpc19oYTsJ CS8qIGlzIEhGQSBvciBIVkEuICAqLwogIGJvb2wgZHdfYWxpZ247CS8qIGRvdWJsZS13b3JkIGFs aWduLiAgKi8KICBtYWNoaW5lX21vZGUgYWdfbW9kZSA9IFZPSURtb2RlOwogIGludCBucmVnczsK ICBtYWNoaW5lX21vZGUgbW9kZTsKCiAgdHJlZSBmX3N0YWNrLCBmX2dydG9wLCBmX3ZydG9wLCBm X2dyb2ZmLCBmX3Zyb2ZmOwogIHRyZWUgc3RhY2ssIGZfdG9wLCBmX29mZiwgb2ZmLCBhcmcsIHJv dW5kdXAsIG9uX3N0YWNrOwogIEhPU1RfV0lERV9JTlQgc2l6ZSwgcnNpemUsIGFkanVzdCwgYWxp Z247CiAgdHJlZSB0LCB1LCBjb25kMSwgY29uZDI7CgogIGluZGlyZWN0X3AgPSBwYXNzX3ZhX2Fy Z19ieV9yZWZlcmVuY2UgKHR5cGUpOwogIGlmIChpbmRpcmVjdF9wKQogICAgdHlwZSA9IGJ1aWxk X3BvaW50ZXJfdHlwZSAodHlwZSk7CgogIG1vZGUgPSBUWVBFX01PREUgKHR5cGUpOwoKICBmX3N0 YWNrID0gVFlQRV9GSUVMRFMgKHZhX2xpc3RfdHlwZV9ub2RlKTsKICBmX2dydG9wID0gREVDTF9D SEFJTiAoZl9zdGFjayk7CiAgZl92cnRvcCA9IERFQ0xfQ0hBSU4gKGZfZ3J0b3ApOwogIGZfZ3Jv ZmYgPSBERUNMX0NIQUlOIChmX3ZydG9wKTsKICBmX3Zyb2ZmID0gREVDTF9DSEFJTiAoZl9ncm9m Zik7CgogIHN0YWNrID0gYnVpbGQzIChDT01QT05FTlRfUkVGLCBUUkVFX1RZUEUgKGZfc3RhY2sp LCB1bnNoYXJlX2V4cHIgKHZhbGlzdCksCgkJICBmX3N0YWNrLCBOVUxMX1RSRUUpOwogIHNpemUg PSBpbnRfc2l6ZV9pbl9ieXRlcyAodHlwZSk7CgogIHVuc2lnbmVkIGludCBhYmlfYnJlYWtfZ2Nj Xzk7CiAgdW5zaWduZWQgaW50IGFiaV9icmVha19nY2NfMTM7CiAgdW5zaWduZWQgaW50IGFiaV9i cmVha19nY2NfMTQ7CiAgYWxpZ24KICAgID0gYWFyY2g2NF9mdW5jdGlvbl9hcmdfYWxpZ25tZW50 IChtb2RlLCB0eXBlLCAmYWJpX2JyZWFrX2djY185LAoJCQkJICAgICAgJmFiaV9icmVha19nY2Nf MTMsICZhYmlfYnJlYWtfZ2NjXzE0KQogICAgLyBCSVRTX1BFUl9VTklUOwoKICBkd19hbGlnbiA9 IGZhbHNlOwogIGFkanVzdCA9IDA7CiAgaWYgKGFhcmNoNjRfdmZwX2lzX2NhbGxfb3JfcmV0dXJu X2NhbmRpZGF0ZSAobW9kZSwgdHlwZSwgJmFnX21vZGUsICZucmVncywKCQkJCQkgICAgICAgJmlz X2hhLCBmYWxzZSkpCiAgICB7CiAgICAgIC8qIE5vIGZyb250ZW5kcyBjYW4gY3JlYXRlIHR5cGVz IHdpdGggdmFyaWFibGUtc2l6ZWQgbW9kZXMsIHNvIHdlCgkgc2hvdWxkbid0IGJlIGFza2VkIHRv IHBhc3Mgb3IgcmV0dXJuIHRoZW0uICAqLwogICAgICB1bnNpZ25lZCBpbnQgYWdfc2l6ZSA9IEdF VF9NT0RFX1NJWkUgKGFnX21vZGUpLnRvX2NvbnN0YW50ICgpOwoKICAgICAgLyogVFlQRSBwYXNz ZWQgaW4gZnAvc2ltZCByZWdpc3RlcnMuICAqLwogICAgICBpZiAoIVRBUkdFVF9GTE9BVCkKCWFh cmNoNjRfZXJyX25vX2ZwYWR2c2ltZCAobW9kZSk7CgogICAgICBmX3RvcCA9IGJ1aWxkMyAoQ09N UE9ORU5UX1JFRiwgVFJFRV9UWVBFIChmX3ZydG9wKSwKCQkgICAgICB1bnNoYXJlX2V4cHIgKHZh bGlzdCksIGZfdnJ0b3AsIE5VTExfVFJFRSk7CiAgICAgIGZfb2ZmID0gYnVpbGQzIChDT01QT05F TlRfUkVGLCBUUkVFX1RZUEUgKGZfdnJvZmYpLAoJCSAgICAgIHVuc2hhcmVfZXhwciAodmFsaXN0 KSwgZl92cm9mZiwgTlVMTF9UUkVFKTsKCiAgICAgIHJzaXplID0gbnJlZ3MgKiBVTklUU19QRVJf VlJFRzsKCiAgICAgIGlmIChpc19oYSkKCXsKCSAgaWYgKEJZVEVTX0JJR19FTkRJQU4gJiYgYWdf c2l6ZSA8IFVOSVRTX1BFUl9WUkVHKQoJICAgIGFkanVzdCA9IFVOSVRTX1BFUl9WUkVHIC0gYWdf c2l6ZTsKCX0KICAgICAgZWxzZSBpZiAoQkxPQ0tfUkVHX1BBRERJTkcgKG1vZGUsIHR5cGUsIDEp ID09IFBBRF9ET1dOV0FSRAoJICAgICAgICYmIHNpemUgPCBVTklUU19QRVJfVlJFRykKCXsKCSAg YWRqdXN0ID0gVU5JVFNfUEVSX1ZSRUcgLSBzaXplOwoJfQogICAgfQogIGVsc2UKICAgIHsKICAg ICAgLyogVFlQRSBwYXNzZWQgaW4gZ2VuZXJhbCByZWdpc3RlcnMuICAqLwogICAgICBmX3RvcCA9 IGJ1aWxkMyAoQ09NUE9ORU5UX1JFRiwgVFJFRV9UWVBFIChmX2dydG9wKSwKCQkgICAgICB1bnNo YXJlX2V4cHIgKHZhbGlzdCksIGZfZ3J0b3AsIE5VTExfVFJFRSk7CiAgICAgIGZfb2ZmID0gYnVp bGQzIChDT01QT05FTlRfUkVGLCBUUkVFX1RZUEUgKGZfZ3JvZmYpLAoJCSAgICAgIHVuc2hhcmVf ZXhwciAodmFsaXN0KSwgZl9ncm9mZiwgTlVMTF9UUkVFKTsKICAgICAgcnNpemUgPSBST1VORF9V UCAoc2l6ZSwgVU5JVFNfUEVSX1dPUkQpOwogICAgICBucmVncyA9IHJzaXplIC8gVU5JVFNfUEVS X1dPUkQ7CgogICAgICBpZiAoYWxpZ24gPD0gOCAmJiBhYmlfYnJlYWtfZ2NjXzEzICYmIHdhcm5f cHNhYmkpCglpbmZvcm0gKGlucHV0X2xvY2F0aW9uLCAicGFyYW1ldGVyIHBhc3NpbmcgZm9yIGFy Z3VtZW50IG9mIHR5cGUgIgoJCSIlcVQgY2hhbmdlZCBpbiBHQ0MgMTMuMSIsIHR5cGUpOwoKICAg ICAgaWYgKHdhcm5fcHNhYmkKCSAgJiYgYWJpX2JyZWFrX2djY18xNAoJICAmJiAoYWJpX2JyZWFr X2djY18xNCA+IDggKiBCSVRTX1BFUl9VTklUKSAhPSAoYWxpZ24gPiA4KSkKCWluZm9ybSAoaW5w dXRfbG9jYXRpb24sICJwYXJhbWV0ZXIgcGFzc2luZyBmb3IgYXJndW1lbnQgb2YgdHlwZSAiCgkJ IiVxVCBjaGFuZ2VkIGluIEdDQyAxNC4xIiwgdHlwZSk7CgogICAgICBpZiAoYWxpZ24gPiA4KQoJ ewoJICBpZiAoYWJpX2JyZWFrX2djY185ICYmIHdhcm5fcHNhYmkpCgkgICAgaW5mb3JtIChpbnB1 dF9sb2NhdGlvbiwgInBhcmFtZXRlciBwYXNzaW5nIGZvciBhcmd1bWVudCBvZiB0eXBlICIKCQkg ICAgIiVxVCBjaGFuZ2VkIGluIEdDQyA5LjEiLCB0eXBlKTsKCSAgZHdfYWxpZ24gPSB0cnVlOwoJ fQoKICAgICAgaWYgKEJMT0NLX1JFR19QQURESU5HIChtb2RlLCB0eXBlLCAxKSA9PSBQQURfRE9X TldBUkQKCSAgJiYgc2l6ZSA8IFVOSVRTX1BFUl9XT1JEKQoJewoJICBhZGp1c3QgPSBVTklUU19Q RVJfV09SRCAgLSBzaXplOwoJfQogICAgfQoKICAvKiBHZXQgYSBsb2NhbCB0ZW1wb3JhcnkgZm9y IHRoZSBmaWVsZCB2YWx1ZS4gICovCiAgb2ZmID0gZ2V0X2luaXRpYWxpemVkX3RtcF92YXIgKGZf b2ZmLCBwcmVfcCwgTlVMTCk7CgogIC8qIEVtaXQgY29kZSB0byBicmFuY2ggaWYgb2ZmID49IDAu ICAqLwogIHQgPSBidWlsZDIgKEdFX0VYUFIsIGJvb2xlYW5fdHlwZV9ub2RlLCBvZmYsCgkgICAg ICBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKG9mZiksIDApKTsKICBjb25kMSA9IGJ1aWxkMyAo Q09ORF9FWFBSLCBwdHJfdHlwZV9ub2RlLCB0LCBOVUxMX1RSRUUsIE5VTExfVFJFRSk7CgogIGlm IChkd19hbGlnbikKICAgIHsKICAgICAgLyogRW1pdDogb2ZmcyA9IChvZmZzICsgMTUpICYgLTE2 LiAgKi8KICAgICAgdCA9IGJ1aWxkMiAoUExVU19FWFBSLCBUUkVFX1RZUEUgKG9mZiksIG9mZiwK CQkgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAob2ZmKSwgMTUpKTsKICAgICAgdCA9IGJ1aWxk MiAoQklUX0FORF9FWFBSLCBUUkVFX1RZUEUgKG9mZiksIHQsCgkJICBidWlsZF9pbnRfY3N0IChU UkVFX1RZUEUgKG9mZiksIC0xNikpOwogICAgICByb3VuZHVwID0gYnVpbGQyIChNT0RJRllfRVhQ UiwgVFJFRV9UWVBFIChvZmYpLCBvZmYsIHQpOwogICAgfQogIGVsc2UKICAgIHJvdW5kdXAgPSBO VUxMOwoKICAvKiBVcGRhdGUgYXAuX19bZ3x2XXJfb2ZmcyAgKi8KICB0ID0gYnVpbGQyIChQTFVT X0VYUFIsIFRSRUVfVFlQRSAob2ZmKSwgb2ZmLAoJICAgICAgYnVpbGRfaW50X2NzdCAoVFJFRV9U WVBFIChvZmYpLCByc2l6ZSkpOwogIHQgPSBidWlsZDIgKE1PRElGWV9FWFBSLCBUUkVFX1RZUEUg KGZfb2ZmKSwgdW5zaGFyZV9leHByIChmX29mZiksIHQpOwoKICAvKiBTdHJpbmcgdXAuICAqLwog IGlmIChyb3VuZHVwKQogICAgdCA9IGJ1aWxkMiAoQ09NUE9VTkRfRVhQUiwgVFJFRV9UWVBFICh0 KSwgcm91bmR1cCwgdCk7CgogIC8qIFtjb25kMl0gaWYgKGFwLl9fW2d8dl1yX29mZnMgPiAwKSAg Ki8KICB1ID0gYnVpbGQyIChHVF9FWFBSLCBib29sZWFuX3R5cGVfbm9kZSwgdW5zaGFyZV9leHBy IChmX29mZiksCgkgICAgICBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKGZfb2ZmKSwgMCkpOwog IGNvbmQyID0gYnVpbGQzIChDT05EX0VYUFIsIHB0cl90eXBlX25vZGUsIHUsIE5VTExfVFJFRSwg TlVMTF9UUkVFKTsKCiAgLyogU3RyaW5nIHVwOiBtYWtlIHN1cmUgdGhlIGFzc2lnbm1lbnQgaGFw cGVucyBiZWZvcmUgdGhlIHVzZS4gICovCiAgdCA9IGJ1aWxkMiAoQ09NUE9VTkRfRVhQUiwgVFJF RV9UWVBFIChjb25kMiksIHQsIGNvbmQyKTsKICBDT05EX0VYUFJfRUxTRSAoY29uZDEpID0gdDsK CiAgLyogUHJlcGFyZSB0aGUgdHJlZXMgaGFuZGxpbmcgdGhlIGFyZ3VtZW50IHRoYXQgaXMgcGFz c2VkIG9uIHRoZSBzdGFjazsKICAgICB0aGUgdG9wIGxldmVsIG5vZGUgd2lsbCBzdG9yZSBpbiBP Tl9TVEFDSy4gICovCiAgYXJnID0gZ2V0X2luaXRpYWxpemVkX3RtcF92YXIgKHN0YWNrLCBwcmVf cCwgTlVMTCk7CiAgaWYgKGFsaWduID4gOCkKICAgIHsKICAgICAgLyogaWYgKGFsaWdub2YodHlw ZSkgPiA4KSAoYXJnID0gYXJnICsgMTUpICYgLTE2OyAgKi8KICAgICAgdCA9IGZvbGRfYnVpbGRf cG9pbnRlcl9wbHVzX2h3aSAoYXJnLCAxNSk7CiAgICAgIHQgPSBidWlsZDIgKEJJVF9BTkRfRVhQ UiwgVFJFRV9UWVBFICh0KSwgdCwKCQkgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAodCksIC0x NikpOwogICAgICByb3VuZHVwID0gYnVpbGQyIChNT0RJRllfRVhQUiwgVFJFRV9UWVBFIChhcmcp LCBhcmcsIHQpOwogICAgfQogIGVsc2UKICAgIHJvdW5kdXAgPSBOVUxMOwogIC8qIEFkdmFuY2Ug YXAuX19zdGFjayAgKi8KICB0ID0gZm9sZF9idWlsZF9wb2ludGVyX3BsdXNfaHdpIChhcmcsIHNp emUgKyA3KTsKICB0ID0gYnVpbGQyIChCSVRfQU5EX0VYUFIsIFRSRUVfVFlQRSAodCksIHQsCgkg ICAgICBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKHQpLCAtOCkpOwogIHQgPSBidWlsZDIgKE1P RElGWV9FWFBSLCBUUkVFX1RZUEUgKHN0YWNrKSwgdW5zaGFyZV9leHByIChzdGFjayksIHQpOwog IC8qIFN0cmluZyB1cCByb3VuZHVwIGFuZCBhZHZhbmNlLiAgKi8KICBpZiAocm91bmR1cCkKICAg IHQgPSBidWlsZDIgKENPTVBPVU5EX0VYUFIsIFRSRUVfVFlQRSAodCksIHJvdW5kdXAsIHQpOwog IC8qIFN0cmluZyB1cCB3aXRoIGFyZyAqLwogIG9uX3N0YWNrID0gYnVpbGQyIChDT01QT1VORF9F WFBSLCBUUkVFX1RZUEUgKGFyZyksIHQsIGFyZyk7CiAgLyogQmlnLWVuZGlhbm5lc3MgcmVsYXRl ZCBhZGRyZXNzIGFkanVzdG1lbnQuICAqLwogIGlmIChCTE9DS19SRUdfUEFERElORyAobW9kZSwg dHlwZSwgMSkgPT0gUEFEX0RPV05XQVJECiAgICAgICYmIHNpemUgPCBVTklUU19QRVJfV09SRCkK ICB7CiAgICB0ID0gYnVpbGQyIChQT0lOVEVSX1BMVVNfRVhQUiwgVFJFRV9UWVBFIChhcmcpLCBh cmcsCgkJc2l6ZV9pbnQgKFVOSVRTX1BFUl9XT1JEIC0gc2l6ZSkpOwogICAgb25fc3RhY2sgPSBi dWlsZDIgKENPTVBPVU5EX0VYUFIsIFRSRUVfVFlQRSAoYXJnKSwgb25fc3RhY2ssIHQpOwogIH0K CiAgQ09ORF9FWFBSX1RIRU4gKGNvbmQxKSA9IHVuc2hhcmVfZXhwciAob25fc3RhY2spOwogIENP TkRfRVhQUl9USEVOIChjb25kMikgPSB1bnNoYXJlX2V4cHIgKG9uX3N0YWNrKTsKCiAgLyogQWRq dXN0bWVudCB0byBPRkZTRVQgaW4gdGhlIGNhc2Ugb2YgQklHX0VORElBTi4gICovCiAgdCA9IG9m ZjsKICBpZiAoYWRqdXN0KQogICAgdCA9IGJ1aWxkMiAoUFJFSU5DUkVNRU5UX0VYUFIsIFRSRUVf VFlQRSAob2ZmKSwgb2ZmLAoJCWJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAob2ZmKSwgYWRqdXN0 KSk7CgogIHQgPSBmb2xkX2NvbnZlcnQgKHNpemV0eXBlLCB0KTsKICB0ID0gYnVpbGQyIChQT0lO VEVSX1BMVVNfRVhQUiwgVFJFRV9UWVBFIChmX3RvcCksIGZfdG9wLCB0KTsKCiAgaWYgKGlzX2hh KQogICAgewogICAgICAvKiB0eXBlIGhhOyAvLyB0cmVhdCBhcyAic3RydWN0IHtmdHlwZSBmaWVs ZFtuXTt9IgogICAgICAgICAuLi4gW2NvbXB1dGluZyBvZmZzXQogICAgICAgICBmb3IgKGkgPSAw OyBpIDxucmVnczsgKytpLCBvZmZzICs9IDE2KQoJICAgaGEuZmllbGRbaV0gPSAqKChmdHlwZSAq KShhcC5fX3ZyX3RvcCArIG9mZnMpKTsKCSByZXR1cm4gaGE7ICAqLwogICAgICBpbnQgaTsKICAg ICAgdHJlZSB0bXBfaGEsIGZpZWxkX3QsIGZpZWxkX3B0cl90OwoKICAgICAgLyogRGVjbGFyZSBh IGxvY2FsIHZhcmlhYmxlLiAgKi8KICAgICAgdG1wX2hhID0gY3JlYXRlX3RtcF92YXJfcmF3ICh0 eXBlLCAiaGEiKTsKICAgICAgZ2ltcGxlX2FkZF90bXBfdmFyICh0bXBfaGEpOwoKICAgICAgLyog RXN0YWJsaXNoIHRoZSBiYXNlIHR5cGUuICAqLwogICAgICBzd2l0Y2ggKGFnX21vZGUpCgl7Cglj YXNlIEVfU0Ztb2RlOgoJICBmaWVsZF90ID0gZmxvYXRfdHlwZV9ub2RlOwoJICBmaWVsZF9wdHJf dCA9IGZsb2F0X3B0cl90eXBlX25vZGU7CgkgIGJyZWFrOwoJY2FzZSBFX0RGbW9kZToKCSAgZmll bGRfdCA9IGRvdWJsZV90eXBlX25vZGU7CgkgIGZpZWxkX3B0cl90ID0gZG91YmxlX3B0cl90eXBl X25vZGU7CgkgIGJyZWFrOwoJY2FzZSBFX1RGbW9kZToKCSAgZmllbGRfdCA9IGxvbmdfZG91Ymxl X3R5cGVfbm9kZTsKCSAgZmllbGRfcHRyX3QgPSBsb25nX2RvdWJsZV9wdHJfdHlwZV9ub2RlOwoJ ICBicmVhazsKCWNhc2UgRV9TRG1vZGU6CgkgIGZpZWxkX3QgPSBkZmxvYXQzMl90eXBlX25vZGU7 CgkgIGZpZWxkX3B0cl90ID0gYnVpbGRfcG9pbnRlcl90eXBlIChkZmxvYXQzMl90eXBlX25vZGUp OwoJICBicmVhazsKCWNhc2UgRV9ERG1vZGU6CgkgIGZpZWxkX3QgPSBkZmxvYXQ2NF90eXBlX25v ZGU7CgkgIGZpZWxkX3B0cl90ID0gYnVpbGRfcG9pbnRlcl90eXBlIChkZmxvYXQ2NF90eXBlX25v ZGUpOwoJICBicmVhazsKCWNhc2UgRV9URG1vZGU6CgkgIGZpZWxkX3QgPSBkZmxvYXQxMjhfdHlw ZV9ub2RlOwoJICBmaWVsZF9wdHJfdCA9IGJ1aWxkX3BvaW50ZXJfdHlwZSAoZGZsb2F0MTI4X3R5 cGVfbm9kZSk7CgkgIGJyZWFrOwoJY2FzZSBFX0hGbW9kZToKCSAgZmllbGRfdCA9IGFhcmNoNjRf ZnAxNl90eXBlX25vZGU7CgkgIGZpZWxkX3B0cl90ID0gYWFyY2g2NF9mcDE2X3B0cl90eXBlX25v ZGU7CgkgIGJyZWFrOwoJY2FzZSBFX0JGbW9kZToKCSAgZmllbGRfdCA9IGJmbG9hdDE2X3R5cGVf bm9kZTsKCSAgZmllbGRfcHRyX3QgPSBhYXJjaDY0X2JmMTZfcHRyX3R5cGVfbm9kZTsKCSAgYnJl YWs7CgljYXNlIEVfVjJTSW1vZGU6CgljYXNlIEVfVjRTSW1vZGU6CgkgICAgewoJICAgICAgdHJl ZSBpbm5lcnR5cGUgPSBtYWtlX3NpZ25lZF90eXBlIChHRVRfTU9ERV9QUkVDSVNJT04gKFNJbW9k ZSkpOwoJICAgICAgZmllbGRfdCA9IGJ1aWxkX3ZlY3Rvcl90eXBlX2Zvcl9tb2RlIChpbm5lcnR5 cGUsIGFnX21vZGUpOwoJICAgICAgZmllbGRfcHRyX3QgPSBidWlsZF9wb2ludGVyX3R5cGUgKGZp ZWxkX3QpOwoJICAgIH0KCSAgYnJlYWs7CglkZWZhdWx0OgoJICBnY2NfYXNzZXJ0ICgwKTsKCX0K CiAgICAgIC8qICooZmllbGRfcHRyX3QpJmhhID0gKigoZmllbGRfcHRyX3QpdnJfc2F2ZWRfYXJl YSAgKi8KICAgICAgVFJFRV9BRERSRVNTQUJMRSAodG1wX2hhKSA9IDE7CiAgICAgIHRtcF9oYSA9 IGJ1aWxkMSAoQUREUl9FWFBSLCBmaWVsZF9wdHJfdCwgdG1wX2hhKTsKICAgICAgYWRkciA9IHQ7 CiAgICAgIHQgPSBmb2xkX2NvbnZlcnQgKGZpZWxkX3B0cl90LCBhZGRyKTsKICAgICAgdCA9IGJ1 aWxkMiAoTU9ESUZZX0VYUFIsIGZpZWxkX3QsCgkJICBidWlsZDEgKElORElSRUNUX1JFRiwgZmll bGRfdCwgdG1wX2hhKSwKCQkgIGJ1aWxkMSAoSU5ESVJFQ1RfUkVGLCBmaWVsZF90LCB0KSk7Cgog ICAgICAvKiBoYS5maWVsZFtpXSA9ICooKGZpZWxkX3B0cl90KXZyX3NhdmVkX2FyZWEgKyBpKSAg Ki8KICAgICAgZm9yIChpID0gMTsgaSA8IG5yZWdzOyArK2kpCgl7CgkgIGFkZHIgPSBmb2xkX2J1 aWxkX3BvaW50ZXJfcGx1c19od2kgKGFkZHIsIFVOSVRTX1BFUl9WUkVHKTsKCSAgdSA9IGZvbGRf Y29udmVydCAoZmllbGRfcHRyX3QsIGFkZHIpOwoJICB1ID0gYnVpbGQyIChNT0RJRllfRVhQUiwg ZmllbGRfdCwKCQkgICAgICBidWlsZDIgKE1FTV9SRUYsIGZpZWxkX3QsIHRtcF9oYSwKCQkJICAg ICAgYnVpbGRfaW50X2NzdCAoZmllbGRfcHRyX3QsCgkJCQkJICAgICAoaSAqCgkJCQkJICAgICAg aW50X3NpemVfaW5fYnl0ZXMgKGZpZWxkX3QpKSkpLAoJCSAgICAgIGJ1aWxkMSAoSU5ESVJFQ1Rf UkVGLCBmaWVsZF90LCB1KSk7CgkgIHQgPSBidWlsZDIgKENPTVBPVU5EX0VYUFIsIFRSRUVfVFlQ RSAodCksIHQsIHUpOwoJfQoKICAgICAgdSA9IGZvbGRfY29udmVydCAoVFJFRV9UWVBFIChmX3Rv cCksIHRtcF9oYSk7CiAgICAgIHQgPSBidWlsZDIgKENPTVBPVU5EX0VYUFIsIFRSRUVfVFlQRSAo Zl90b3ApLCB0LCB1KTsKICAgIH0KCiAgQ09ORF9FWFBSX0VMU0UgKGNvbmQyKSA9IHQ7CiAgYWRk ciA9IGZvbGRfY29udmVydCAoYnVpbGRfcG9pbnRlcl90eXBlICh0eXBlKSwgY29uZDEpOwogIGFk ZHIgPSBidWlsZF92YV9hcmdfaW5kaXJlY3RfcmVmIChhZGRyKTsKCiAgaWYgKGluZGlyZWN0X3Ap CiAgICBhZGRyID0gYnVpbGRfdmFfYXJnX2luZGlyZWN0X3JlZiAoYWRkcik7CgogIHJldHVybiBh ZGRyOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX1NFVFVQX0lOQ09NSU5HX1ZBUkFSR1MuICAqLwoK c3RhdGljIHZvaWQKYWFyY2g2NF9zZXR1cF9pbmNvbWluZ192YXJhcmdzIChjdW11bGF0aXZlX2Fy Z3NfdCBjdW1fdiwKCQkJCWNvbnN0IGZ1bmN0aW9uX2FyZ19pbmZvICZhcmcsCgkJCQlpbnQgKnBy ZXRlbmRfc2l6ZSBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbm9fcnRsKQp7CiAgQ1VNVUxBVElWRV9B UkdTICpjdW0gPSBnZXRfY3VtdWxhdGl2ZV9hcmdzIChjdW1fdik7CiAgQ1VNVUxBVElWRV9BUkdT IGxvY2FsX2N1bTsKICBpbnQgZ3Jfc2F2ZWQgPSBjZnVuLT52YV9saXN0X2dwcl9zaXplOwogIGlu dCB2cl9zYXZlZCA9IGNmdW4tPnZhX2xpc3RfZnByX3NpemU7CgogIC8qIFRoZSBjYWxsZXIgaGFz IGFkdmFuY2VkIENVTSB1cCB0bywgYnV0IG5vdCBiZXlvbmQsIHRoZSBsYXN0IG5hbWVkCiAgICAg YXJndW1lbnQuICBBZHZhbmNlIGEgbG9jYWwgY29weSBvZiBDVU0gcGFzdCB0aGUgbGFzdCAicmVh bCIgbmFtZWQKICAgICBhcmd1bWVudCwgdG8gZmluZCBvdXQgaG93IG1hbnkgcmVnaXN0ZXJzIGFy ZSBsZWZ0IG92ZXIuICAqLwogIGxvY2FsX2N1bSA9ICpjdW07CiAgaWYgKCFUWVBFX05PX05BTUVE X0FSR1NfU1REQVJHX1AgKFRSRUVfVFlQRSAoY3VycmVudF9mdW5jdGlvbl9kZWNsKSkpCiAgICBh YXJjaDY0X2Z1bmN0aW9uX2FyZ19hZHZhbmNlIChwYWNrX2N1bXVsYXRpdmVfYXJncygmbG9jYWxf Y3VtKSwgYXJnKTsKCiAgLyogRm91bmQgb3V0IGhvdyBtYW55IHJlZ2lzdGVycyB3ZSBuZWVkIHRv IHNhdmUuCiAgICAgSG9ub3IgdHJlZS1zdGR2YXIgYW5hbHlzaXMgcmVzdWx0cy4gICovCiAgaWYg KGNmdW4tPnZhX2xpc3RfZ3ByX3NpemUpCiAgICBncl9zYXZlZCA9IE1JTiAoTlVNX0FSR19SRUdT IC0gbG9jYWxfY3VtLmFhcGNzX25jcm4sCgkJICAgIGNmdW4tPnZhX2xpc3RfZ3ByX3NpemUgLyBV TklUU19QRVJfV09SRCk7CiAgaWYgKGNmdW4tPnZhX2xpc3RfZnByX3NpemUpCiAgICB2cl9zYXZl ZCA9IE1JTiAoTlVNX0ZQX0FSR19SRUdTIC0gbG9jYWxfY3VtLmFhcGNzX252cm4sCgkJICAgIGNm dW4tPnZhX2xpc3RfZnByX3NpemUgLyBVTklUU19QRVJfVlJFRyk7CgogIGlmICghVEFSR0VUX0ZM T0FUKQogICAgewogICAgICBnY2NfYXNzZXJ0IChsb2NhbF9jdW0uYWFwY3NfbnZybiA9PSAwKTsK ICAgICAgdnJfc2F2ZWQgPSAwOwogICAgfQoKICBpZiAoIW5vX3J0bCkKICAgIHsKICAgICAgaWYg KGdyX3NhdmVkID4gMCkKCXsKCSAgcnR4IHB0ciwgbWVtOwoKCSAgLyogdmlydHVhbF9pbmNvbWlu Z19hcmdzX3J0eCBzaG91bGQgaGF2ZSBiZWVuIDE2LWJ5dGUgYWxpZ25lZC4gICovCgkgIHB0ciA9 IHBsdXNfY29uc3RhbnQgKFBtb2RlLCB2aXJ0dWFsX2luY29taW5nX2FyZ3NfcnR4LAoJCQkgICAg ICAgLSBncl9zYXZlZCAqIFVOSVRTX1BFUl9XT1JEKTsKCSAgbWVtID0gZ2VuX2ZyYW1lX21lbSAo QkxLbW9kZSwgcHRyKTsKCSAgc2V0X21lbV9hbGlhc19zZXQgKG1lbSwgZ2V0X3ZhcmFyZ3NfYWxp YXNfc2V0ICgpKTsKCgkgIG1vdmVfYmxvY2tfZnJvbV9yZWcgKGxvY2FsX2N1bS5hYXBjc19uY3Ju ICsgUjBfUkVHTlVNLAoJCQkgICAgICAgbWVtLCBncl9zYXZlZCk7Cgl9CiAgICAgIGlmICh2cl9z YXZlZCA+IDApCgl7CgkgIC8qIFdlIGNhbid0IHVzZSBtb3ZlX2Jsb2NrX2Zyb21fcmVnLCBiZWNh dXNlIGl0IHdpbGwgdXNlCgkgICAgIHRoZSB3cm9uZyBtb2RlLCBzdG9yaW5nIEQgcmVncyBvbmx5 LiAgKi8KCSAgbWFjaGluZV9tb2RlIG1vZGUgPSBUSW1vZGU7CgkgIGludCBvZmYsIGksIHZyX3N0 YXJ0OwoKCSAgLyogU2V0IE9GRiB0byB0aGUgb2Zmc2V0IGZyb20gdmlydHVhbF9pbmNvbWluZ19h cmdzX3J0eCBvZgoJICAgICB0aGUgZmlyc3QgdmVjdG9yIHJlZ2lzdGVyLiAgVGhlIFZSIHNhdmUg YXJlYSBsaWVzIGJlbG93CgkgICAgIHRoZSBHUiBvbmUsIGFuZCBpcyBhbGlnbmVkIHRvIDE2IGJ5 dGVzLiAgKi8KCSAgb2ZmID0gLVJPVU5EX1VQIChncl9zYXZlZCAqIFVOSVRTX1BFUl9XT1JELAoJ CQkgICBTVEFDS19CT1VOREFSWSAvIEJJVFNfUEVSX1VOSVQpOwoJICBvZmYgLT0gdnJfc2F2ZWQg KiBVTklUU19QRVJfVlJFRzsKCgkgIHZyX3N0YXJ0ID0gVjBfUkVHTlVNICsgbG9jYWxfY3VtLmFh cGNzX252cm47CgkgIGZvciAoaSA9IDA7IGkgPCB2cl9zYXZlZDsgKytpKQoJICAgIHsKCSAgICAg IHJ0eCBwdHIsIG1lbTsKCgkgICAgICBwdHIgPSBwbHVzX2NvbnN0YW50IChQbW9kZSwgdmlydHVh bF9pbmNvbWluZ19hcmdzX3J0eCwgb2ZmKTsKCSAgICAgIG1lbSA9IGdlbl9mcmFtZV9tZW0gKG1v ZGUsIHB0cik7CgkgICAgICBzZXRfbWVtX2FsaWFzX3NldCAobWVtLCBnZXRfdmFyYXJnc19hbGlh c19zZXQgKCkpOwoJICAgICAgYWFyY2g2NF9lbWl0X21vdmUgKG1lbSwgZ2VuX3J0eF9SRUcgKG1v ZGUsIHZyX3N0YXJ0ICsgaSkpOwoJICAgICAgb2ZmICs9IFVOSVRTX1BFUl9WUkVHOwoJICAgIH0K CX0KICAgIH0KCiAgLyogV2UgZG9uJ3Qgc2F2ZSB0aGUgc2l6ZSBpbnRvICpQUkVURU5EX1NJWkUg YmVjYXVzZSB3ZSB3YW50IHRvIGF2b2lkCiAgICAgYW55IGNvbXBsaWNhdGlvbiBvZiBoYXZpbmcg Y3J0bC0+YXJncy5wcmV0ZW5kX2FyZ3Nfc2l6ZSBjaGFuZ2VkLiAgKi8KICBjZnVuLT5tYWNoaW5l LT5mcmFtZS5zYXZlZF92YXJhcmdzX3NpemUKICAgID0gKFJPVU5EX1VQIChncl9zYXZlZCAqIFVO SVRTX1BFUl9XT1JELAoJCSBTVEFDS19CT1VOREFSWSAvIEJJVFNfUEVSX1VOSVQpCiAgICAgICAr IHZyX3NhdmVkICogVU5JVFNfUEVSX1ZSRUcpOwp9CgpzdGF0aWMgdm9pZAphYXJjaDY0X2NvbmRp dGlvbmFsX3JlZ2lzdGVyX3VzYWdlICh2b2lkKQp7CiAgaW50IGk7CiAgaWYgKCFUQVJHRVRfRkxP QVQpCiAgICB7CiAgICAgIGZvciAoaSA9IFYwX1JFR05VTTsgaSA8PSBWMzFfUkVHTlVNOyBpKysp Cgl7CgkgIGZpeGVkX3JlZ3NbaV0gPSAxOwoJICBjYWxsX3VzZWRfcmVnc1tpXSA9IDE7CgkgIENM RUFSX0hBUkRfUkVHX0JJVCAob3BlcmFuZF9yZWdfc2V0LCBpKTsKCX0KICAgIH0KICBpZiAoIVRB UkdFVF9TVkUpCiAgICBmb3IgKGkgPSBQMF9SRUdOVU07IGkgPD0gUDE1X1JFR05VTTsgaSsrKQog ICAgICB7CglmaXhlZF9yZWdzW2ldID0gMTsKCWNhbGxfdXNlZF9yZWdzW2ldID0gMTsKICAgICAg fQoKICAvKiBPbmx5IGFsbG93IHRoZSBGRlIgYW5kIEZGUlQgdG8gYmUgYWNjZXNzZWQgdmlhIHNw ZWNpYWwgcGF0dGVybnMuICAqLwogIENMRUFSX0hBUkRfUkVHX0JJVCAob3BlcmFuZF9yZWdfc2V0 LCBGRlJfUkVHTlVNKTsKICBDTEVBUl9IQVJEX1JFR19CSVQgKG9wZXJhbmRfcmVnX3NldCwgRkZS VF9SRUdOVU0pOwoKICAvKiBXaGVuIHRyYWNraW5nIHNwZWN1bGF0aW9uLCB3ZSBuZWVkIGEgY291 cGxlIG9mIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVycwogICAgIHRvIHRyYWNrIHRoZSBzcGVjdWxh dGlvbiBzdGF0ZS4gIEl0IHdvdWxkIGJlIG5pY2UgdG8ganVzdCB1c2UKICAgICBJUDAgYW5kIElQ MSwgYnV0IGN1cnJlbnRseSB0aGVyZSBhcmUgbnVtZXJvdXMgcGxhY2VzIHRoYXQganVzdAogICAg IGFzc3VtZSB0aGVzZSByZWdpc3RlcnMgYXJlIGZyZWUgZm9yIG90aGVyIHVzZXMgKGVnIHBvaW50 ZXIKICAgICBhdXRoZW50aWNhdGlvbikuICAqLwogIGlmIChhYXJjaDY0X3RyYWNrX3NwZWN1bGF0 aW9uKQogICAgewogICAgICBmaXhlZF9yZWdzW1NQRUNVTEFUSU9OX1RSQUNLRVJfUkVHTlVNXSA9 IDE7CiAgICAgIGNhbGxfdXNlZF9yZWdzW1NQRUNVTEFUSU9OX1RSQUNLRVJfUkVHTlVNXSA9IDE7 CiAgICAgIGZpeGVkX3JlZ3NbU1BFQ1VMQVRJT05fU0NSQVRDSF9SRUdOVU1dID0gMTsKICAgICAg Y2FsbF91c2VkX3JlZ3NbU1BFQ1VMQVRJT05fU0NSQVRDSF9SRUdOVU1dID0gMTsKICAgIH0KfQoK LyogSW1wbGVtZW50IFRBUkdFVF9NRU1CRVJfVFlQRV9GT1JDRVNfQkxLLiAgKi8KCmJvb2wKYWFy Y2g2NF9tZW1iZXJfdHlwZV9mb3JjZXNfYmxrIChjb25zdF90cmVlIGZpZWxkX29yX2FycmF5LCBt YWNoaW5lX21vZGUgbW9kZSkKewogIC8qIEZvciByZWNvcmRzIHdlJ3JlIHBhc3NlZCBhIEZJRUxE X0RFQ0wsIGZvciBhcnJheXMgd2UncmUgcGFzc2VkCiAgICAgYW4gQVJSQVlfVFlQRS4gIEluIGJv dGggY2FzZXMgd2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgVFJFRV9UWVBFLiAgKi8KICBjb25zdF90 cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGZpZWxkX29yX2FycmF5KTsKCiAgLyogQXNzaWduIEJMS21v ZGUgdG8gYW55dGhpbmcgdGhhdCBjb250YWlucyBtdWx0aXBsZSBTVkUgcHJlZGljYXRlcy4KICAg ICBGb3Igc3RydWN0dXJlcywgdGhlICJtdWx0aXBsZSIgY2FzZSBpcyBpbmRpY2F0ZWQgYnkgTU9E RSBiZWluZwogICAgIFZPSURtb2RlLiAgKi8KICB1bnNpZ25lZCBpbnQgbnVtX3pyLCBudW1fcHI7 CiAgaWYgKGFhcmNoNjRfc3ZlOjpidWlsdGluX3R5cGVfcCAodHlwZSwgJm51bV96ciwgJm51bV9w cikgJiYgbnVtX3ByICE9IDApCiAgICB7CiAgICAgIGlmIChUUkVFX0NPREUgKGZpZWxkX29yX2Fy cmF5KSA9PSBBUlJBWV9UWVBFKQoJcmV0dXJuICFzaW1wbGVfY3N0X2VxdWFsIChUWVBFX1NJWkUg KGZpZWxkX29yX2FycmF5KSwKCQkJCSAgVFlQRV9TSVpFICh0eXBlKSk7CiAgICAgIHJldHVybiBt b2RlID09IFZPSURtb2RlOwogICAgfQoKICByZXR1cm4gZGVmYXVsdF9tZW1iZXJfdHlwZV9mb3Jj ZXNfYmxrIChmaWVsZF9vcl9hcnJheSwgbW9kZSk7Cn0KCi8qIEJpdG1hc2tzIHRoYXQgaW5kaWNh dGUgd2hldGhlciBlYXJsaWVyIHZlcnNpb25zIG9mIEdDQyB3b3VsZCBoYXZlCiAgIHRha2VuIGEg ZGlmZmVyZW50IHBhdGggdGhyb3VnaCB0aGUgQUJJIGxvZ2ljLiAgVGhpcyBzaG91bGQgcmVzdWx0 IGluCiAgIGEgLVdwc2FiaSB3YXJuaW5nIGlmIHRoZSBlYXJsaWVyIHBhdGggbGVkIHRvIGEgZGlm ZmVyZW50IEFCSSBkZWNpc2lvbi4KCiAgIFdBUk5fUFNBQklfRU1QVFlfQ1hYMTdfQkFTRQogICAg ICBJbmRpY2F0ZXMgdGhhdCB0aGUgdHlwZSBpbmNsdWRlcyBhbiBhcnRpZmljaWFsIGVtcHR5IEMr KzE3IGJhc2UgZmllbGQKICAgICAgdGhhdCwgcHJpb3IgdG8gR0NDIDEwLjEsIHdvdWxkIHByZXZl bnQgdGhlIHR5cGUgZnJvbSBiZWluZyB0cmVhdGVkIGFzCiAgICAgIGEgSEZBIG9yIEhWQS4gIFNl ZSBQUjk0MzgzIGZvciBkZXRhaWxzLgoKICAgV0FSTl9QU0FCSV9OT19VTklRVUVfQUREUkVTUwog ICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgdHlwZSBpbmNsdWRlcyBhbiBlbXB0eSBbW25vX3VuaXF1 ZV9hZGRyZXNzXV0gZmllbGQKICAgICAgdGhhdCwgcHJpb3IgdG8gR0NDIDEwLjEsIHdvdWxkIHBy ZXZlbnQgdGhlIHR5cGUgZnJvbSBiZWluZyB0cmVhdGVkIGFzCiAgICAgIGEgSEZBIG9yIEhWQS4g ICovCmNvbnN0IHVuc2lnbmVkIGludCBXQVJOX1BTQUJJX0VNUFRZX0NYWDE3X0JBU0UgPSAxVSA8 PCAwOwpjb25zdCB1bnNpZ25lZCBpbnQgV0FSTl9QU0FCSV9OT19VTklRVUVfQUREUkVTUyA9IDFV IDw8IDE7CmNvbnN0IHVuc2lnbmVkIGludCBXQVJOX1BTQUJJX1pFUk9fV0lEVEhfQklURklFTEQg PSAxVSA8PCAyOwoKLyogV2FsayBkb3duIHRoZSB0eXBlIHRyZWUgb2YgVFlQRSBjb3VudGluZyBj b25zZWN1dGl2ZSBiYXNlIGVsZW1lbnRzLgogICBJZiAqTU9ERVAgaXMgVk9JRG1vZGUsIHRoZW4g c2V0IGl0IHRvIHRoZSBmaXJzdCB2YWxpZCBmbG9hdGluZyBwb2ludAogICB0eXBlLiAgSWYgYSBu b24tZmxvYXRpbmcgcG9pbnQgdHlwZSBpcyBmb3VuZCwgb3IgaWYgYSBmbG9hdGluZyBwb2ludAog ICB0eXBlIHRoYXQgZG9lc24ndCBtYXRjaCBhIG5vbi1WT0lEbW9kZSAqTU9ERVAgaXMgZm91bmQs IHRoZW4gcmV0dXJuIC0xLAogICBvdGhlcndpc2UgcmV0dXJuIHRoZSBjb3VudCBpbiB0aGUgc3Vi LXRyZWUuCgogICBUaGUgV0FSTl9QU0FCSV9GTEFHUyBhcmd1bWVudCBhbGxvd3MgdGhlIGNhbGxl ciB0byBjaGVjayB3aGV0aGVyIHRoaXMKICAgZnVuY3Rpb24gaGFzIGNoYW5nZWQgaXRzIGJlaGF2 aW9yIHJlbGF0aXZlIHRvIGVhcmxpZXIgdmVyc2lvbnMgb2YgR0NDLgogICBOb3JtYWxseSB0aGUg YXJndW1lbnQgc2hvdWxkIGJlIG5vbm51bGwgYW5kIHBvaW50IHRvIGEgemVyby1pbml0aWFsaXpl ZAogICB2YXJpYWJsZS4gIFRoZSBmdW5jdGlvbiB0aGVuIHJlY29yZHMgd2hldGhlciB0aGUgQUJJ IGRlY2lzaW9uIG1pZ2h0CiAgIGJlIGFmZmVjdGVkIGJ5IGEga25vd24gZml4IHRvIHRoZSBBQkkg bG9naWMsIHNldHRpbmcgdGhlIGFzc29jaWF0ZWQKICAgV0FSTl9QU0FCSV8qIGJpdHMgaWYgc28u CgogICBXaGVuIHRoZSBhcmd1bWVudCBpcyBpbnN0ZWFkIGEgbnVsbCBwb2ludGVyLCB0aGUgZnVu Y3Rpb24gdHJpZXMgdG8KICAgc2ltdWxhdGUgdGhlIGJlaGF2aW9yIG9mIEdDQyBiZWZvcmUgYWxs IHN1Y2ggQUJJIGZpeGVzIHdlcmUgbWFkZS4KICAgVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgd2hl dGhlciB0aGUgZnVuY3Rpb24gcmV0dXJucyBzb21ldGhpbmcKICAgZGlmZmVyZW50IGFmdGVyIHRo ZSBBQkkgZml4ZXMuICAqLwpzdGF0aWMgaW50CmFhcGNzX3ZmcF9zdWJfY2FuZGlkYXRlIChjb25z dF90cmVlIHR5cGUsIG1hY2hpbmVfbW9kZSAqbW9kZXAsCgkJCSB1bnNpZ25lZCBpbnQgKndhcm5f cHNhYmlfZmxhZ3MpCnsKICBtYWNoaW5lX21vZGUgbW9kZTsKICBIT1NUX1dJREVfSU5UIHNpemU7 CgogIGlmIChhYXJjaDY0X3N2ZTo6YnVpbHRpbl90eXBlX3AgKHR5cGUpKQogICAgcmV0dXJuIC0x OwoKICBzd2l0Y2ggKFRSRUVfQ09ERSAodHlwZSkpCiAgICB7CiAgICBjYXNlIFJFQUxfVFlQRToK ICAgICAgbW9kZSA9IFRZUEVfTU9ERSAodHlwZSk7CiAgICAgIGlmIChtb2RlICE9IERGbW9kZSAm JiBtb2RlICE9IFNGbW9kZQoJICAmJiBtb2RlICE9IFRGbW9kZSAmJiBtb2RlICE9IEhGbW9kZQoJ ICAmJiBtb2RlICE9IFNEbW9kZSAmJiBtb2RlICE9IEREbW9kZSAmJiBtb2RlICE9IFREbW9kZSkK CXJldHVybiAtMTsKCiAgICAgIGlmICgqbW9kZXAgPT0gVk9JRG1vZGUpCgkqbW9kZXAgPSBtb2Rl OwoKICAgICAgaWYgKCptb2RlcCA9PSBtb2RlKQoJcmV0dXJuIDE7CgogICAgICBicmVhazsKCiAg ICBjYXNlIENPTVBMRVhfVFlQRToKICAgICAgbW9kZSA9IFRZUEVfTU9ERSAoVFJFRV9UWVBFICh0 eXBlKSk7CiAgICAgIGlmIChtb2RlICE9IERGbW9kZSAmJiBtb2RlICE9IFNGbW9kZQoJICAmJiBt b2RlICE9IFRGbW9kZSAmJiBtb2RlICE9IEhGbW9kZSkKCXJldHVybiAtMTsKCiAgICAgIGlmICgq bW9kZXAgPT0gVk9JRG1vZGUpCgkqbW9kZXAgPSBtb2RlOwoKICAgICAgaWYgKCptb2RlcCA9PSBt b2RlKQoJcmV0dXJuIDI7CgogICAgICBicmVhazsKCiAgICBjYXNlIFZFQ1RPUl9UWVBFOgogICAg ICAvKiBVc2UgVjJTSW1vZGUgYW5kIFY0U0ltb2RlIGFzIHJlcHJlc2VudGF0aXZlcyBvZiBhbGwg NjQtYml0CgkgYW5kIDEyOC1iaXQgdmVjdG9yIHR5cGVzLiAgKi8KICAgICAgc2l6ZSA9IGludF9z aXplX2luX2J5dGVzICh0eXBlKTsKICAgICAgc3dpdGNoIChzaXplKQoJewoJY2FzZSA4OgoJICBt b2RlID0gVjJTSW1vZGU7CgkgIGJyZWFrOwoJY2FzZSAxNjoKCSAgbW9kZSA9IFY0U0ltb2RlOwoJ ICBicmVhazsKCWRlZmF1bHQ6CgkgIHJldHVybiAtMTsKCX0KCiAgICAgIGlmICgqbW9kZXAgPT0g Vk9JRG1vZGUpCgkqbW9kZXAgPSBtb2RlOwoKICAgICAgLyogVmVjdG9yIG1vZGVzIGFyZSBjb25z aWRlcmVkIHRvIGJlIG9wYXF1ZTogdHdvIHZlY3RvcnMgYXJlCgkgZXF1aXZhbGVudCBmb3IgdGhl IHB1cnBvc2VzIG9mIGJlaW5nIGhvbW9nZW5lb3VzIGFnZ3JlZ2F0ZXMKCSBpZiB0aGV5IGFyZSB0 aGUgc2FtZSBzaXplLiAgKi8KICAgICAgaWYgKCptb2RlcCA9PSBtb2RlKQoJcmV0dXJuIDE7Cgog ICAgICBicmVhazsKCiAgICBjYXNlIEFSUkFZX1RZUEU6CiAgICAgIHsKCWludCBjb3VudDsKCXRy ZWUgaW5kZXggPSBUWVBFX0RPTUFJTiAodHlwZSk7CgoJLyogQ2FuJ3QgaGFuZGxlIGluY29tcGxl dGUgdHlwZXMgbm9yIHNpemVzIHRoYXQgYXJlIG5vdAoJICAgZml4ZWQuICAqLwoJaWYgKCFDT01Q TEVURV9UWVBFX1AgKHR5cGUpCgkgICAgfHwgVFJFRV9DT0RFIChUWVBFX1NJWkUgKHR5cGUpKSAh PSBJTlRFR0VSX0NTVCkKCSAgcmV0dXJuIC0xOwoKCWNvdW50ID0gYWFwY3NfdmZwX3N1Yl9jYW5k aWRhdGUgKFRSRUVfVFlQRSAodHlwZSksIG1vZGVwLAoJCQkJCSB3YXJuX3BzYWJpX2ZsYWdzKTsK CWlmIChjb3VudCA9PSAtMQoJICAgIHx8ICFpbmRleAoJICAgIHx8ICFUWVBFX01BWF9WQUxVRSAo aW5kZXgpCgkgICAgfHwgIXRyZWVfZml0c191aHdpX3AgKFRZUEVfTUFYX1ZBTFVFIChpbmRleCkp CgkgICAgfHwgIVRZUEVfTUlOX1ZBTFVFIChpbmRleCkKCSAgICB8fCAhdHJlZV9maXRzX3Vod2lf cCAoVFlQRV9NSU5fVkFMVUUgKGluZGV4KSkKCSAgICB8fCBjb3VudCA8IDApCgkgIHJldHVybiAt MTsKCgljb3VudCAqPSAoMSArIHRyZWVfdG9fdWh3aSAoVFlQRV9NQVhfVkFMVUUgKGluZGV4KSkK CQkgICAgICAtIHRyZWVfdG9fdWh3aSAoVFlQRV9NSU5fVkFMVUUgKGluZGV4KSkpOwoKCS8qIFRo ZXJlIG11c3QgYmUgbm8gcGFkZGluZy4gICovCglpZiAobWF5YmVfbmUgKHdpOjp0b19wb2x5X3dp ZGUgKFRZUEVfU0laRSAodHlwZSkpLAoJCSAgICAgIGNvdW50ICogR0VUX01PREVfQklUU0laRSAo Km1vZGVwKSkpCgkgIHJldHVybiAtMTsKCglyZXR1cm4gY291bnQ7CiAgICAgIH0KCiAgICBjYXNl IFJFQ09SRF9UWVBFOgogICAgICB7CglpbnQgY291bnQgPSAwOwoJaW50IHN1Yl9jb3VudDsKCXRy ZWUgZmllbGQ7CgoJLyogQ2FuJ3QgaGFuZGxlIGluY29tcGxldGUgdHlwZXMgbm9yIHNpemVzIHRo YXQgYXJlIG5vdAoJICAgZml4ZWQuICAqLwoJaWYgKCFDT01QTEVURV9UWVBFX1AgKHR5cGUpCgkg ICAgfHwgVFJFRV9DT0RFIChUWVBFX1NJWkUgKHR5cGUpKSAhPSBJTlRFR0VSX0NTVCkKCSAgcmV0 dXJuIC0xOwoKCWZvciAoZmllbGQgPSBUWVBFX0ZJRUxEUyAodHlwZSk7IGZpZWxkOyBmaWVsZCA9 IFRSRUVfQ0hBSU4gKGZpZWxkKSkKCSAgewoJICAgIGlmIChUUkVFX0NPREUgKGZpZWxkKSAhPSBG SUVMRF9ERUNMKQoJICAgICAgY29udGludWU7CgoJICAgIGlmIChERUNMX0ZJRUxEX0FCSV9JR05P UkVEIChmaWVsZCkpCgkgICAgICB7CgkJLyogU2VlIHdoZXRoZXIgdGhpcyBpcyBzb21ldGhpbmcg dGhhdCBlYXJsaWVyIHZlcnNpb25zIG9mCgkJICAgR0NDIGZhaWxlZCB0byBpZ25vcmUuICAqLwoJ CXVuc2lnbmVkIGludCBmbGFnOwoJCWlmIChsb29rdXBfYXR0cmlidXRlICgibm9fdW5pcXVlX2Fk ZHJlc3MiLAoJCQkJICAgICAgREVDTF9BVFRSSUJVVEVTIChmaWVsZCkpKQoJCSAgZmxhZyA9IFdB Uk5fUFNBQklfTk9fVU5JUVVFX0FERFJFU1M7CgkJZWxzZSBpZiAoY3h4MTdfZW1wdHlfYmFzZV9m aWVsZF9wIChmaWVsZCkpCgkJICBmbGFnID0gV0FSTl9QU0FCSV9FTVBUWV9DWFgxN19CQVNFOwoJ CWVsc2UKCQkgIC8qIE5vIGNvbXBhdGliaWxpdHkgcHJvYmxlbS4gICovCgkJICBjb250aW51ZTsK CgkJLyogU2ltdWxhdGUgdGhlIG9sZCBiZWhhdmlvciB3aGVuIFdBUk5fUFNBQklfRkxBR1MgaXMg bnVsbC4gICovCgkJaWYgKHdhcm5fcHNhYmlfZmxhZ3MpCgkJICB7CgkJICAgICp3YXJuX3BzYWJp X2ZsYWdzIHw9IGZsYWc7CgkJICAgIGNvbnRpbnVlOwoJCSAgfQoJICAgICAgfQoJICAgIC8qIEEg emVyby13aWR0aCBiaXRmaWVsZCBtYXkgYWZmZWN0IGxheW91dCBpbiBzb21lCgkgICAgICAgY2ly Y3Vtc3RhbmNlcywgYnV0IGFkZHMgbm8gbWVtYmVycy4gIFRoZSBkZXRlcm1pbmF0aW9uCgkgICAg ICAgb2Ygd2hldGhlciBvciBub3QgYSB0eXBlIGlzIGFuIEhGQSBpcyBwZXJmb3JtZWQgYWZ0ZXIK CSAgICAgICBsYXlvdXQgaXMgY29tcGxldGUsIHNvIGlmIHRoZSB0eXBlIHN0aWxsIGxvb2tzIGxp a2UgYW4KCSAgICAgICBIRkEgYWZ0ZXJ3YXJkcywgaXQgaXMgc3RpbGwgY2xhc3NlZCBhcyBvbmUu ICBUaGlzIGlzCgkgICAgICAgcG90ZW50aWFsbHkgYW4gQUJJIGJyZWFrIGZvciB0aGUgaGFyZC1m bG9hdCBBQkkuICAqLwoJICAgIGVsc2UgaWYgKERFQ0xfQklUX0ZJRUxEIChmaWVsZCkKCQkgICAg ICYmIGludGVnZXJfemVyb3AgKERFQ0xfU0laRSAoZmllbGQpKSkKCSAgICAgIHsKCQkvKiBQcmlv ciB0byBHQ0MtMTIgdGhlc2UgZmllbGRzIHdlcmUgc3RyaXBlZCBlYXJseSwKCQkgICBoaWRpbmcg dGhlbSBmcm9tIHRoZSBiYWNrLWVuZCBlbnRpcmVseSBhbmQKCQkgICByZXN1bHRpbmcgaW4gdGhl IGNvcnJlY3QgYmVoYXZpb3VyIGZvciBhcmd1bWVudAoJCSAgIHBhc3NpbmcuICBTaW11bGF0ZSB0 aGF0IG9sZCBiZWhhdmlvdXIgd2l0aG91dAoJCSAgIGdlbmVyYXRpbmcgYSB3YXJuaW5nLiAgKi8K CQlpZiAoREVDTF9GSUVMRF9DWFhfWkVST19XSURUSF9CSVRfRklFTEQgKGZpZWxkKSkKCQkgIGNv bnRpbnVlOwoJCWlmICh3YXJuX3BzYWJpX2ZsYWdzKQoJCSAgewoJCSAgICAqd2Fybl9wc2FiaV9m bGFncyB8PSBXQVJOX1BTQUJJX1pFUk9fV0lEVEhfQklURklFTEQ7CgkJICAgIGNvbnRpbnVlOwoJ CSAgfQoJICAgICAgfQoKCSAgICBzdWJfY291bnQgPSBhYXBjc192ZnBfc3ViX2NhbmRpZGF0ZSAo VFJFRV9UWVBFIChmaWVsZCksIG1vZGVwLAoJCQkJCQkgd2Fybl9wc2FiaV9mbGFncyk7CgkgICAg aWYgKHN1Yl9jb3VudCA8IDApCgkgICAgICByZXR1cm4gLTE7CgkgICAgY291bnQgKz0gc3ViX2Nv dW50OwoJICB9CgoJLyogVGhlcmUgbXVzdCBiZSBubyBwYWRkaW5nLiAgKi8KCWlmIChtYXliZV9u ZSAod2k6OnRvX3BvbHlfd2lkZSAoVFlQRV9TSVpFICh0eXBlKSksCgkJICAgICAgY291bnQgKiBH RVRfTU9ERV9CSVRTSVpFICgqbW9kZXApKSkKCSAgcmV0dXJuIC0xOwoKCXJldHVybiBjb3VudDsK ICAgICAgfQoKICAgIGNhc2UgVU5JT05fVFlQRToKICAgIGNhc2UgUVVBTF9VTklPTl9UWVBFOgog ICAgICB7CgkvKiBUaGVzZSBhcmVuJ3QgdmVyeSBpbnRlcmVzdGluZyBleGNlcHQgaW4gYSBkZWdl bmVyYXRlIGNhc2UuICAqLwoJaW50IGNvdW50ID0gMDsKCWludCBzdWJfY291bnQ7Cgl0cmVlIGZp ZWxkOwoKCS8qIENhbid0IGhhbmRsZSBpbmNvbXBsZXRlIHR5cGVzIG5vciBzaXplcyB0aGF0IGFy ZSBub3QKCSAgIGZpeGVkLiAgKi8KCWlmICghQ09NUExFVEVfVFlQRV9QICh0eXBlKQoJICAgIHx8 IFRSRUVfQ09ERSAoVFlQRV9TSVpFICh0eXBlKSkgIT0gSU5URUdFUl9DU1QpCgkgIHJldHVybiAt MTsKCglmb3IgKGZpZWxkID0gVFlQRV9GSUVMRFMgKHR5cGUpOyBmaWVsZDsgZmllbGQgPSBUUkVF X0NIQUlOIChmaWVsZCkpCgkgIHsKCSAgICBpZiAoVFJFRV9DT0RFIChmaWVsZCkgIT0gRklFTERf REVDTCkKCSAgICAgIGNvbnRpbnVlOwoKCSAgICBzdWJfY291bnQgPSBhYXBjc192ZnBfc3ViX2Nh bmRpZGF0ZSAoVFJFRV9UWVBFIChmaWVsZCksIG1vZGVwLAoJCQkJCQkgd2Fybl9wc2FiaV9mbGFn cyk7CgkgICAgaWYgKHN1Yl9jb3VudCA8IDApCgkgICAgICByZXR1cm4gLTE7CgkgICAgY291bnQg PSBjb3VudCA+IHN1Yl9jb3VudCA/IGNvdW50IDogc3ViX2NvdW50OwoJICB9CgoJLyogVGhlcmUg bXVzdCBiZSBubyBwYWRkaW5nLiAgKi8KCWlmIChtYXliZV9uZSAod2k6OnRvX3BvbHlfd2lkZSAo VFlQRV9TSVpFICh0eXBlKSksCgkJICAgICAgY291bnQgKiBHRVRfTU9ERV9CSVRTSVpFICgqbW9k ZXApKSkKCSAgcmV0dXJuIC0xOwoKCXJldHVybiBjb3VudDsKICAgICAgfQoKICAgIGRlZmF1bHQ6 CiAgICAgIGJyZWFrOwogICAgfQoKICByZXR1cm4gLTE7Cn0KCi8qIFJldHVybiBUUlVFIGlmIHRo ZSB0eXBlLCBhcyBkZXNjcmliZWQgYnkgVFlQRSBhbmQgTU9ERSwgaXMgYSBzaG9ydCB2ZWN0b3IK ICAgdHlwZSBhcyBkZXNjcmliZWQgaW4gQUFQQ1M2NCBcUyA0LjEuMi4KCiAgIFNlZSB0aGUgY29t bWVudCBhYm92ZSBhYXJjaDY0X2NvbXBvc2l0ZV90eXBlX3AgZm9yIHRoZSBub3RlcyBvbiBNT0RF LiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfc2hvcnRfdmVjdG9yX3AgKGNvbnN0X3RyZWUgdHlw ZSwKCQkJbWFjaGluZV9tb2RlIG1vZGUpCnsKICBwb2x5X2ludDY0IHNpemUgPSAtMTsKCiAgaWYg KHR5cGUgJiYgVkVDVE9SX1RZUEVfUCAodHlwZSkpCiAgICB7CiAgICAgIGlmIChhYXJjaDY0X3N2 ZTo6YnVpbHRpbl90eXBlX3AgKHR5cGUpKQoJcmV0dXJuIGZhbHNlOwogICAgICBzaXplID0gaW50 X3NpemVfaW5fYnl0ZXMgKHR5cGUpOwogICAgfQogIGVsc2UgaWYgKEdFVF9NT0RFX0NMQVNTICht b2RlKSA9PSBNT0RFX1ZFQ1RPUl9JTlQKCSAgIHx8IEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBN T0RFX1ZFQ1RPUl9GTE9BVCkKICAgIHsKICAgICAgLyogVGhlIGNvbnRhaW5pbmcgImVsc2UgaWYi IGlzIHRvbyBsb29zZTogaXQgbWVhbnMgdGhhdCB3ZSBsb29rIGF0IFRZUEUKCSBpZiB0aGUgdHlw ZSBpcyBhIHZlY3RvciB0eXBlIChnb29kKSwgYnV0IHRoYXQgd2Ugb3RoZXJ3aXNlIGlnbm9yZSBU WVBFCgkgYW5kIGxvb2sgb25seSBhdCB0aGUgbW9kZS4gIFRoaXMgaXMgd3JvbmcgYmVjYXVzZSB0 aGUgdHlwZSBkZXNjcmliZXMKCSB0aGUgbGFuZ3VhZ2UtbGV2ZWwgaW5mb3JtYXRpb24gd2hlcmVh cyB0aGUgbW9kZSBpcyBwdXJlbHkgYW4gaW50ZXJuYWwKCSBHQ0MgY29uY2VwdC4gIFdlIGNhbiB0 aGVyZWZvcmUgcmVhY2ggaGVyZSBmb3IgdHlwZXMgdGhhdCBhcmUgbm90CgkgdmVjdG9ycyBpbiB0 aGUgQUFQQ1M2NCBzZW5zZS4KCgkgV2UgY2FuJ3QgImZpeCIgdGhhdCBmb3IgdGhlIHRyYWRpdGlv bmFsIEFkdmFuY2VkIFNJTUQgdmVjdG9yIG1vZGVzCgkgd2l0aG91dCBicmVha2luZyBiYWNrd2Fy ZHMgY29tcGF0aWJpbGl0eS4gIEhvd2V2ZXIsIHRoZXJlJ3Mgbm8gc3VjaAoJIGJhZ2dhZ2UgZm9y IHRoZSBzdHJ1Y3R1cmUgbW9kZXMsIHdoaWNoIHdlcmUgaW50cm9kdWNlZCBpbiBHQ0MgMTIuICAq LwogICAgICBpZiAoYWFyY2g2NF9hZHZzaW1kX3N0cnVjdF9tb2RlX3AgKG1vZGUpKQoJcmV0dXJu IGZhbHNlOwoKICAgICAgLyogRm9yIHNpbWlsYXIgcmVhc29ucywgcmVseSBvbmx5IG9uIHRoZSB0 eXBlLCBub3QgdGhlIG1vZGUsIHdoZW4KCSBwcm9jZXNzaW5nIFNWRSB0eXBlcy4gICovCiAgICAg IGlmICh0eXBlICYmIGFhcmNoNjRfc29tZV92YWx1ZXNfaW5jbHVkZV9wc3Rfb2JqZWN0c19wICh0 eXBlKSkKCS8qIExlYXZlIGxhdGVyIGNvZGUgdG8gcmVwb3J0IGFuIGVycm9yIGlmIFNWRSBpcyBk aXNhYmxlZC4gICovCglnY2NfYXNzZXJ0ICghVEFSR0VUX1NWRSB8fCBhYXJjaDY0X3N2ZV9tb2Rl X3AgKG1vZGUpKTsKICAgICAgZWxzZQoJc2l6ZSA9IEdFVF9NT0RFX1NJWkUgKG1vZGUpOwogICAg fQogIGlmIChrbm93bl9lcSAoc2l6ZSwgOCkgfHwga25vd25fZXEgKHNpemUsIDE2KSkKICAgIHsK ICAgICAgLyogNjQtYml0IGFuZCAxMjgtYml0IHZlY3RvcnMgc2hvdWxkIG9ubHkgYWNxdWlyZSBh biBTVkUgbW9kZSBpZgoJIHRoZXkgYXJlIGJlaW5nIHRyZWF0ZWQgYXMgc2NhbGFibGUgQUFQQ1M2 NCB0eXBlcy4gICovCiAgICAgIGdjY19hc3NlcnQgKCFhYXJjaDY0X3N2ZV9tb2RlX3AgKG1vZGUp CgkJICAmJiAhYWFyY2g2NF9hZHZzaW1kX3N0cnVjdF9tb2RlX3AgKG1vZGUpKTsKICAgICAgcmV0 dXJuIHRydWU7CiAgICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovKiBSZXR1cm4gVFJVRSBpZiB0aGUg dHlwZSwgYXMgZGVzY3JpYmVkIGJ5IFRZUEUgYW5kIE1PREUsIGlzIGEgY29tcG9zaXRlCiAgIHR5 cGUgYXMgZGVzY3JpYmVkIGluIEFBUENTNjQgXFMgNC4zLiAgVGhpcyBpbmNsdWRlcyBhZ2dyZWdh dGUsIHVuaW9uIGFuZAogICBhcnJheSB0eXBlcy4gIFRoZSBDOTkgZmxvYXRpbmctcG9pbnQgY29t cGxleCB0eXBlcyBhcmUgYWxzbyBjb25zaWRlcmVkCiAgIGFzIGNvbXBvc2l0ZSB0eXBlcywgYWNj b3JkaW5nIHRvIEFBUENTNjQgXFMgNy4xLjEuICBUaGUgY29tcGxleCBpbnRlZ2VyCiAgIHR5cGVz LCB3aGljaCBhcmUgR0NDIGV4dGVuc2lvbnMgYW5kIG91dCBvZiB0aGUgc2NvcGUgb2YgQUFQQ1M2 NCwgYXJlCiAgIHRyZWF0ZWQgYXMgY29tcG9zaXRlIHR5cGVzIGhlcmUgYXMgd2VsbC4KCiAgIE5v dGUgdGhhdCBNT0RFIGl0c2VsZiBpcyBub3Qgc3VmZmljaWVudCBpbiBkZXRlcm1pbmluZyB3aGV0 aGVyIGEgdHlwZQogICBpcyBzdWNoIGEgY29tcG9zaXRlIHR5cGUgb3Igbm90LiAgVGhpcyBpcyBi ZWNhdXNlCiAgIHN0b3ItbGF5b3V0LmNjOmNvbXB1dGVfcmVjb3JkX21vZGUgbWF5IGhhdmUgYWxy ZWFkeSBjaGFuZ2VkIHRoZSBNT0RFCiAgIChCTEttb2RlKSBvZiBhIFJFQ09SRF9UWVBFIFRZUEUg dG8gc29tZSBvdGhlciBtb2RlLiAgRm9yIGV4YW1wbGUsIGEKICAgc3RydWN0dXJlIHdpdGggb25s eSBvbmUgZmllbGQgbWF5IGhhdmUgaXRzIE1PREUgc2V0IHRvIHRoZSBtb2RlIG9mIHRoZQogICBm aWVsZC4gIEFsc28gYW4gaW50ZWdlciBtb2RlIHdob3NlIHNpemUgbWF0Y2hlcyB0aGUgc2l6ZSBv ZiB0aGUKICAgUkVDT1JEX1RZUEUgdHlwZSBtYXkgYmUgdXNlZCB0byBzdWJzdGl0dXRlIHRoZSBv cmlnaW5hbCBtb2RlCiAgIChpLmUuIEJMS21vZGUpIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcy4g IEluIG90aGVyIHdvcmRzLCBNT0RFIGNhbm5vdCBiZQogICBzb2xlbHkgcmVsaWVkIG9uLiAgKi8K CnN0YXRpYyBib29sCmFhcmNoNjRfY29tcG9zaXRlX3R5cGVfcCAoY29uc3RfdHJlZSB0eXBlLAoJ CQkgIG1hY2hpbmVfbW9kZSBtb2RlKQp7CiAgaWYgKGFhcmNoNjRfc2hvcnRfdmVjdG9yX3AgKHR5 cGUsIG1vZGUpKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAodHlwZSAmJiAoQUdHUkVHQVRFX1RZ UEVfUCAodHlwZSkgfHwgVFJFRV9DT0RFICh0eXBlKSA9PSBDT01QTEVYX1RZUEUpKQogICAgcmV0 dXJuIHRydWU7CgogIGlmIChtb2RlID09IEJMS21vZGUKICAgICAgfHwgR0VUX01PREVfQ0xBU1Mg KG1vZGUpID09IE1PREVfQ09NUExFWF9GTE9BVAogICAgICB8fCBHRVRfTU9ERV9DTEFTUyAobW9k ZSkgPT0gTU9ERV9DT01QTEVYX0lOVCkKICAgIHJldHVybiB0cnVlOwoKICByZXR1cm4gZmFsc2U7 Cn0KCi8qIFJldHVybiBUUlVFIGlmIGFuIGFyZ3VtZW50LCB3aG9zZSB0eXBlIGlzIGRlc2NyaWJl ZCBieSBUWVBFIGFuZCBNT0RFLAogICBzaGFsbCBiZSBwYXNzZWQgb3IgcmV0dXJuZWQgaW4gc2lt ZC9mcCByZWdpc3RlcihzKSAocHJvdmlkaW5nIHRoZXNlCiAgIHBhcmFtZXRlciBwYXNzaW5nIHJl Z2lzdGVycyBhcmUgYXZhaWxhYmxlKS4KCiAgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sICpDT1VO VCByZXR1cm5zIHRoZSBudW1iZXIgb2YgbmVlZGVkIHJlZ2lzdGVycywKICAgKkJBU0VfTU9ERSBy ZXR1cm5zIHRoZSBtb2RlIG9mIHRoZSBpbmRpdmlkdWFsIHJlZ2lzdGVyIGFuZCB3aGVuIElTX0hB CiAgIGlzIG5vdCBOVUxMLCAqSVNfSEEgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBhcmd1 bWVudCBpcyBhIGhvbW9nZW5lb3VzCiAgIGZsb2F0aW5nLXBvaW50IGFnZ3JlZ2F0ZSBvciBhIGhv bW9nZW5lb3VzIHNob3J0LXZlY3RvciBhZ2dyZWdhdGUuCgogICBTSUxFTlRfUCBpcyB0cnVlIGlm IHRoZSBmdW5jdGlvbiBzaG91bGQgcmVmcmFpbiBmcm9tIHJlcG9ydGluZyBhbnkKICAgZGlhZ25v c3RpY3MuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgdGhlIGNhbGxlciBpcyBjZXJ0YWlu IHRoYXQKICAgYW55IEFCSSBkZWNpc2lvbnMgd291bGQgZXZlbnR1YWxseSBjb21lIHRocm91Z2gg dGhpcyBmdW5jdGlvbiB3aXRoCiAgIFNJTEVOVF9QIHNldCB0byBmYWxzZS4gICovCgpzdGF0aWMg Ym9vbAphYXJjaDY0X3ZmcF9pc19jYWxsX29yX3JldHVybl9jYW5kaWRhdGUgKG1hY2hpbmVfbW9k ZSBtb2RlLAoJCQkJCSBjb25zdF90cmVlIHR5cGUsCgkJCQkJIG1hY2hpbmVfbW9kZSAqYmFzZV9t b2RlLAoJCQkJCSBpbnQgKmNvdW50LAoJCQkJCSBib29sICppc19oYSwKCQkJCQkgYm9vbCBzaWxl bnRfcCkKewogIGlmIChpc19oYSAhPSBOVUxMKSAqaXNfaGEgPSBmYWxzZTsKCiAgbWFjaGluZV9t b2RlIG5ld19tb2RlID0gVk9JRG1vZGU7CiAgYm9vbCBjb21wb3NpdGVfcCA9IGFhcmNoNjRfY29t cG9zaXRlX3R5cGVfcCAodHlwZSwgbW9kZSk7CgogIGlmICgoIWNvbXBvc2l0ZV9wCiAgICAgICAm JiAoR0VUX01PREVfQ0xBU1MgKG1vZGUpID09IE1PREVfRkxPQVQKCSAgIHx8IEdFVF9NT0RFX0NM QVNTIChtb2RlKSA9PSBNT0RFX0RFQ0lNQUxfRkxPQVQpKQogICAgICB8fCBhYXJjaDY0X3Nob3J0 X3ZlY3Rvcl9wICh0eXBlLCBtb2RlKSkKICAgIHsKICAgICAgKmNvdW50ID0gMTsKICAgICAgbmV3 X21vZGUgPSBtb2RlOwogICAgfQogIGVsc2UgaWYgKEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBN T0RFX0NPTVBMRVhfRkxPQVQpCiAgICB7CiAgICAgIGlmIChpc19oYSAhPSBOVUxMKSAqaXNfaGEg PSB0cnVlOwogICAgICAqY291bnQgPSAyOwogICAgICBuZXdfbW9kZSA9IEdFVF9NT0RFX0lOTkVS IChtb2RlKTsKICAgIH0KICBlbHNlIGlmICh0eXBlICYmIGNvbXBvc2l0ZV9wKQogICAgewogICAg ICB1bnNpZ25lZCBpbnQgd2Fybl9wc2FiaV9mbGFncyA9IDA7CiAgICAgIGludCBhZ19jb3VudCA9 IGFhcGNzX3ZmcF9zdWJfY2FuZGlkYXRlICh0eXBlLCAmbmV3X21vZGUsCgkJCQkJICAgICAgJndh cm5fcHNhYmlfZmxhZ3MpOwogICAgICBpZiAoYWdfY291bnQgPiAwICYmIGFnX2NvdW50IDw9IEhB X01BWF9OVU1fRkxEUykKCXsKCSAgc3RhdGljIHVuc2lnbmVkIGxhc3RfcmVwb3J0ZWRfdHlwZV91 aWQ7CgkgIHVuc2lnbmVkIHVpZCA9IFRZUEVfVUlEIChUWVBFX01BSU5fVkFSSUFOVCAodHlwZSkp OwoJICBpbnQgYWx0OwoJICBpZiAoIXNpbGVudF9wCgkgICAgICAmJiB3YXJuX3BzYWJpCgkgICAg ICAmJiB3YXJuX3BzYWJpX2ZsYWdzCgkgICAgICAmJiB1aWQgIT0gbGFzdF9yZXBvcnRlZF90eXBl X3VpZAoJICAgICAgJiYgKChhbHQgPSBhYXBjc192ZnBfc3ViX2NhbmRpZGF0ZSAodHlwZSwgJm5l d19tb2RlLCBOVUxMKSkKCQkgICE9IGFnX2NvdW50KSkKCSAgICB7CgkgICAgICBjb25zdCBjaGFy ICp1cmwxMAoJCT0gQ0hBTkdFU19ST09UX1VSTCAiZ2NjLTEwL2NoYW5nZXMuaHRtbCNlbXB0eV9i YXNlIjsKCSAgICAgIGNvbnN0IGNoYXIgKnVybDEyCgkJPSBDSEFOR0VTX1JPT1RfVVJMICJnY2Mt MTIvY2hhbmdlcy5odG1sI3plcm9fd2lkdGhfYml0ZmllbGRzIjsKCSAgICAgIGdjY19hc3NlcnQg KGFsdCA9PSAtMSk7CgkgICAgICBsYXN0X3JlcG9ydGVkX3R5cGVfdWlkID0gdWlkOwoJICAgICAg LyogVXNlIFRZUEVfTUFJTl9WQVJJQU5UIHRvIHN0cmlwIGFueSByZWR1bmRhbnQgY29uc3QKCQkg cXVhbGlmaWNhdGlvbi4gICovCgkgICAgICBpZiAod2Fybl9wc2FiaV9mbGFncyAmIFdBUk5fUFNB QklfTk9fVU5JUVVFX0FERFJFU1MpCgkJaW5mb3JtIChpbnB1dF9sb2NhdGlvbiwgInBhcmFtZXRl ciBwYXNzaW5nIGZvciBhcmd1bWVudCBvZiAiCgkJCSJ0eXBlICVxVCB3aXRoICU8W1tub191bmlx dWVfYWRkcmVzc11dJT4gbWVtYmVycyAiCgkJCSJjaGFuZ2VkICV7aW4gR0NDIDEwLjElfSIsCgkJ CVRZUEVfTUFJTl9WQVJJQU5UICh0eXBlKSwgdXJsMTApOwoJICAgICAgZWxzZSBpZiAod2Fybl9w c2FiaV9mbGFncyAmIFdBUk5fUFNBQklfRU1QVFlfQ1hYMTdfQkFTRSkKCQlpbmZvcm0gKGlucHV0 X2xvY2F0aW9uLCAicGFyYW1ldGVyIHBhc3NpbmcgZm9yIGFyZ3VtZW50IG9mICIKCQkJInR5cGUg JXFUIHdoZW4gQysrMTcgaXMgZW5hYmxlZCBjaGFuZ2VkIHRvIG1hdGNoICIKCQkJIkMrKzE0ICV7 aW4gR0NDIDEwLjElfSIsCgkJCVRZUEVfTUFJTl9WQVJJQU5UICh0eXBlKSwgdXJsMTApOwoJICAg ICAgZWxzZSBpZiAod2Fybl9wc2FiaV9mbGFncyAmIFdBUk5fUFNBQklfWkVST19XSURUSF9CSVRG SUVMRCkKCQlpbmZvcm0gKGlucHV0X2xvY2F0aW9uLCAicGFyYW1ldGVyIHBhc3NpbmcgZm9yIGFy Z3VtZW50IG9mICIKCQkJInR5cGUgJXFUIGNoYW5nZWQgJXtpbiBHQ0MgMTIuMSV9IiwKCQkJVFlQ RV9NQUlOX1ZBUklBTlQgKHR5cGUpLCB1cmwxMik7CgkgICAgfQoKCSAgaWYgKGlzX2hhICE9IE5V TEwpICppc19oYSA9IHRydWU7CgkgICpjb3VudCA9IGFnX2NvdW50OwoJfQogICAgICBlbHNlCgly ZXR1cm4gZmFsc2U7CiAgICB9CiAgZWxzZQogICAgcmV0dXJuIGZhbHNlOwoKICBnY2NfYXNzZXJ0 ICghYWFyY2g2NF9zdmVfbW9kZV9wIChuZXdfbW9kZSkpOwogICpiYXNlX21vZGUgPSBuZXdfbW9k ZTsKICByZXR1cm4gdHJ1ZTsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9TVFJVQ1RfVkFMVUVfUlRY LiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF9zdHJ1Y3RfdmFsdWVfcnR4ICh0cmVlIGZuZGVjbCBB VFRSSUJVVEVfVU5VU0VELAoJCQkgIGludCBpbmNvbWluZyBBVFRSSUJVVEVfVU5VU0VEKQp7CiAg cmV0dXJuIGdlbl9ydHhfUkVHIChQbW9kZSwgQUFSQ0g2NF9TVFJVQ1RfVkFMVUVfUkVHTlVNKTsK fQoKLyogSW1wbGVtZW50cyB0YXJnZXQgaG9vayB2ZWN0b3JfbW9kZV9zdXBwb3J0ZWRfcC4gICov CnN0YXRpYyBib29sCmFhcmNoNjRfdmVjdG9yX21vZGVfc3VwcG9ydGVkX3AgKG1hY2hpbmVfbW9k ZSBtb2RlKQp7CiAgdW5zaWduZWQgaW50IHZlY19mbGFncyA9IGFhcmNoNjRfY2xhc3NpZnlfdmVj dG9yX21vZGUgKG1vZGUpOwogIHJldHVybiB2ZWNfZmxhZ3MgIT0gMCAmJiAodmVjX2ZsYWdzICYg VkVDX1NUUlVDVCkgPT0gMDsKfQoKLyogUmV0dXJuIHRoZSBmdWxsLXdpZHRoIFNWRSB2ZWN0b3Ig bW9kZSBmb3IgZWxlbWVudCBtb2RlIE1PREUsIGlmIG9uZQogICBleGlzdHMuICAqLwpvcHRfbWFj aGluZV9tb2RlCmFhcmNoNjRfZnVsbF9zdmVfbW9kZSAoc2NhbGFyX21vZGUgbW9kZSkKewogIHN3 aXRjaCAobW9kZSkKICAgIHsKICAgIGNhc2UgRV9ERm1vZGU6CiAgICAgIHJldHVybiBWTngyREZt b2RlOwogICAgY2FzZSBFX1NGbW9kZToKICAgICAgcmV0dXJuIFZOeDRTRm1vZGU7CiAgICBjYXNl IEVfSEZtb2RlOgogICAgICByZXR1cm4gVk54OEhGbW9kZTsKICAgIGNhc2UgRV9CRm1vZGU6CiAg ICAgIHJldHVybiBWTng4QkZtb2RlOwogICAgY2FzZSBFX0RJbW9kZToKICAgICAgcmV0dXJuIFZO eDJESW1vZGU7CiAgICBjYXNlIEVfU0ltb2RlOgogICAgICByZXR1cm4gVk54NFNJbW9kZTsKICAg IGNhc2UgRV9ISW1vZGU6CiAgICAgIHJldHVybiBWTng4SEltb2RlOwogICAgY2FzZSBFX1FJbW9k ZToKICAgICAgcmV0dXJuIFZOeDE2UUltb2RlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG9w dF9tYWNoaW5lX21vZGUgKCk7CiAgICB9Cn0KCi8qIFJldHVybiB0aGUgMTI4LWJpdCBBZHZhbmNl ZCBTSU1EIHZlY3RvciBtb2RlIGZvciBlbGVtZW50IG1vZGUgTU9ERSwKICAgaWYgaXQgZXhpc3Rz LiAgKi8Kb3B0X21hY2hpbmVfbW9kZQphYXJjaDY0X3ZxX21vZGUgKHNjYWxhcl9tb2RlIG1vZGUp CnsKICBzd2l0Y2ggKG1vZGUpCiAgICB7CiAgICBjYXNlIEVfREZtb2RlOgogICAgICByZXR1cm4g VjJERm1vZGU7CiAgICBjYXNlIEVfU0Ztb2RlOgogICAgICByZXR1cm4gVjRTRm1vZGU7CiAgICBj YXNlIEVfSEZtb2RlOgogICAgICByZXR1cm4gVjhIRm1vZGU7CiAgICBjYXNlIEVfQkZtb2RlOgog ICAgICByZXR1cm4gVjhCRm1vZGU7CiAgICBjYXNlIEVfU0ltb2RlOgogICAgICByZXR1cm4gVjRT SW1vZGU7CiAgICBjYXNlIEVfSEltb2RlOgogICAgICByZXR1cm4gVjhISW1vZGU7CiAgICBjYXNl IEVfUUltb2RlOgogICAgICByZXR1cm4gVjE2UUltb2RlOwogICAgY2FzZSBFX0RJbW9kZToKICAg ICAgcmV0dXJuIFYyREltb2RlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG9wdF9tYWNoaW5l X21vZGUgKCk7CiAgICB9Cn0KCi8qIFJldHVybiBhcHByb3ByaWF0ZSBTSU1EIGNvbnRhaW5lcgog ICBmb3IgTU9ERSB3aXRoaW4gYSB2ZWN0b3Igb2YgV0lEVEggYml0cy4gICovCnN0YXRpYyBtYWNo aW5lX21vZGUKYWFyY2g2NF9zaW1kX2NvbnRhaW5lcl9tb2RlIChzY2FsYXJfbW9kZSBtb2RlLCBw b2x5X2ludDY0IHdpZHRoKQp7CiAgaWYgKFRBUkdFVF9TVkUKICAgICAgJiYgbWF5YmVfbmUgKHdp ZHRoLCAxMjgpCiAgICAgICYmIGtub3duX2VxICh3aWR0aCwgQklUU19QRVJfU1ZFX1ZFQ1RPUikp CiAgICByZXR1cm4gYWFyY2g2NF9mdWxsX3N2ZV9tb2RlIChtb2RlKS5lbHNlX21vZGUgKHdvcmRf bW9kZSk7CgogIGdjY19hc3NlcnQgKGtub3duX2VxICh3aWR0aCwgNjQpIHx8IGtub3duX2VxICh3 aWR0aCwgMTI4KSk7CiAgaWYgKFRBUkdFVF9TSU1EKQogICAgewogICAgICBpZiAoa25vd25fZXEg KHdpZHRoLCAxMjgpKQoJcmV0dXJuIGFhcmNoNjRfdnFfbW9kZSAobW9kZSkuZWxzZV9tb2RlICh3 b3JkX21vZGUpOwogICAgICBlbHNlCglzd2l0Y2ggKG1vZGUpCgkgIHsKCSAgY2FzZSBFX1NGbW9k ZToKCSAgICByZXR1cm4gVjJTRm1vZGU7CgkgIGNhc2UgRV9IRm1vZGU6CgkgICAgcmV0dXJuIFY0 SEZtb2RlOwoJICBjYXNlIEVfQkZtb2RlOgoJICAgIHJldHVybiBWNEJGbW9kZTsKCSAgY2FzZSBF X1NJbW9kZToKCSAgICByZXR1cm4gVjJTSW1vZGU7CgkgIGNhc2UgRV9ISW1vZGU6CgkgICAgcmV0 dXJuIFY0SEltb2RlOwoJICBjYXNlIEVfUUltb2RlOgoJICAgIHJldHVybiBWOFFJbW9kZTsKCSAg ZGVmYXVsdDoKCSAgICBicmVhazsKCSAgfQogICAgfQogIHJldHVybiB3b3JkX21vZGU7Cn0KCi8q IENvbXBhcmUgYW4gU1ZFIG1vZGUgU1ZFX00gYW5kIGFuIEFkdmFuY2VkIFNJTUQgbW9kZSBBU0lN RF9NCiAgIGFuZCByZXR1cm4gd2hldGhlciB0aGUgU1ZFIG1vZGUgc2hvdWxkIGJlIHByZWZlcnJl ZCBvdmVyIHRoZQogICBBZHZhbmNlZCBTSU1EIG9uZSBpbiBhYXJjaDY0X2F1dG92ZWN0b3JpemVf dmVjdG9yX21vZGVzLiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2NF9jbXBfYXV0b3ZlY19tb2RlcyAo bWFjaGluZV9tb2RlIHN2ZV9tLCBtYWNoaW5lX21vZGUgYXNpbWRfbSkKewogIC8qIFRha2UgaW50 byBhY2NvdW50IHRoZSBhYXJjaDY0LWF1dG92ZWMtcHJlZmVyZW5jZSBwYXJhbSBpZiBub24temVy by4gICovCiAgYm9vbCBvbmx5X2FzaW1kX3AgPSBhYXJjaDY0X2F1dG92ZWNfcHJlZmVyZW5jZSA9 PSAxOwogIGJvb2wgb25seV9zdmVfcCA9IGFhcmNoNjRfYXV0b3ZlY19wcmVmZXJlbmNlID09IDI7 CgogIGlmIChvbmx5X2FzaW1kX3ApCiAgICByZXR1cm4gZmFsc2U7CiAgaWYgKG9ubHlfc3ZlX3Ap CiAgICByZXR1cm4gdHJ1ZTsKCiAgLyogVGhlIHByZWZlcmVuY2UgaW4gY2FzZSBvZiBhIHRpZSBp biBjb3N0cy4gICovCiAgYm9vbCBwcmVmZXJfYXNpbWQgPSBhYXJjaDY0X2F1dG92ZWNfcHJlZmVy ZW5jZSA9PSAzOwogIGJvb2wgcHJlZmVyX3N2ZSA9IGFhcmNoNjRfYXV0b3ZlY19wcmVmZXJlbmNl ID09IDQ7CgogIHBvbHlfaW50NjQgbnVuaXRzX3N2ZSA9IEdFVF9NT0RFX05VTklUUyAoc3ZlX20p OwogIHBvbHlfaW50NjQgbnVuaXRzX2FzaW1kID0gR0VUX01PREVfTlVOSVRTIChhc2ltZF9tKTsK ICAvKiBJZiB0aGUgQ1BVIGluZm9ybWF0aW9uIGRvZXMgbm90IGhhdmUgYW4gU1ZFIHdpZHRoIHJl Z2lzdGVyZWQgdXNlIHRoZQogICAgIGdlbmVyaWMgcG9seV9pbnQgY29tcGFyaXNvbiB0aGF0IHBy ZWZlcnMgU1ZFLiAgSWYgYSBwcmVmZXJlbmNlIGlzCiAgICAgZXhwbGljaXRseSByZXF1ZXN0ZWQg YXZvaWQgdGhpcyBwYXRoLiAgKi8KICBpZiAoYWFyY2g2NF90dW5lX3BhcmFtcy5zdmVfd2lkdGgg PT0gU1ZFX1NDQUxBQkxFCiAgICAgICYmICFwcmVmZXJfYXNpbWQKICAgICAgJiYgIXByZWZlcl9z dmUpCiAgICByZXR1cm4gbWF5YmVfZ3QgKG51bml0c19zdmUsIG51bml0c19hc2ltZCk7CgogIC8q IE90aGVyd2lzZSBlc3RpbWF0ZSB0aGUgcnVudGltZSB3aWR0aCBvZiB0aGUgbW9kZXMgaW52b2x2 ZWQuICAqLwogIEhPU1RfV0lERV9JTlQgZXN0X3N2ZSA9IGVzdGltYXRlZF9wb2x5X3ZhbHVlIChu dW5pdHNfc3ZlKTsKICBIT1NUX1dJREVfSU5UIGVzdF9hc2ltZCA9IGVzdGltYXRlZF9wb2x5X3Zh bHVlIChudW5pdHNfYXNpbWQpOwoKICAvKiBQcmVmZXJyaW5nIFNWRSBtZWFucyBwaWNraW5nIGl0 IGZpcnN0IHVubGVzcyB0aGUgQWR2YW5jZWQgU0lNRCBtb2RlCiAgICAgaXMgY2xlYXJseSB3aWRl ci4gICovCiAgaWYgKHByZWZlcl9zdmUpCiAgICByZXR1cm4gZXN0X3N2ZSA+PSBlc3RfYXNpbWQ7 CiAgLyogQ29udmVyc2VseSwgcHJlZmVycmluZyBBZHZhbmNlZCBTSU1EIG1lYW5zIHBpY2tpbmcg U1ZFIG9ubHkgaWYgU1ZFCiAgICAgaXMgY2xlYXJseSB3aWRlci4gICovCiAgaWYgKHByZWZlcl9h c2ltZCkKICAgIHJldHVybiBlc3Rfc3ZlID4gZXN0X2FzaW1kOwoKICAvKiBJbiB0aGUgZGVmYXVs dCBjYXNlIHByZWZlciBBZHZhbmNlZCBTSU1EIG92ZXIgU1ZFIGluIGNhc2Ugb2YgYSB0aWUuICAq LwogIHJldHVybiBlc3Rfc3ZlID4gZXN0X2FzaW1kOwp9CgovKiBSZXR1cm4gMTI4LWJpdCBjb250 YWluZXIgYXMgdGhlIHByZWZlcnJlZCBTSU1EIG1vZGUgZm9yIE1PREUuICAqLwpzdGF0aWMgbWFj aGluZV9tb2RlCmFhcmNoNjRfcHJlZmVycmVkX3NpbWRfbW9kZSAoc2NhbGFyX21vZGUgbW9kZSkK ewogIC8qIFRha2UgaW50byBhY2NvdW50IGV4cGxpY2l0IGF1dG8tdmVjdG9yaXphdGlvbiBJU0Eg cHJlZmVyZW5jZXMgdGhyb3VnaAogICAgIGFhcmNoNjRfY21wX2F1dG92ZWNfbW9kZXMuICAqLwog IGlmIChUQVJHRVRfU1ZFICYmIGFhcmNoNjRfY21wX2F1dG92ZWNfbW9kZXMgKFZOeDE2UUltb2Rl LCBWMTZRSW1vZGUpKQogICAgcmV0dXJuIGFhcmNoNjRfZnVsbF9zdmVfbW9kZSAobW9kZSkuZWxz ZV9tb2RlICh3b3JkX21vZGUpOwogIGlmIChUQVJHRVRfU0lNRCkKICAgIHJldHVybiBhYXJjaDY0 X3ZxX21vZGUgKG1vZGUpLmVsc2VfbW9kZSAod29yZF9tb2RlKTsKICByZXR1cm4gd29yZF9tb2Rl Owp9CgovKiBSZXR1cm4gYSBsaXN0IG9mIHBvc3NpYmxlIHZlY3RvciBzaXplcyBmb3IgdGhlIHZl Y3Rvcml6ZXIKICAgdG8gaXRlcmF0ZSBvdmVyLiAgKi8Kc3RhdGljIHVuc2lnbmVkIGludAphYXJj aDY0X2F1dG92ZWN0b3JpemVfdmVjdG9yX21vZGVzICh2ZWN0b3JfbW9kZXMgKm1vZGVzLCBib29s KQp7CiAgc3RhdGljIGNvbnN0IG1hY2hpbmVfbW9kZSBzdmVfbW9kZXNbXSA9IHsKICAgIC8qIFRy eSB1c2luZyBmdWxsIHZlY3RvcnMgZm9yIGFsbCBlbGVtZW50IHR5cGVzLiAgKi8KICAgIFZOeDE2 UUltb2RlLAoKICAgIC8qIFRyeSB1c2luZyAxNi1iaXQgY29udGFpbmVycyBmb3IgOC1iaXQgZWxl bWVudHMgYW5kIGZ1bGwgdmVjdG9ycwogICAgICAgZm9yIHdpZGVyIGVsZW1lbnRzLiAgKi8KICAg IFZOeDhRSW1vZGUsCgogICAgLyogVHJ5IHVzaW5nIDMyLWJpdCBjb250YWluZXJzIGZvciA4LWJp dCBhbmQgMTYtYml0IGVsZW1lbnRzIGFuZAogICAgICAgZnVsbCB2ZWN0b3JzIGZvciB3aWRlciBl bGVtZW50cy4gICovCiAgICBWTng0UUltb2RlLAoKICAgIC8qIFRyeSB1c2luZyA2NC1iaXQgY29u dGFpbmVycyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMuICAqLwogICAgVk54MlFJbW9kZQogIH07Cgog IHN0YXRpYyBjb25zdCBtYWNoaW5lX21vZGUgYWR2c2ltZF9tb2Rlc1tdID0gewogICAgLyogVHJ5 IHVzaW5nIDEyOC1iaXQgdmVjdG9ycyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMuICAqLwogICAgVjE2 UUltb2RlLAoKICAgIC8qIFRyeSB1c2luZyA2NC1iaXQgdmVjdG9ycyBmb3IgOC1iaXQgZWxlbWVu dHMgYW5kIDEyOC1iaXQgdmVjdG9ycwogICAgICAgZm9yIHdpZGVyIGVsZW1lbnRzLiAgKi8KICAg IFY4UUltb2RlLAoKICAgIC8qIFRyeSB1c2luZyA2NC1iaXQgdmVjdG9ycyBmb3IgMTYtYml0IGVs ZW1lbnRzIGFuZCAxMjgtYml0IHZlY3RvcnMKICAgICAgIGZvciB3aWRlciBlbGVtZW50cy4KCiAg ICAgICBUT0RPOiBXZSBjb3VsZCBzdXBwb3J0IGEgbGltaXRlZCBmb3JtIG9mIFY0UUltb2RlIHRv bywgc28gdGhhdAogICAgICAgd2UgdXNlIDMyLWJpdCB2ZWN0b3JzIGZvciA4LWJpdCBlbGVtZW50 cy4gICovCiAgICBWNEhJbW9kZSwKCiAgICAvKiBUcnkgdXNpbmcgNjQtYml0IHZlY3RvcnMgZm9y IDMyLWJpdCBlbGVtZW50cyBhbmQgMTI4LWJpdCB2ZWN0b3JzCiAgICAgICBmb3IgNjQtYml0IGVs ZW1lbnRzLgoKICAgICAgIFRPRE86IFdlIGNvdWxkIHNpbWlsYXJseSBzdXBwb3J0IGxpbWl0ZWQg Zm9ybXMgb2YgVjJRSW1vZGUgYW5kIFYySEltb2RlCiAgICAgICBmb3IgdGhpcyBjYXNlLiAgKi8K ICAgIFYyU0ltb2RlCiAgfTsKCiAgLyogVHJ5IHVzaW5nIE4tYnl0ZSBTVkUgbW9kZXMgb25seSBh ZnRlciB0cnlpbmcgTi1ieXRlIEFkdmFuY2VkIFNJTUQgbW9kZS4KICAgICBUaGlzIGlzIGJlY2F1 c2U6CgogICAgIC0gSWYgd2UgY2FuJ3QgdXNlIE4tYnl0ZSBBZHZhbmNlZCBTSU1EIHZlY3RvcnMg dGhlbiB0aGUgcGxhY2VtZW50CiAgICAgICBkb2Vzbid0IG1hdHRlcjsgd2UnbGwganVzdCBjb250 aW51ZSBhcyB0aG91Z2ggdGhlIEFkdmFuY2VkIFNJTUQKICAgICAgIGVudHJ5IGRpZG4ndCBleGlz dC4KCiAgICAgLSBJZiBhbiBTVkUgbWFpbiBsb29wIHdpdGggTiBieXRlcyBlbmRzIHVwIGJlaW5n IGNoZWFwZXIgdGhhbiBhbgogICAgICAgQWR2YW5jZWQgU0lNRCBtYWluIGxvb3Agd2l0aCBOIGJ5 dGVzIHRoZW4gYnkgZGVmYXVsdCB3ZSdsbCByZXBsYWNlCiAgICAgICB0aGUgQWR2YW5jZWQgU0lN RCB2ZXJzaW9uIHdpdGggdGhlIFNWRSBvbmUuCgogICAgIC0gSWYgYW4gQWR2YW5jZWQgU0lNRCBt YWluIGxvb3Agd2l0aCBOIGJ5dGVzIGVuZHMgdXAgYmVpbmcgY2hlYXBlcgogICAgICAgdGhhbiBh biBTVkUgbWFpbiBsb29wIHdpdGggTiBieXRlcyB0aGVuIGJ5IGRlZmF1bHQgd2UnbGwgdHJ5IHRv CiAgICAgICB1c2UgdGhlIFNWRSBsb29wIHRvIHZlY3Rvcml6ZSB0aGUgZXBpbG9ndWUgaW5zdGVh ZC4gICovCgogIGJvb2wgb25seV9hc2ltZF9wID0gYWFyY2g2NF9hdXRvdmVjX3ByZWZlcmVuY2Ug PT0gMTsKICBib29sIG9ubHlfc3ZlX3AgPSBhYXJjaDY0X2F1dG92ZWNfcHJlZmVyZW5jZSA9PSAy OwoKICB1bnNpZ25lZCBpbnQgc3ZlX2kgPSAoVEFSR0VUX1NWRSAmJiAhb25seV9hc2ltZF9wKSA/ IDAgOiBBUlJBWV9TSVpFIChzdmVfbW9kZXMpOwogIHVuc2lnbmVkIGludCBhZHZzaW1kX2kgPSAw OwoKICB3aGlsZSAoIW9ubHlfc3ZlX3AgJiYgYWR2c2ltZF9pIDwgQVJSQVlfU0laRSAoYWR2c2lt ZF9tb2RlcykpCiAgICB7CiAgICAgIGlmIChzdmVfaSA8IEFSUkFZX1NJWkUgKHN2ZV9tb2RlcykK CSAgJiYgYWFyY2g2NF9jbXBfYXV0b3ZlY19tb2RlcyAoc3ZlX21vZGVzW3N2ZV9pXSwKCQkJCQlh ZHZzaW1kX21vZGVzW2FkdnNpbWRfaV0pKQoJbW9kZXMtPnNhZmVfcHVzaCAoc3ZlX21vZGVzW3N2 ZV9pKytdKTsKICAgICAgZWxzZQoJbW9kZXMtPnNhZmVfcHVzaCAoYWR2c2ltZF9tb2Rlc1thZHZz aW1kX2krK10pOwogICAgfQogIHdoaWxlIChzdmVfaSA8IEFSUkFZX1NJWkUgKHN2ZV9tb2Rlcykp CiAgIG1vZGVzLT5zYWZlX3B1c2ggKHN2ZV9tb2Rlc1tzdmVfaSsrXSk7CgogIHVuc2lnbmVkIGlu dCBmbGFncyA9IDA7CiAgLyogQ29uc2lkZXIgZW5hYmxpbmcgVkVDVF9DT01QQVJFX0NPU1RTIGZv ciBTVkUsIGJvdGggc28gdGhhdCB3ZQogICAgIGNhbiBjb21wYXJlIFNWRSBhZ2FpbnN0IEFkdmFu Y2VkIFNJTUQgYW5kIHNvIHRoYXQgd2UgY2FuIGNvbXBhcmUKICAgICBtdWx0aXBsZSBTVkUgdmVj dG9yaXphdGlvbiBhcHByb2FjaGVzIGFnYWluc3QgZWFjaCBvdGhlci4gIFRoZXJlJ3MKICAgICBu b3QgcmVhbGx5IGFueSBwb2ludCBkb2luZyB0aGlzIGZvciBBZHZhbmNlZCBTSU1EIG9ubHksIHNp bmNlIHRoZQogICAgIGZpcnN0IG1vZGUgdGhhdCB3b3JrcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBi ZXN0LiAgKi8KICBpZiAoVEFSR0VUX1NWRSAmJiBhYXJjaDY0X3N2ZV9jb21wYXJlX2Nvc3RzKQog ICAgZmxhZ3MgfD0gVkVDVF9DT01QQVJFX0NPU1RTOwogIHJldHVybiBmbGFnczsKfQoKLyogSW1w bGVtZW50IFRBUkdFVF9NQU5HTEVfVFlQRS4gICovCgpzdGF0aWMgY29uc3QgY2hhciAqCmFhcmNo NjRfbWFuZ2xlX3R5cGUgKGNvbnN0X3RyZWUgdHlwZSkKewogIC8qIFRoZSBBQXJjaDY0IEFCSSBk b2N1bWVudHMgc2F5IHRoYXQgIl9fdmFfbGlzdCIgaGFzIHRvIGJlCiAgICAgbWFuZ2xlZCBhcyBp ZiBpdCBpcyBpbiB0aGUgInN0ZCIgbmFtZXNwYWNlLiAgKi8KICBpZiAobGFuZ19ob29rcy50eXBl c19jb21wYXRpYmxlX3AgKENPTlNUX0NBU1RfVFJFRSAodHlwZSksIHZhX2xpc3RfdHlwZSkpCiAg ICByZXR1cm4gIlN0OV9fdmFfbGlzdCI7CgogIC8qIEhhbGYtcHJlY2lzaW9uIGZsb2F0aW5nIHBv aW50IHR5cGVzLiAgKi8KICBpZiAoU0NBTEFSX0ZMT0FUX1RZUEVfUCAodHlwZSkgJiYgVFlQRV9Q UkVDSVNJT04gKHR5cGUpID09IDE2KQogICAgewogICAgICBpZiAoVFlQRV9NQUlOX1ZBUklBTlQg KHR5cGUpID09IGZsb2F0MTZfdHlwZV9ub2RlKQoJcmV0dXJuIE5VTEw7CiAgICAgIGlmIChUWVBF X01PREUgKHR5cGUpID09IEJGbW9kZSkKCXJldHVybiAidTZfX2JmMTYiOwogICAgICBlbHNlCgly ZXR1cm4gIkRoIjsKICAgIH0KCiAgLyogTWFuZ2xlIEFBcmNoNjQtc3BlY2lmaWMgaW50ZXJuYWwg dHlwZXMuICBUWVBFX05BTUUgaXMgbm9uLU5VTExfVFJFRSBmb3IKICAgICBidWlsdGluIHR5cGVz LiAgKi8KICBpZiAoVFlQRV9OQU1FICh0eXBlKSAhPSBOVUxMKQogICAgewogICAgICBjb25zdCBj aGFyICpyZXM7CiAgICAgIGlmICgocmVzID0gYWFyY2g2NF9nZW5lcmFsX21hbmdsZV9idWlsdGlu X3R5cGUgKHR5cGUpKQoJICB8fCAocmVzID0gYWFyY2g2NF9zdmU6Om1hbmdsZV9idWlsdGluX3R5 cGUgKHR5cGUpKSkKCXJldHVybiByZXM7CiAgICB9CgogIC8qIFVzZSB0aGUgZGVmYXVsdCBtYW5n bGluZy4gICovCiAgcmV0dXJuIE5VTEw7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfVkVSSUZZX1RZ UEVfQ09OVEVYVC4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3ZlcmlmeV90eXBlX2NvbnRleHQg KGxvY2F0aW9uX3QgbG9jLCB0eXBlX2NvbnRleHRfa2luZCBjb250ZXh0LAoJCQkgICAgIGNvbnN0 X3RyZWUgdHlwZSwgYm9vbCBzaWxlbnRfcCkKewogIHJldHVybiBhYXJjaDY0X3N2ZTo6dmVyaWZ5 X3R5cGVfY29udGV4dCAobG9jLCBjb250ZXh0LCB0eXBlLCBzaWxlbnRfcCk7Cn0KCi8qIEZpbmQg dGhlIGZpcnN0IHJ0eF9pbnNuIGJlZm9yZSBpbnNuIHRoYXQgd2lsbCBnZW5lcmF0ZSBhbiBhc3Nl bWJseQogICBpbnN0cnVjdGlvbi4gICovCgpzdGF0aWMgcnR4X2luc24gKgphYXJjaDY0X3ByZXZf cmVhbF9pbnNuIChydHhfaW5zbiAqaW5zbikKewogIGlmICghaW5zbikKICAgIHJldHVybiBOVUxM OwoKICBkbwogICAgewogICAgICBpbnNuID0gcHJldl9yZWFsX2luc24gKGluc24pOwogICAgfQog IHdoaWxlIChpbnNuICYmIHJlY29nX21lbW9pemVkIChpbnNuKSA8IDApOwoKICByZXR1cm4gaW5z bjsKfQoKc3RhdGljIGJvb2wKaXNfbWFkZF9vcCAoZW51bSBhdHRyX3R5cGUgdDEpCnsKICB1bnNp Z25lZCBpbnQgaTsKICAvKiBBIG51bWJlciBvZiB0aGVzZSBtYXkgYmUgQUFyY2gzMiBvbmx5LiAg Ki8KICBlbnVtIGF0dHJfdHlwZSBtbGF0eXBlc1tdID0gewogICAgVFlQRV9NTEEsIFRZUEVfTUxB UywgVFlQRV9TTUxBRCwgVFlQRV9TTUxBRFgsIFRZUEVfU01MQUwsIFRZUEVfU01MQUxELAogICAg VFlQRV9TTUxBTFMsIFRZUEVfU01MQUxYWSwgVFlQRV9TTUxBV1gsIFRZUEVfU01MQVdZLCBUWVBF X1NNTEFYWSwKICAgIFRZUEVfU01NTEEsIFRZUEVfVU1MQUwsIFRZUEVfVU1MQUxTLFRZUEVfU01M U0QsIFRZUEVfU01MU0RYLCBUWVBFX1NNTFNMRAogIH07CgogIGZvciAoaSA9IDA7IGkgPCBBUlJB WV9TSVpFIChtbGF0eXBlcyk7IGkrKykKICAgIHsKICAgICAgaWYgKHQxID09IG1sYXR5cGVzW2ld KQoJcmV0dXJuIHRydWU7CiAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKLyogQ2hlY2sgaWYgdGhl cmUgaXMgYSByZWdpc3RlciBkZXBlbmRlbmN5IGJldHdlZW4gYSBsb2FkIGFuZCB0aGUgaW5zbgog ICBmb3Igd2hpY2ggd2UgaG9sZCByZWNvZ19kYXRhLiAgKi8KCnN0YXRpYyBib29sCmRlcF9iZXR3 ZWVuX21lbW9wX2FuZF9jdXJyIChydHggbWVtb3ApCnsKICBydHggbG9hZF9yZWc7CiAgaW50IG9w bm87CgogIGdjY19hc3NlcnQgKEdFVF9DT0RFIChtZW1vcCkgPT0gU0VUKTsKCiAgaWYgKCFSRUdf UCAoU0VUX0RFU1QgKG1lbW9wKSkpCiAgICByZXR1cm4gZmFsc2U7CgogIGxvYWRfcmVnID0gU0VU X0RFU1QgKG1lbW9wKTsKICBmb3IgKG9wbm8gPSAxOyBvcG5vIDwgcmVjb2dfZGF0YS5uX29wZXJh bmRzOyBvcG5vKyspCiAgICB7CiAgICAgIHJ0eCBvcGVyYW5kID0gcmVjb2dfZGF0YS5vcGVyYW5k W29wbm9dOwogICAgICBpZiAoUkVHX1AgKG9wZXJhbmQpCiAgICAgICAgICAmJiByZWdfb3Zlcmxh cF9tZW50aW9uZWRfcCAobG9hZF9yZWcsIG9wZXJhbmQpKQogICAgICAgIHJldHVybiB0cnVlOwoK ICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCgovKiBXaGVuIHdvcmtpbmcgYXJvdW5kIHRoZSBDb3J0 ZXgtQTUzIGVycmF0dW0gODM1NzY5LAogICBnaXZlbiBydHhfaW5zbiBJTlNOLCByZXR1cm4gdHJ1 ZSBpZiBpdCBpcyBhIDY0LWJpdCBtdWx0aXBseS1hY2N1bXVsYXRlCiAgIGluc3RydWN0aW9uIGFu ZCBoYXMgYSBwcmVjZWRpbmcgbWVtb3J5IGluc3RydWN0aW9uIHN1Y2ggdGhhdCBhIE5PUAogICBz aG91bGQgYmUgaW5zZXJ0ZWQgYmV0d2VlbiB0aGVtLiAgKi8KCmJvb2wKYWFyY2g2NF9tYWRkX25l ZWRzX25vcCAocnR4X2luc24qIGluc24pCnsKICBlbnVtIGF0dHJfdHlwZSBhdHRyX3R5cGU7CiAg cnR4X2luc24gKnByZXY7CiAgcnR4IGJvZHk7CgogIGlmICghVEFSR0VUX0ZJWF9FUlJfQTUzXzgz NTc2OSkKICAgIHJldHVybiBmYWxzZTsKCiAgaWYgKCFJTlNOX1AgKGluc24pIHx8IHJlY29nX21l bW9pemVkIChpbnNuKSA8IDApCiAgICByZXR1cm4gZmFsc2U7CgogIGF0dHJfdHlwZSA9IGdldF9h dHRyX3R5cGUgKGluc24pOwogIGlmICghaXNfbWFkZF9vcCAoYXR0cl90eXBlKSkKICAgIHJldHVy biBmYWxzZTsKCiAgcHJldiA9IGFhcmNoNjRfcHJldl9yZWFsX2luc24gKGluc24pOwogIC8qIGFh cmNoNjRfcHJldl9yZWFsX2luc24gY2FuIGNhbGwgcmVjb2dfbWVtb2l6ZWQgb24gaW5zbnMgb3Ro ZXIgdGhhbiBJTlNOLgogICAgIFJlc3RvcmUgcmVjb2cgc3RhdGUgdG8gSU5TTiB0byBhdm9pZCBz dGF0ZSBjb3JydXB0aW9uLiAgKi8KICBleHRyYWN0X2NvbnN0cmFpbl9pbnNuX2NhY2hlZCAoaW5z bik7CgogIGlmICghcHJldiB8fCAhY29udGFpbnNfbWVtX3J0eF9wIChQQVRURVJOIChwcmV2KSkp CiAgICByZXR1cm4gZmFsc2U7CgogIGJvZHkgPSBzaW5nbGVfc2V0IChwcmV2KTsKCiAgLyogSWYg dGhlIHByZXZpb3VzIGluc24gaXMgYSBtZW1vcnkgb3AgYW5kIHRoZXJlIGlzIG5vIGRlcGVuZGVu Y3kgYmV0d2VlbgogICAgIGl0IGFuZCB0aGUgREltb2RlIG1hZGQsIGVtaXQgYSBOT1AgYmV0d2Vl biB0aGVtLiAgSWYgYm9keSBpcyBOVUxMIHRoZW4gd2UKICAgICBoYXZlIGEgY29tcGxleCBtZW1v cnkgb3BlcmF0aW9uLCBwcm9iYWJseSBhIGxvYWQvc3RvcmUgcGFpci4KICAgICBCZSBjb25zZXJ2 YXRpdmUgZm9yIG5vdyBhbmQgZW1pdCBhIE5PUC4gICovCiAgaWYgKEdFVF9NT0RFIChyZWNvZ19k YXRhLm9wZXJhbmRbMF0pID09IERJbW9kZQogICAgICAmJiAoIWJvZHkgfHwgIWRlcF9iZXR3ZWVu X21lbW9wX2FuZF9jdXJyIChib2R5KSkpCiAgICByZXR1cm4gdHJ1ZTsKCiAgcmV0dXJuIGZhbHNl OwoKfQoKCi8qIEltcGxlbWVudCBGSU5BTF9QUkVTQ0FOX0lOU04uICAqLwoKdm9pZAphYXJjaDY0 X2ZpbmFsX3ByZXNjYW5faW5zbiAocnR4X2luc24gKmluc24pCnsKICBpZiAoYWFyY2g2NF9tYWRk X25lZWRzX25vcCAoaW5zbikpCiAgICBmcHJpbnRmIChhc21fb3V0X2ZpbGUsICJcdG5vcCAvLyBi ZXR3ZWVuIG1lbSBvcCBhbmQgbXVsdC1hY2N1bXVsYXRlXG4iKTsKfQoKCi8qIFJldHVybiB0cnVl IGlmIEJBU0VfT1JfU1RFUCBpcyBhIHZhbGlkIGltbWVkaWF0ZSBvcGVyYW5kIGZvciBhbiBTVkUg SU5ERVgKICAgaW5zdHJ1Y3Rpb24uICAqLwoKYm9vbAphYXJjaDY0X3N2ZV9pbmRleF9pbW1lZGlh dGVfcCAocnR4IGJhc2Vfb3Jfc3RlcCkKewogIHJldHVybiAoQ09OU1RfSU5UX1AgKGJhc2Vfb3Jf c3RlcCkKCSAgJiYgSU5fUkFOR0UgKElOVFZBTCAoYmFzZV9vcl9zdGVwKSwgLTE2LCAxNSkpOwp9 CgovKiBSZXR1cm4gdHJ1ZSBpZiBYIGlzIGEgdmFsaWQgaW1tZWRpYXRlIGZvciB0aGUgU1ZFIEFE RCBhbmQgU1VCIGluc3RydWN0aW9ucwogICB3aGVuIGFwcGxpZWQgdG8gbW9kZSBNT0RFLiAgTmVn YXRlIFggZmlyc3QgaWYgTkVHQVRFX1AgaXMgdHJ1ZS4gICovCgpib29sCmFhcmNoNjRfc3ZlX2Fy aXRoX2ltbWVkaWF0ZV9wIChtYWNoaW5lX21vZGUgbW9kZSwgcnR4IHgsIGJvb2wgbmVnYXRlX3Ap CnsKICBydHggZWx0ID0gdW53cmFwX2NvbnN0X3ZlY19kdXBsaWNhdGUgKHgpOwogIGlmICghQ09O U1RfSU5UX1AgKGVsdCkpCiAgICByZXR1cm4gZmFsc2U7CgogIEhPU1RfV0lERV9JTlQgdmFsID0g SU5UVkFMIChlbHQpOwogIGlmIChuZWdhdGVfcCkKICAgIHZhbCA9IC12YWw7CiAgdmFsICY9IEdF VF9NT0RFX01BU0sgKEdFVF9NT0RFX0lOTkVSIChtb2RlKSk7CgogIGlmICh2YWwgJiAweGZmKQog ICAgcmV0dXJuIElOX1JBTkdFICh2YWwsIDAsIDB4ZmYpOwogIHJldHVybiBJTl9SQU5HRSAodmFs LCAwLCAweGZmMDApOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBYIGlzIGEgdmFsaWQgaW1tZWRpYXRl IGZvciB0aGUgU1ZFIFNRQUREIGFuZCBTUVNVQgogICBpbnN0cnVjdGlvbnMgd2hlbiBhcHBsaWVk IHRvIG1vZGUgTU9ERS4gIE5lZ2F0ZSBYIGZpcnN0IGlmIE5FR0FURV9QCiAgIGlzIHRydWUuICAq LwoKYm9vbAphYXJjaDY0X3N2ZV9zcWFkZF9zcXN1Yl9pbW1lZGlhdGVfcCAobWFjaGluZV9tb2Rl IG1vZGUsIHJ0eCB4LCBib29sIG5lZ2F0ZV9wKQp7CiAgaWYgKCFhYXJjaDY0X3N2ZV9hcml0aF9p bW1lZGlhdGVfcCAobW9kZSwgeCwgbmVnYXRlX3ApKQogICAgcmV0dXJuIGZhbHNlOwoKICAvKiBB ZnRlciB0aGUgb3B0aW9uYWwgbmVnYXRpb24sIHRoZSBpbW1lZGlhdGUgbXVzdCBiZSBub25uZWdh dGl2ZS4KICAgICBFLmcuIGEgc2F0dXJhdGluZyBhZGQgb2YgLTEyNyBtdXN0IGJlIGRvbmUgdmlh IFNRU1VCIFpuLkIsIFpuLkIsICMxMjcKICAgICBpbnN0ZWFkIG9mIFNRQUREIFpuLkIsIFpuLkIs ICMxMjkuICAqLwogIHJ0eCBlbHQgPSB1bndyYXBfY29uc3RfdmVjX2R1cGxpY2F0ZSAoeCk7CiAg cmV0dXJuIG5lZ2F0ZV9wID09IChJTlRWQUwgKGVsdCkgPCAwKTsKfQoKLyogUmV0dXJuIHRydWUg aWYgWCBpcyBhIHZhbGlkIGltbWVkaWF0ZSBvcGVyYW5kIGZvciBhbiBTVkUgbG9naWNhbAogICBp bnN0cnVjdGlvbiBzdWNoIGFzIEFORC4gICovCgpib29sCmFhcmNoNjRfc3ZlX2JpdG1hc2tfaW1t ZWRpYXRlX3AgKHJ0eCB4KQp7CiAgcnR4IGVsdDsKCiAgcmV0dXJuIChjb25zdF92ZWNfZHVwbGlj YXRlX3AgKHgsICZlbHQpCgkgICYmIENPTlNUX0lOVF9QIChlbHQpCgkgICYmIGFhcmNoNjRfYml0 bWFza19pbW0gKElOVFZBTCAoZWx0KSwKCQkJCSAgR0VUX01PREVfSU5ORVIgKEdFVF9NT0RFICh4 KSkpKTsKfQoKLyogUmV0dXJuIHRydWUgaWYgWCBpcyBhIHZhbGlkIGltbWVkaWF0ZSBmb3IgdGhl IFNWRSBEVVAgYW5kIENQWQogICBpbnN0cnVjdGlvbnMuICAqLwoKYm9vbAphYXJjaDY0X3N2ZV9k dXBfaW1tZWRpYXRlX3AgKHJ0eCB4KQp7CiAgeCA9IGFhcmNoNjRfYml0X3JlcHJlc2VudGF0aW9u ICh1bndyYXBfY29uc3RfdmVjX2R1cGxpY2F0ZSAoeCkpOwogIGlmICghQ09OU1RfSU5UX1AgKHgp KQogICAgcmV0dXJuIGZhbHNlOwoKICBIT1NUX1dJREVfSU5UIHZhbCA9IElOVFZBTCAoeCk7CiAg aWYgKHZhbCAmIDB4ZmYpCiAgICByZXR1cm4gSU5fUkFOR0UgKHZhbCwgLTB4ODAsIDB4N2YpOwog IHJldHVybiBJTl9SQU5HRSAodmFsLCAtMHg4MDAwLCAweDdmMDApOwp9CgovKiBSZXR1cm4gdHJ1 ZSBpZiBYIGlzIGEgdmFsaWQgaW1tZWRpYXRlIG9wZXJhbmQgZm9yIGFuIFNWRSBDTVAgaW5zdHJ1 Y3Rpb24uCiAgIFNJR05FRF9QIHNheXMgd2hldGhlciB0aGUgb3BlcmFuZCBpcyBzaWduZWQgcmF0 aGVyIHRoYW4gdW5zaWduZWQuICAqLwoKYm9vbAphYXJjaDY0X3N2ZV9jbXBfaW1tZWRpYXRlX3Ag KHJ0eCB4LCBib29sIHNpZ25lZF9wKQp7CiAgeCA9IHVud3JhcF9jb25zdF92ZWNfZHVwbGljYXRl ICh4KTsKICByZXR1cm4gKENPTlNUX0lOVF9QICh4KQoJICAmJiAoc2lnbmVkX3AKCSAgICAgID8g SU5fUkFOR0UgKElOVFZBTCAoeCksIC0xNiwgMTUpCgkgICAgICA6IElOX1JBTkdFIChJTlRWQUwg KHgpLCAwLCAxMjcpKSk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIFggaXMgYSB2YWxpZCBpbW1lZGlh dGUgb3BlcmFuZCBmb3IgYW4gU1ZFIEZBREQgb3IgRlNVQgogICBpbnN0cnVjdGlvbi4gIE5lZ2F0 ZSBYIGZpcnN0IGlmIE5FR0FURV9QIGlzIHRydWUuICAqLwoKYm9vbAphYXJjaDY0X3N2ZV9mbG9h dF9hcml0aF9pbW1lZGlhdGVfcCAocnR4IHgsIGJvb2wgbmVnYXRlX3ApCnsKICBydHggZWx0Owog IFJFQUxfVkFMVUVfVFlQRSByOwoKICBpZiAoIWNvbnN0X3ZlY19kdXBsaWNhdGVfcCAoeCwgJmVs dCkKICAgICAgfHwgIUNPTlNUX0RPVUJMRV9QIChlbHQpKQogICAgcmV0dXJuIGZhbHNlOwoKICBy ID0gKkNPTlNUX0RPVUJMRV9SRUFMX1ZBTFVFIChlbHQpOwoKICBpZiAobmVnYXRlX3ApCiAgICBy ID0gcmVhbF92YWx1ZV9uZWdhdGUgKCZyKTsKCiAgaWYgKHJlYWxfZXF1YWwgKCZyLCAmZGNvbnN0 MSkpCiAgICByZXR1cm4gdHJ1ZTsKICBpZiAocmVhbF9lcXVhbCAoJnIsICZkY29uc3RoYWxmKSkK ICAgIHJldHVybiB0cnVlOwogIHJldHVybiBmYWxzZTsKfQoKLyogUmV0dXJuIHRydWUgaWYgWCBp cyBhIHZhbGlkIGltbWVkaWF0ZSBvcGVyYW5kIGZvciBhbiBTVkUgRk1VTAogICBpbnN0cnVjdGlv bi4gICovCgpib29sCmFhcmNoNjRfc3ZlX2Zsb2F0X211bF9pbW1lZGlhdGVfcCAocnR4IHgpCnsK ICBydHggZWx0OwoKICByZXR1cm4gKGNvbnN0X3ZlY19kdXBsaWNhdGVfcCAoeCwgJmVsdCkKCSAg JiYgQ09OU1RfRE9VQkxFX1AgKGVsdCkKCSAgJiYgKHJlYWxfZXF1YWwgKENPTlNUX0RPVUJMRV9S RUFMX1ZBTFVFIChlbHQpLCAmZGNvbnN0aGFsZikKCSAgICAgIHx8IHJlYWxfZXF1YWwgKENPTlNU X0RPVUJMRV9SRUFMX1ZBTFVFIChlbHQpLCAmZGNvbnN0MikpKTsKfQoKLyogUmV0dXJuIHRydWUg aWYgcmVwbGljYXRpbmcgVkFMMzIgaXMgYSB2YWxpZCAyLWJ5dGUgb3IgNC1ieXRlIGltbWVkaWF0 ZQogICBmb3IgdGhlIEFkdmFuY2VkIFNJTUQgb3BlcmF0aW9uIGRlc2NyaWJlZCBieSBXSElDSCBh bmQgSU5TTi4gIElmIElORk8KICAgaXMgbm9ubnVsbCwgdXNlIGl0IHRvIGRlc2NyaWJlIHZhbGlk IGltbWVkaWF0ZXMuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X2FkdnNpbWRfdmFsaWRfaW1tZWRp YXRlX2hzICh1bnNpZ25lZCBpbnQgdmFsMzIsCgkJCQkgICAgc2ltZF9pbW1lZGlhdGVfaW5mbyAq aW5mbywKCQkJCSAgICBlbnVtIHNpbWRfaW1tZWRpYXRlX2NoZWNrIHdoaWNoLAoJCQkJICAgIHNp bWRfaW1tZWRpYXRlX2luZm86Omluc25fdHlwZSBpbnNuKQp7CiAgLyogVHJ5IGEgNC1ieXRlIGlt bWVkaWF0ZSB3aXRoIExTTC4gICovCiAgZm9yICh1bnNpZ25lZCBpbnQgc2hpZnQgPSAwOyBzaGlm dCA8IDMyOyBzaGlmdCArPSA4KQogICAgaWYgKCh2YWwzMiAmICgweGZmIDw8IHNoaWZ0KSkgPT0g dmFsMzIpCiAgICAgIHsKCWlmIChpbmZvKQoJICAqaW5mbyA9IHNpbWRfaW1tZWRpYXRlX2luZm8g KFNJbW9kZSwgdmFsMzIgPj4gc2hpZnQsIGluc24sCgkJCQkgICAgICAgc2ltZF9pbW1lZGlhdGVf aW5mbzo6TFNMLCBzaGlmdCk7CglyZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAvKiBUcnkgYSAyLWJ5 dGUgaW1tZWRpYXRlIHdpdGggTFNMLiAgKi8KICB1bnNpZ25lZCBpbnQgaW1tMTYgPSB2YWwzMiAm IDB4ZmZmZjsKICBpZiAoaW1tMTYgPT0gKHZhbDMyID4+IDE2KSkKICAgIGZvciAodW5zaWduZWQg aW50IHNoaWZ0ID0gMDsgc2hpZnQgPCAxNjsgc2hpZnQgKz0gOCkKICAgICAgaWYgKChpbW0xNiAm ICgweGZmIDw8IHNoaWZ0KSkgPT0gaW1tMTYpCgl7CgkgIGlmIChpbmZvKQoJICAgICppbmZvID0g c2ltZF9pbW1lZGlhdGVfaW5mbyAoSEltb2RlLCBpbW0xNiA+PiBzaGlmdCwgaW5zbiwKCQkJCQkg c2ltZF9pbW1lZGlhdGVfaW5mbzo6TFNMLCBzaGlmdCk7CgkgIHJldHVybiB0cnVlOwoJfQoKICAv KiBUcnkgYSA0LWJ5dGUgaW1tZWRpYXRlIHdpdGggTVNMLCBleGNlcHQgZm9yIGNhc2VzIHRoYXQg TVZOCiAgICAgY2FuIGhhbmRsZS4gICovCiAgaWYgKHdoaWNoID09IEFBUkNINjRfQ0hFQ0tfTU9W KQogICAgZm9yICh1bnNpZ25lZCBpbnQgc2hpZnQgPSA4OyBzaGlmdCA8IDI0OyBzaGlmdCArPSA4 KQogICAgICB7Cgl1bnNpZ25lZCBpbnQgbG93ID0gKDEgPDwgc2hpZnQpIC0gMTsKCWlmICgoKHZh bDMyICYgKDB4ZmYgPDwgc2hpZnQpKSB8IGxvdykgPT0gdmFsMzIpCgkgIHsKCSAgICBpZiAoaW5m bykKCSAgICAgICppbmZvID0gc2ltZF9pbW1lZGlhdGVfaW5mbyAoU0ltb2RlLCB2YWwzMiA+PiBz aGlmdCwgaW5zbiwKCQkJCQkgICBzaW1kX2ltbWVkaWF0ZV9pbmZvOjpNU0wsIHNoaWZ0KTsKCSAg ICByZXR1cm4gdHJ1ZTsKCSAgfQogICAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKLyogUmV0dXJu IHRydWUgaWYgcmVwbGljYXRpbmcgVkFMNjQgaXMgYSB2YWxpZCBpbW1lZGlhdGUgZm9yIHRoZQog ICBBZHZhbmNlZCBTSU1EIG9wZXJhdGlvbiBkZXNjcmliZWQgYnkgV0hJQ0guICBJZiBJTkZPIGlz IG5vbm51bGwsCiAgIHVzZSBpdCB0byBkZXNjcmliZSB2YWxpZCBpbW1lZGlhdGVzLiAgKi8Kc3Rh dGljIGJvb2wKYWFyY2g2NF9hZHZzaW1kX3ZhbGlkX2ltbWVkaWF0ZSAodW5zaWduZWQgSE9TVF9X SURFX0lOVCB2YWw2NCwKCQkJCSBzaW1kX2ltbWVkaWF0ZV9pbmZvICppbmZvLAoJCQkJIGVudW0g c2ltZF9pbW1lZGlhdGVfY2hlY2sgd2hpY2gpCnsKICB1bnNpZ25lZCBpbnQgdmFsMzIgPSB2YWw2 NCAmIDB4ZmZmZmZmZmY7CiAgdW5zaWduZWQgaW50IHZhbDE2ID0gdmFsNjQgJiAweGZmZmY7CiAg dW5zaWduZWQgaW50IHZhbDggPSB2YWw2NCAmIDB4ZmY7CgogIGlmICh2YWwzMiA9PSAodmFsNjQg Pj4gMzIpKQogICAgewogICAgICBpZiAoKHdoaWNoICYgQUFSQ0g2NF9DSEVDS19PUlIpICE9IDAK CSAgJiYgYWFyY2g2NF9hZHZzaW1kX3ZhbGlkX2ltbWVkaWF0ZV9ocyAodmFsMzIsIGluZm8sIHdo aWNoLAoJCQkJCQkgc2ltZF9pbW1lZGlhdGVfaW5mbzo6TU9WKSkKCXJldHVybiB0cnVlOwoKICAg ICAgaWYgKCh3aGljaCAmIEFBUkNINjRfQ0hFQ0tfQklDKSAhPSAwCgkgICYmIGFhcmNoNjRfYWR2 c2ltZF92YWxpZF9pbW1lZGlhdGVfaHMgKH52YWwzMiwgaW5mbywgd2hpY2gsCgkJCQkJCSBzaW1k X2ltbWVkaWF0ZV9pbmZvOjpNVk4pKQoJcmV0dXJuIHRydWU7CgogICAgICAvKiBUcnkgdXNpbmcg YSByZXBsaWNhdGVkIGJ5dGUuICAqLwogICAgICBpZiAod2hpY2ggPT0gQUFSQ0g2NF9DSEVDS19N T1YKCSAgJiYgdmFsMTYgPT0gKHZhbDMyID4+IDE2KQoJICAmJiB2YWw4ID09ICh2YWwxNiA+PiA4 KSkKCXsKCSAgaWYgKGluZm8pCgkgICAgKmluZm8gPSBzaW1kX2ltbWVkaWF0ZV9pbmZvIChRSW1v ZGUsIHZhbDgpOwoJICByZXR1cm4gdHJ1ZTsKCX0KICAgIH0KCiAgLyogVHJ5IHVzaW5nIGEgYml0 LXRvLWJ5dGVtYXNrLiAgKi8KICBpZiAod2hpY2ggPT0gQUFSQ0g2NF9DSEVDS19NT1YpCiAgICB7 CiAgICAgIHVuc2lnbmVkIGludCBpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gOCkK CXsKCSAgdW5zaWduZWQgY2hhciBieXRlID0gKHZhbDY0ID4+IGkpICYgMHhmZjsKCSAgaWYgKGJ5 dGUgIT0gMCAmJiBieXRlICE9IDB4ZmYpCgkgICAgYnJlYWs7Cgl9CiAgICAgIGlmIChpID09IDY0 KQoJewoJICBpZiAoaW5mbykKCSAgICAqaW5mbyA9IHNpbWRfaW1tZWRpYXRlX2luZm8gKERJbW9k ZSwgdmFsNjQpOwoJICByZXR1cm4gdHJ1ZTsKCX0KICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8q IFJldHVybiB0cnVlIGlmIHJlcGxpY2F0aW5nIFZBTDY0IGdpdmVzIGEgdmFsaWQgaW1tZWRpYXRl IGZvciBhbiBTVkUgTU9WCiAgIGluc3RydWN0aW9uLiAgSWYgSU5GTyBpcyBub25udWxsLCB1c2Ug aXQgdG8gZGVzY3JpYmUgdmFsaWQgaW1tZWRpYXRlcy4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0 X3N2ZV92YWxpZF9pbW1lZGlhdGUgKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgdmFsNjQsCgkJCSAg ICAgc2ltZF9pbW1lZGlhdGVfaW5mbyAqaW5mbykKewogIHNjYWxhcl9pbnRfbW9kZSBtb2RlID0g REltb2RlOwogIHVuc2lnbmVkIGludCB2YWwzMiA9IHZhbDY0ICYgMHhmZmZmZmZmZjsKICBpZiAo dmFsMzIgPT0gKHZhbDY0ID4+IDMyKSkKICAgIHsKICAgICAgbW9kZSA9IFNJbW9kZTsKICAgICAg dW5zaWduZWQgaW50IHZhbDE2ID0gdmFsMzIgJiAweGZmZmY7CiAgICAgIGlmICh2YWwxNiA9PSAo dmFsMzIgPj4gMTYpKQoJewoJICBtb2RlID0gSEltb2RlOwoJICB1bnNpZ25lZCBpbnQgdmFsOCA9 IHZhbDE2ICYgMHhmZjsKCSAgaWYgKHZhbDggPT0gKHZhbDE2ID4+IDgpKQoJICAgIG1vZGUgPSBR SW1vZGU7Cgl9CiAgICB9CiAgSE9TVF9XSURFX0lOVCB2YWwgPSB0cnVuY19pbnRfZm9yX21vZGUg KHZhbDY0LCBtb2RlKTsKICBpZiAoSU5fUkFOR0UgKHZhbCwgLTB4ODAsIDB4N2YpKQogICAgewog ICAgICAvKiBEVVAgd2l0aCBubyBzaGlmdC4gICovCiAgICAgIGlmIChpbmZvKQoJKmluZm8gPSBz aW1kX2ltbWVkaWF0ZV9pbmZvIChtb2RlLCB2YWwpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0K ICBpZiAoKHZhbCAmIDB4ZmYpID09IDAgJiYgSU5fUkFOR0UgKHZhbCwgLTB4ODAwMCwgMHg3ZjAw KSkKICAgIHsKICAgICAgLyogRFVQIHdpdGggTFNMICM4LiAgKi8KICAgICAgaWYgKGluZm8pCgkq aW5mbyA9IHNpbWRfaW1tZWRpYXRlX2luZm8gKG1vZGUsIHZhbCk7CiAgICAgIHJldHVybiB0cnVl OwogICAgfQogIGlmIChhYXJjaDY0X2JpdG1hc2tfaW1tICh2YWw2NCwgbW9kZSkpCiAgICB7CiAg ICAgIC8qIERVUE0uICAqLwogICAgICBpZiAoaW5mbykKCSppbmZvID0gc2ltZF9pbW1lZGlhdGVf aW5mbyAobW9kZSwgdmFsKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgcmV0dXJuIGZhbHNl Owp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBYIGlzIGFuIFVOU1BFQ19QVFJVRSBjb25zdGFudCBvZiB0 aGUgZm9ybToKCiAgICAgICAoY29uc3QgKHVuc3BlYyBbUEFUVEVSTiBaRVJPXSBVTlNQRUNfUFRS VUUpKQoKICAgd2hlcmUgUEFUVEVSTiBpcyB0aGUgc3ZwYXR0ZXJuIGFzIGEgQ09OU1RfSU5UIGFu ZCB3aGVyZSBaRVJPCiAgIGlzIGEgemVybyBjb25zdGFudCBvZiB0aGUgcmVxdWlyZWQgUFRSVUUg bW9kZSAod2hpY2ggY2FuIGhhdmUKICAgZmV3ZXIgZWxlbWVudHMgdGhhbiBYJ3MgbW9kZSwgaWYg emVybyBiaXRzIGFyZSBzaWduaWZpY2FudCkuCgogICBJZiBzbywgYW5kIGlmIElORk8gaXMgbm9u bnVsbCwgZGVzY3JpYmUgdGhlIGltbWVkaWF0ZSBpbiBJTkZPLiAgKi8KYm9vbAphYXJjaDY0X3N2 ZV9wdHJ1ZV9zdnBhdHRlcm5fcCAocnR4IHgsIHN0cnVjdCBzaW1kX2ltbWVkaWF0ZV9pbmZvICpp bmZvKQp7CiAgaWYgKEdFVF9DT0RFICh4KSAhPSBDT05TVCkKICAgIHJldHVybiBmYWxzZTsKCiAg eCA9IFhFWFAgKHgsIDApOwogIGlmIChHRVRfQ09ERSAoeCkgIT0gVU5TUEVDIHx8IFhJTlQgKHgs IDEpICE9IFVOU1BFQ19QVFJVRSkKICAgIHJldHVybiBmYWxzZTsKCiAgaWYgKGluZm8pCiAgICB7 CiAgICAgIGFhcmNoNjRfc3ZwYXR0ZXJuIHBhdHRlcm4KCT0gKGFhcmNoNjRfc3ZwYXR0ZXJuKSBJ TlRWQUwgKFhWRUNFWFAgKHgsIDAsIDApKTsKICAgICAgbWFjaGluZV9tb2RlIHByZWRfbW9kZSA9 IEdFVF9NT0RFIChYVkVDRVhQICh4LCAwLCAxKSk7CiAgICAgIHNjYWxhcl9pbnRfbW9kZSBpbnRf bW9kZSA9IGFhcmNoNjRfc3ZlX2VsZW1lbnRfaW50X21vZGUgKHByZWRfbW9kZSk7CiAgICAgICpp bmZvID0gc2ltZF9pbW1lZGlhdGVfaW5mbyAoaW50X21vZGUsIHBhdHRlcm4pOwogICAgfQogIHJl dHVybiB0cnVlOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBYIGlzIGEgdmFsaWQgU1ZFIHByZWRpY2F0 ZS4gIElmIElORk8gaXMgbm9ubnVsbCwgdXNlCiAgIGl0IHRvIGRlc2NyaWJlIHZhbGlkIGltbWVk aWF0ZXMuICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF9zdmVfcHJlZF92YWxpZF9pbW1lZGlhdGUg KHJ0eCB4LCBzaW1kX2ltbWVkaWF0ZV9pbmZvICppbmZvKQp7CiAgaWYgKGFhcmNoNjRfc3ZlX3B0 cnVlX3N2cGF0dGVybl9wICh4LCBpbmZvKSkKICAgIHJldHVybiB0cnVlOwoKICBpZiAoeCA9PSBD T05TVDBfUlRYIChHRVRfTU9ERSAoeCkpKQogICAgewogICAgICBpZiAoaW5mbykKCSppbmZvID0g c2ltZF9pbW1lZGlhdGVfaW5mbyAoREltb2RlLCAwKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9 CgogIC8qIEFuYWx5emUgdGhlIHZhbHVlIGFzIGEgVk54MTZCSW1vZGUuICBUaGlzIHNob3VsZCBi ZSByZWxhdGl2ZWx5CiAgICAgZWZmaWNpZW50LCBzaW5jZSBydHhfdmVjdG9yX2J1aWxkZXIgaGFz IGVub3VnaCBidWlsdC1pbiBjYXBhY2l0eQogICAgIHRvIHN0b3JlIGFsbCBWTEEgcHJlZGljYXRl IGNvbnN0YW50cyB3aXRob3V0IG5lZWRpbmcgdGhlIGhlYXAuICAqLwogIHJ0eF92ZWN0b3JfYnVp bGRlciBidWlsZGVyOwogIGlmICghYWFyY2g2NF9nZXRfc3ZlX3ByZWRfYml0cyAoYnVpbGRlciwg eCkpCiAgICByZXR1cm4gZmFsc2U7CgogIHVuc2lnbmVkIGludCBlbHRfc2l6ZSA9IGFhcmNoNjRf d2lkZXN0X3N2ZV9wcmVkX2VsdF9zaXplIChidWlsZGVyKTsKICBpZiAoaW50IHZsID0gYWFyY2g2 NF9wYXJ0aWFsX3B0cnVlX2xlbmd0aCAoYnVpbGRlciwgZWx0X3NpemUpKQogICAgewogICAgICBt YWNoaW5lX21vZGUgbW9kZSA9IGFhcmNoNjRfc3ZlX3ByZWRfbW9kZSAoZWx0X3NpemUpLnJlcXVp cmUgKCk7CiAgICAgIGFhcmNoNjRfc3ZwYXR0ZXJuIHBhdHRlcm4gPSBhYXJjaDY0X3N2cGF0dGVy bl9mb3JfdmwgKG1vZGUsIHZsKTsKICAgICAgaWYgKHBhdHRlcm4gIT0gQUFSQ0g2NF9OVU1fU1ZQ QVRURVJOUykKCXsKCSAgaWYgKGluZm8pCgkgICAgewoJICAgICAgc2NhbGFyX2ludF9tb2RlIGlu dF9tb2RlID0gYWFyY2g2NF9zdmVfZWxlbWVudF9pbnRfbW9kZSAobW9kZSk7CgkgICAgICAqaW5m byA9IHNpbWRfaW1tZWRpYXRlX2luZm8gKGludF9tb2RlLCBwYXR0ZXJuKTsKCSAgICB9CgkgIHJl dHVybiB0cnVlOwoJfQogICAgfQogIHJldHVybiBmYWxzZTsKfQoKLyogUmV0dXJuIHRydWUgaWYg T1AgaXMgYSB2YWxpZCBTSU1EIGltbWVkaWF0ZSBmb3IgdGhlIG9wZXJhdGlvbgogICBkZXNjcmli ZWQgYnkgV0hJQ0guICBJZiBJTkZPIGlzIG5vbm51bGwsIHVzZSBpdCB0byBkZXNjcmliZSB2YWxp ZAogICBpbW1lZGlhdGVzLiAgKi8KYm9vbAphYXJjaDY0X3NpbWRfdmFsaWRfaW1tZWRpYXRlIChy dHggb3AsIHNpbWRfaW1tZWRpYXRlX2luZm8gKmluZm8sCgkJCSAgICAgIGVudW0gc2ltZF9pbW1l ZGlhdGVfY2hlY2sgd2hpY2gpCnsKICBtYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFIChvcCk7 CiAgdW5zaWduZWQgaW50IHZlY19mbGFncyA9IGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9yX21vZGUg KG1vZGUpOwogIGlmICh2ZWNfZmxhZ3MgPT0gMCB8fCB2ZWNfZmxhZ3MgPT0gKFZFQ19BRFZTSU1E IHwgVkVDX1NUUlVDVCkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmICgodmVjX2ZsYWdzICYgVkVD X0FEVlNJTUQpICYmICFUQVJHRVRfU0lNRCkKICAgIHJldHVybiBmYWxzZTsKCiAgaWYgKHZlY19m bGFncyAmIFZFQ19TVkVfUFJFRCkKICAgIHJldHVybiBhYXJjaDY0X3N2ZV9wcmVkX3ZhbGlkX2lt bWVkaWF0ZSAob3AsIGluZm8pOwoKICBzY2FsYXJfbW9kZSBlbHRfbW9kZSA9IEdFVF9NT0RFX0lO TkVSIChtb2RlKTsKICBydHggYmFzZSwgc3RlcDsKICB1bnNpZ25lZCBpbnQgbl9lbHRzOwogIGlm IChDT05TVF9WRUNUT1JfUCAob3ApCiAgICAgICYmIENPTlNUX1ZFQ1RPUl9EVVBMSUNBVEVfUCAo b3ApKQogICAgbl9lbHRzID0gQ09OU1RfVkVDVE9SX05QQVRURVJOUyAob3ApOwogIGVsc2UgaWYg KCh2ZWNfZmxhZ3MgJiBWRUNfU1ZFX0RBVEEpCgkgICAmJiBjb25zdF92ZWNfc2VyaWVzX3AgKG9w LCAmYmFzZSwgJnN0ZXApKQogICAgewogICAgICBnY2NfYXNzZXJ0IChHRVRfTU9ERV9DTEFTUyAo bW9kZSkgPT0gTU9ERV9WRUNUT1JfSU5UKTsKICAgICAgaWYgKCFhYXJjaDY0X3N2ZV9pbmRleF9p bW1lZGlhdGVfcCAoYmFzZSkKCSAgfHwgIWFhcmNoNjRfc3ZlX2luZGV4X2ltbWVkaWF0ZV9wIChz dGVwKSkKCXJldHVybiBmYWxzZTsKCiAgICAgIGlmIChpbmZvKQoJewoJICAvKiBHZXQgdGhlIGNv cnJlc3BvbmRpbmcgY29udGFpbmVyIG1vZGUuICBFLmcuIGFuIElOREVYIG9uIFYyU0kKCSAgICAg c2hvdWxkIHlpZWxkIHR3byBpbnRlZ2VyIHZhbHVlcyBwZXIgMTI4LWJpdCBibG9jaywgbWVhbmlu ZwoJICAgICB0aGF0IHdlIG5lZWQgdG8gdHJlYXQgaXQgaW4gdGhlIHNhbWUgd2F5IGFzIFYyREkg YW5kIHRoZW4KCSAgICAgaWdub3JlIHRoZSB1cHBlciAzMiBiaXRzIG9mIGVhY2ggZWxlbWVudC4g ICovCgkgIGVsdF9tb2RlID0gYWFyY2g2NF9zdmVfY29udGFpbmVyX2ludF9tb2RlIChtb2RlKTsK CSAgKmluZm8gPSBzaW1kX2ltbWVkaWF0ZV9pbmZvIChlbHRfbW9kZSwgYmFzZSwgc3RlcCk7Cgl9 CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIGVsc2UgaWYgKENPTlNUX1ZFQ1RPUl9QIChvcCkK CSAgICYmIENPTlNUX1ZFQ1RPUl9OVU5JVFMgKG9wKS5pc19jb25zdGFudCAoJm5fZWx0cykpCiAg ICAvKiBOX0VMVFMgc2V0IGFib3ZlLiAgKi87CiAgZWxzZQogICAgcmV0dXJuIGZhbHNlOwoKICBz Y2FsYXJfZmxvYXRfbW9kZSBlbHRfZmxvYXRfbW9kZTsKICBpZiAobl9lbHRzID09IDEKICAgICAg JiYgaXNfYSA8c2NhbGFyX2Zsb2F0X21vZGU+IChlbHRfbW9kZSwgJmVsdF9mbG9hdF9tb2RlKSkK ICAgIHsKICAgICAgcnR4IGVsdCA9IENPTlNUX1ZFQ1RPUl9FTkNPREVEX0VMVCAob3AsIDApOwog ICAgICBpZiAoYWFyY2g2NF9mbG9hdF9jb25zdF96ZXJvX3J0eF9wIChlbHQpCgkgIHx8IGFhcmNo NjRfZmxvYXRfY29uc3RfcmVwcmVzZW50YWJsZV9wIChlbHQpKQoJewoJICBpZiAoaW5mbykKCSAg ICAqaW5mbyA9IHNpbWRfaW1tZWRpYXRlX2luZm8gKGVsdF9mbG9hdF9tb2RlLCBlbHQpOwoJICBy ZXR1cm4gdHJ1ZTsKCX0KICAgIH0KCiAgLyogSWYgYWxsIGVsZW1lbnRzIGluIGFuIFNWRSB2ZWN0 b3IgaGF2ZSB0aGUgc2FtZSB2YWx1ZSwgd2UgaGF2ZSBhIGZyZWUKICAgICBjaG9pY2UgYmV0d2Vl biB1c2luZyB0aGUgZWxlbWVudCBtb2RlIGFuZCB1c2luZyB0aGUgY29udGFpbmVyIG1vZGUuCiAg ICAgVXNpbmcgdGhlIGVsZW1lbnQgbW9kZSBtZWFucyB0aGF0IHVudXNlZCBwYXJ0cyBvZiB0aGUg dmVjdG9yIGFyZQogICAgIGR1cGxpY2F0ZXMgb2YgdGhlIHVzZWQgZWxlbWVudHMsIHdoaWxlIHVz aW5nIHRoZSBjb250YWluZXIgbW9kZSBtZWFucwogICAgIHRoYXQgdGhlIHVudXNlZCBwYXJ0cyBh cmUgYW4gZXh0ZW5zaW9uIG9mIHRoZSB1c2VkIGVsZW1lbnRzLiAgVXNpbmcgdGhlCiAgICAgZWxl bWVudCBtb2RlIGlzIGJldHRlciBmb3IgKHNheSkgVk54NEhJIDB4MTAxLCBzaW5jZSAweDAxMDEw MTAxIGlzIHZhbGlkCiAgICAgZm9yIGl0cyBjb250YWluZXIgbW9kZSBWTng0U0kgd2hpbGUgMHgw MDAwMDEwMSBpc24ndC4KCiAgICAgSWYgbm90IGFsbCBlbGVtZW50cyBpbiBhbiBTVkUgdmVjdG9y IGhhdmUgdGhlIHNhbWUgdmFsdWUsIHdlIG5lZWQgdGhlCiAgICAgdHJhbnNpdGlvbiBmcm9tIG9u ZSBlbGVtZW50IHRvIHRoZSBuZXh0IHRvIG9jY3VyIGF0IGNvbnRhaW5lciBib3VuZGFyaWVzLgog ICAgIEUuZy4gYSBmaXhlZC1sZW5ndGggVk54NEhJIGNvbnRhaW5pbmcgeyAxLCAyLCAzLCA0IH0g c2hvdWxkIGJlIHRyZWF0ZWQKICAgICBpbiB0aGUgc2FtZSB3YXkgYXMgYSBWTng0U0kgY29udGFp bmluZyB7IDEsIDIsIDMsIDQgfS4gICovCiAgc2NhbGFyX2ludF9tb2RlIGVsdF9pbnRfbW9kZTsK ICBpZiAoKHZlY19mbGFncyAmIFZFQ19TVkVfREFUQSkgJiYgbl9lbHRzID4gMSkKICAgIGVsdF9p bnRfbW9kZSA9IGFhcmNoNjRfc3ZlX2NvbnRhaW5lcl9pbnRfbW9kZSAobW9kZSk7CiAgZWxzZQog ICAgZWx0X2ludF9tb2RlID0gaW50X21vZGVfZm9yX21vZGUgKGVsdF9tb2RlKS5yZXF1aXJlICgp OwoKICB1bnNpZ25lZCBpbnQgZWx0X3NpemUgPSBHRVRfTU9ERV9TSVpFIChlbHRfaW50X21vZGUp OwogIGlmIChlbHRfc2l6ZSA+IDgpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIEV4cGFuZCB0aGUg dmVjdG9yIGNvbnN0YW50IG91dCBpbnRvIGEgYnl0ZSB2ZWN0b3IsIHdpdGggdGhlIGxlYXN0CiAg ICAgc2lnbmlmaWNhbnQgYnl0ZSBvZiB0aGUgcmVnaXN0ZXIgZmlyc3QuICAqLwogIGF1dG9fdmVj PHVuc2lnbmVkIGNoYXIsIDE2PiBieXRlczsKICBieXRlcy5yZXNlcnZlIChuX2VsdHMgKiBlbHRf c2l6ZSk7CiAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuX2VsdHM7IGkrKykKICAgIHsK ICAgICAgLyogVGhlIHZlY3RvciBpcyBwcm92aWRlZCBpbiBnY2MgZW5kaWFuLW5ldXRyYWwgZmFz aGlvbi4KCSBGb3IgYWFyY2g2NF9iZSBBZHZhbmNlZCBTSU1ELCBpdCBtdXN0IGJlIGxhaWQgb3V0 IGluIHRoZSB2ZWN0b3IKCSByZWdpc3RlciBpbiByZXZlcnNlIG9yZGVyLiAgKi8KICAgICAgYm9v bCBzd2FwX3AgPSAoKHZlY19mbGFncyAmIFZFQ19BRFZTSU1EKSAhPSAwICYmIEJZVEVTX0JJR19F TkRJQU4pOwogICAgICBydHggZWx0ID0gQ09OU1RfVkVDVE9SX0VMVCAob3AsIHN3YXBfcCA/IChu X2VsdHMgLSAxIC0gaSkgOiBpKTsKCiAgICAgIGlmIChlbHRfbW9kZSAhPSBlbHRfaW50X21vZGUp CgllbHQgPSBnZW5fbG93cGFydCAoZWx0X2ludF9tb2RlLCBlbHQpOwoKICAgICAgaWYgKCFDT05T VF9JTlRfUCAoZWx0KSkKCXJldHVybiBmYWxzZTsKCiAgICAgIHVuc2lnbmVkIEhPU1RfV0lERV9J TlQgZWx0X3ZhbCA9IElOVFZBTCAoZWx0KTsKICAgICAgZm9yICh1bnNpZ25lZCBpbnQgYnl0ZSA9 IDA7IGJ5dGUgPCBlbHRfc2l6ZTsgYnl0ZSsrKQoJewoJICBieXRlcy5xdWlja19wdXNoIChlbHRf dmFsICYgMHhmZik7CgkgIGVsdF92YWwgPj49IEJJVFNfUEVSX1VOSVQ7Cgl9CiAgICB9CgogIC8q IFRoZSBpbW1lZGlhdGUgbXVzdCByZXBlYXQgZXZlcnkgZWlnaHQgYnl0ZXMuICAqLwogIHVuc2ln bmVkIGludCBuYnl0ZXMgPSBieXRlcy5sZW5ndGggKCk7CiAgZm9yICh1bnNpZ25lZCBpID0gODsg aSA8IG5ieXRlczsgKytpKQogICAgaWYgKGJ5dGVzW2ldICE9IGJ5dGVzW2kgLSA4XSkKICAgICAg cmV0dXJuIGZhbHNlOwoKICAvKiBHZXQgdGhlIHJlcGVhdGluZyA4LWJ5dGUgdmFsdWUgYXMgYW4g aW50ZWdlci4gIE5vIGVuZGlhbiBjb3JyZWN0aW9uCiAgICAgaXMgbmVlZGVkIGhlcmUgYmVjYXVz ZSBieXRlcyBpcyBhbHJlYWR5IGluIGxzYi1maXJzdCBvcmRlci4gICovCiAgdW5zaWduZWQgSE9T VF9XSURFX0lOVCB2YWw2NCA9IDA7CiAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCA4OyBp KyspCiAgICB2YWw2NCB8PSAoKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpIGJ5dGVzW2kgJSBuYnl0 ZXNdCgkgICAgICA8PCAoaSAqIEJJVFNfUEVSX1VOSVQpKTsKCiAgaWYgKHZlY19mbGFncyAmIFZF Q19TVkVfREFUQSkKICAgIHJldHVybiBhYXJjaDY0X3N2ZV92YWxpZF9pbW1lZGlhdGUgKHZhbDY0 LCBpbmZvKTsKICBlbHNlCiAgICByZXR1cm4gYWFyY2g2NF9hZHZzaW1kX3ZhbGlkX2ltbWVkaWF0 ZSAodmFsNjQsIGluZm8sIHdoaWNoKTsKfQoKLyogQ2hlY2sgd2hldGhlciBYIGlzIGEgVkVDX1NF UklFUy1saWtlIGNvbnN0YW50IHRoYXQgc3RhcnRzIGF0IDAgYW5kCiAgIGhhcyBhIHN0ZXAgaW4g dGhlIHJhbmdlIG9mIElOREVYLiAgUmV0dXJuIHRoZSBpbmRleCBleHByZXNzaW9uIGlmIHNvLAog ICBvdGhlcndpc2UgcmV0dXJuIG51bGwuICAqLwpydHgKYWFyY2g2NF9jaGVja196ZXJvX2Jhc2Vk X3N2ZV9pbmRleF9pbW1lZGlhdGUgKHJ0eCB4KQp7CiAgcnR4IGJhc2UsIHN0ZXA7CiAgaWYgKGNv bnN0X3ZlY19zZXJpZXNfcCAoeCwgJmJhc2UsICZzdGVwKQogICAgICAmJiBiYXNlID09IGNvbnN0 MF9ydHgKICAgICAgJiYgYWFyY2g2NF9zdmVfaW5kZXhfaW1tZWRpYXRlX3AgKHN0ZXApKQogICAg cmV0dXJuIHN0ZXA7CiAgcmV0dXJuIE5VTExfUlRYOwp9CgovKiBDaGVjayBvZiBpbW1lZGlhdGUg c2hpZnQgY29uc3RhbnRzIGFyZSB3aXRoaW4gcmFuZ2UuICAqLwpib29sCmFhcmNoNjRfc2ltZF9z aGlmdF9pbW1fcCAocnR4IHgsIG1hY2hpbmVfbW9kZSBtb2RlLCBib29sIGxlZnQpCnsKICB4ID0g dW53cmFwX2NvbnN0X3ZlY19kdXBsaWNhdGUgKHgpOwogIGlmICghQ09OU1RfSU5UX1AgKHgpKQog ICAgcmV0dXJuIGZhbHNlOwogIGludCBiaXRfd2lkdGggPSBHRVRfTU9ERV9VTklUX1NJWkUgKG1v ZGUpICogQklUU19QRVJfVU5JVDsKICBpZiAobGVmdCkKICAgIHJldHVybiBJTl9SQU5HRSAoSU5U VkFMICh4KSwgMCwgYml0X3dpZHRoIC0gMSk7CiAgZWxzZQogICAgcmV0dXJuIElOX1JBTkdFIChJ TlRWQUwgKHgpLCAxLCBiaXRfd2lkdGgpOwp9CgovKiBSZXR1cm4gdGhlIGJpdG1hc2sgQ09OU1Rf SU5UIHRvIHNlbGVjdCB0aGUgYml0cyByZXF1aXJlZCBieSBhIHplcm8gZXh0cmFjdAogICBvcGVy YXRpb24gb2Ygd2lkdGggV0lEVEggYXQgYml0IHBvc2l0aW9uIFBPUy4gICovCgpydHgKYWFyY2g2 NF9tYXNrX2Zyb21femV4dHJhY3Rfb3BzIChydHggd2lkdGgsIHJ0eCBwb3MpCnsKICBnY2NfYXNz ZXJ0IChDT05TVF9JTlRfUCAod2lkdGgpKTsKICBnY2NfYXNzZXJ0IChDT05TVF9JTlRfUCAocG9z KSk7CgogIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbWFzawogICAgPSAoKHVuc2lnbmVkIEhPU1Rf V0lERV9JTlQpIDEgPDwgVUlOVFZBTCAod2lkdGgpKSAtIDE7CiAgcmV0dXJuIEdFTl9JTlQgKG1h c2sgPDwgVUlOVFZBTCAocG9zKSk7Cn0KCmJvb2wKYWFyY2g2NF9tb3Zfb3BlcmFuZF9wIChydHgg eCwgbWFjaGluZV9tb2RlIG1vZGUpCnsKICBpZiAoR0VUX0NPREUgKHgpID09IEhJR0gKICAgICAg JiYgYWFyY2g2NF92YWxpZF9zeW1yZWYgKFhFWFAgKHgsIDApLCBHRVRfTU9ERSAoWEVYUCAoeCwg MCkpKSkKICAgIHJldHVybiB0cnVlOwoKICBpZiAoQ09OU1RfSU5UX1AgKHgpKQogICAgcmV0dXJu IHRydWU7CgogIGlmIChWRUNUT1JfTU9ERV9QIChHRVRfTU9ERSAoeCkpKQogICAgewogICAgICAv KiBSZXF1aXJlIHByZWRpY2F0ZSBjb25zdGFudHMgdG8gYmUgVk54MTZCSSBiZWZvcmUgUkEsIHNv IHRoYXQgd2UKCSBmb3JjZSBldmVyeXRoaW5nIHRvIGhhdmUgYSBjYW5vbmljYWwgZm9ybS4gICov CiAgICAgIGlmICghbHJhX2luX3Byb2dyZXNzCgkgICYmICFyZWxvYWRfY29tcGxldGVkCgkgICYm IEdFVF9NT0RFX0NMQVNTIChHRVRfTU9ERSAoeCkpID09IE1PREVfVkVDVE9SX0JPT0wKCSAgJiYg R0VUX01PREUgKHgpICE9IFZOeDE2Qkltb2RlKQoJcmV0dXJuIGZhbHNlOwoKICAgICAgcmV0dXJu IGFhcmNoNjRfc2ltZF92YWxpZF9pbW1lZGlhdGUgKHgsIE5VTEwpOwogICAgfQoKICAvKiBSZW1v dmUgVU5TUEVDX1NBTFRfQUREUiBiZWZvcmUgY2hlY2tpbmcgc3ltYm9sIHJlZmVyZW5jZS4gICov CiAgeCA9IHN0cmlwX3NhbHQgKHgpOwoKICAvKiBHT1QgYWNjZXNzZXMgYXJlIHZhbGlkIG1vdmVz LiAgKi8KICBpZiAoU1lNQk9MX1JFRl9QICh4KQogICAgICAmJiBhYXJjaDY0X2NsYXNzaWZ5X3N5 bWJvbGljX2V4cHJlc3Npb24gKHgpID09IFNZTUJPTF9TTUFMTF9HT1RfNEcpCiAgICByZXR1cm4g dHJ1ZTsKCiAgaWYgKFNZTUJPTF9SRUZfUCAoeCkgJiYgbW9kZSA9PSBESW1vZGUgJiYgQ09OU1RB TlRfQUREUkVTU19QICh4KSkKICAgIHJldHVybiB0cnVlOwoKICBpZiAoVEFSR0VUX1NWRSAmJiBh YXJjaDY0X3N2ZV9jbnRfaW1tZWRpYXRlX3AgKHgpKQogICAgcmV0dXJuIHRydWU7CgogIHJldHVy biBhYXJjaDY0X2NsYXNzaWZ5X3N5bWJvbGljX2V4cHJlc3Npb24gKHgpCiAgICA9PSBTWU1CT0xf VElOWV9BQlNPTFVURTsKfQoKLyogQ3JlYXRlIGEgMCBjb25zdGFudCB0aGF0IGlzIGJhc2VkIG9u IFY0U0kgdG8gYWxsb3cgQ1NFIHRvIG9wdGltYWxseSBzaGFyZQogICB0aGUgY29uc3RhbnQgY3Jl YXRpb24uICAqLwoKcnR4CmFhcmNoNjRfZ2VuX3NoYXJlYWJsZV96ZXJvIChtYWNoaW5lX21vZGUg bW9kZSkKewogIG1hY2hpbmVfbW9kZSB6bW9kZSA9IFY0U0ltb2RlOwogIHJ0eCB0bXAgPSBnZW5f cmVnX3J0eCAoem1vZGUpOwogIGVtaXRfbW92ZV9pbnNuICh0bXAsIENPTlNUMF9SVFggKHptb2Rl KSk7CiAgcmV0dXJuIGxvd3BhcnRfc3VicmVnIChtb2RlLCB0bXAsIHptb2RlKTsKfQoKLyogUmV0 dXJuIGEgY29uc3RfaW50IHZlY3RvciBvZiBWQUwuICAqLwpydHgKYWFyY2g2NF9zaW1kX2dlbl9j b25zdF92ZWN0b3JfZHVwIChtYWNoaW5lX21vZGUgbW9kZSwgSE9TVF9XSURFX0lOVCB2YWwpCnsK ICBydHggYyA9IGdlbl9pbnRfbW9kZSAodmFsLCBHRVRfTU9ERV9JTk5FUiAobW9kZSkpOwogIHJl dHVybiBnZW5fY29uc3RfdmVjX2R1cGxpY2F0ZSAobW9kZSwgYyk7Cn0KCi8qIENoZWNrIE9QIGlz IGEgbGVnYWwgc2NhbGFyIGltbWVkaWF0ZSBmb3IgdGhlIE1PVkkgaW5zdHJ1Y3Rpb24uICAqLwoK Ym9vbAphYXJjaDY0X3NpbWRfc2NhbGFyX2ltbWVkaWF0ZV92YWxpZF9mb3JfbW92ZSAocnR4IG9w LCBzY2FsYXJfaW50X21vZGUgbW9kZSkKewogIG1hY2hpbmVfbW9kZSB2bW9kZTsKCiAgdm1vZGUg PSBhYXJjaDY0X3NpbWRfY29udGFpbmVyX21vZGUgKG1vZGUsIDY0KTsKICBydHggb3BfdiA9IGFh cmNoNjRfc2ltZF9nZW5fY29uc3RfdmVjdG9yX2R1cCAodm1vZGUsIElOVFZBTCAob3ApKTsKICBy ZXR1cm4gYWFyY2g2NF9zaW1kX3ZhbGlkX2ltbWVkaWF0ZSAob3BfdiwgTlVMTCk7Cn0KCi8qIENv bnN0cnVjdCBhbmQgcmV0dXJuIGEgUEFSQUxMRUwgUlRYIHZlY3RvciB3aXRoIGVsZW1lbnRzIG51 bWJlcmluZyB0aGUKICAgbGFuZXMgb2YgZWl0aGVyIHRoZSBoaWdoIChISUdIID09IFRSVUUpIG9y IGxvdyAoSElHSCA9PSBGQUxTRSkgaGFsZiBvZgogICB0aGUgdmVjdG9yIC0gZnJvbSB0aGUgcGVy c3BlY3RpdmUgb2YgdGhlIGFyY2hpdGVjdHVyZS4gIFRoaXMgZG9lcyBub3QKICAgbGluZSB1cCB3 aXRoIEdDQydzIHBlcnNwZWN0aXZlIG9uIGxhbmUgbnVtYmVycywgc28gd2UgZW5kIHVwIHdpdGgK ICAgZGlmZmVyZW50IG1hc2tzIGRlcGVuZGluZyBvbiBvdXIgdGFyZ2V0IGVuZGlhbi1uZXNzLiAg VGhlIGRpYWdyYW0KICAgYmVsb3cgbWF5IGhlbHAuICBXZSBtdXN0IGRyYXcgdGhlIGRpc3RpbmN0 aW9uIHdoZW4gYnVpbGRpbmcgbWFza3MKICAgd2hpY2ggc2VsZWN0IG9uZSBoYWxmIG9mIHRoZSB2 ZWN0b3IuICBBbiBpbnN0cnVjdGlvbiBzZWxlY3RpbmcKICAgYXJjaGl0ZWN0dXJhbCBsb3ctbGFu ZXMgZm9yIGEgYmlnLWVuZGlhbiB0YXJnZXQsIG11c3QgYmUgZGVzY3JpYmVkIHVzaW5nCiAgIGEg bWFzayBzZWxlY3RpbmcgR0NDIGhpZ2gtbGFuZXMuCgogICAgICAgICAgICAgICAgIEJpZy1FbmRp YW4gICAgICAgICAgICAgTGl0dGxlLUVuZGlhbgoKR0NDICAgICAgICAgICAgIDAgICAxICAgMiAg IDMgICAgICAgICAgIDMgICAyICAgMSAgIDAKICAgICAgICAgICAgICB8IHggfCB4IHwgeCB8IHgg fCAgICAgICB8IHggfCB4IHwgeCB8IHggfApBcmNoaXRlY3R1cmUgICAgMyAgIDIgICAxICAgMCAg ICAgICAgICAgMyAgIDIgICAxICAgMAoKTG93IE1hc2s6ICAgICAgICAgeyAyLCAzIH0gICAgICAg ICAgICAgICAgeyAwLCAxIH0KSGlnaCBNYXNrOiAgICAgICAgeyAwLCAxIH0gICAgICAgICAgICAg ICAgeyAyLCAzIH0KCiAgIE1PREUgSXMgdGhlIG1vZGUgb2YgdGhlIHZlY3RvciBhbmQgTlVOSVRT IGlzIHRoZSBudW1iZXIgb2YgdW5pdHMgaW4gaXQuICAqLwoKcnR4CmFhcmNoNjRfc2ltZF92ZWN0 X3Bhcl9jbnN0X2hhbGYgKG1hY2hpbmVfbW9kZSBtb2RlLCBpbnQgbnVuaXRzLCBib29sIGhpZ2gp CnsKICBydHZlYyB2ID0gcnR2ZWNfYWxsb2MgKG51bml0cyAvIDIpOwogIGludCBoaWdoX2Jhc2Ug PSBudW5pdHMgLyAyOwogIGludCBsb3dfYmFzZSA9IDA7CiAgaW50IGJhc2U7CiAgcnR4IHQxOwog IGludCBpOwoKICBpZiAoQllURVNfQklHX0VORElBTikKICAgIGJhc2UgPSBoaWdoID8gbG93X2Jh c2UgOiBoaWdoX2Jhc2U7CiAgZWxzZQogICAgYmFzZSA9IGhpZ2ggPyBoaWdoX2Jhc2UgOiBsb3df YmFzZTsKCiAgZm9yIChpID0gMDsgaSA8IG51bml0cyAvIDI7IGkrKykKICAgIFJUVkVDX0VMVCAo diwgaSkgPSBHRU5fSU5UIChiYXNlICsgaSk7CgogIHQxID0gZ2VuX3J0eF9QQVJBTExFTCAobW9k ZSwgdik7CiAgcmV0dXJuIHQxOwp9CgovKiBDaGVjayBPUCBmb3IgdmFsaWRpdHkgYXMgYSBQQVJB TExFTCBSVFggdmVjdG9yIHdpdGggZWxlbWVudHMKICAgbnVtYmVyaW5nIHRoZSBsYW5lcyBvZiBl aXRoZXIgdGhlIGhpZ2ggKEhJR0ggPT0gVFJVRSkgb3IgbG93IGxhbmVzLAogICBmcm9tIHRoZSBw ZXJzcGVjdGl2ZSBvZiB0aGUgYXJjaGl0ZWN0dXJlLiAgU2VlIHRoZSBkaWFncmFtIGFib3ZlCiAg IGFhcmNoNjRfc2ltZF92ZWN0X3Bhcl9jbnN0X2hhbGYgZm9yIG1vcmUgZGV0YWlscy4gICovCgpi b29sCmFhcmNoNjRfc2ltZF9jaGVja192ZWN0X3Bhcl9jbnN0X2hhbGYgKHJ0eCBvcCwgbWFjaGlu ZV9tb2RlIG1vZGUsCgkJCQkgICAgICAgYm9vbCBoaWdoKQp7CiAgaW50IG5lbHRzOwogIGlmICgh VkVDVE9SX01PREVfUCAobW9kZSkgfHwgIUdFVF9NT0RFX05VTklUUyAobW9kZSkuaXNfY29uc3Rh bnQgKCZuZWx0cykpCiAgICByZXR1cm4gZmFsc2U7CgogIHJ0eCBpZGVhbCA9IGFhcmNoNjRfc2lt ZF92ZWN0X3Bhcl9jbnN0X2hhbGYgKG1vZGUsIG5lbHRzLCBoaWdoKTsKICBIT1NUX1dJREVfSU5U IGNvdW50X29wID0gWFZFQ0xFTiAob3AsIDApOwogIEhPU1RfV0lERV9JTlQgY291bnRfaWRlYWwg PSBYVkVDTEVOIChpZGVhbCwgMCk7CiAgaW50IGkgPSAwOwoKICBpZiAoY291bnRfb3AgIT0gY291 bnRfaWRlYWwpCiAgICByZXR1cm4gZmFsc2U7CgogIGZvciAoaSA9IDA7IGkgPCBjb3VudF9pZGVh bDsgaSsrKQogICAgewogICAgICBydHggZWx0X29wID0gWFZFQ0VYUCAob3AsIDAsIGkpOwogICAg ICBydHggZWx0X2lkZWFsID0gWFZFQ0VYUCAoaWRlYWwsIDAsIGkpOwoKICAgICAgaWYgKCFDT05T VF9JTlRfUCAoZWx0X29wKQoJICB8fCBJTlRWQUwgKGVsdF9pZGVhbCkgIT0gSU5UVkFMIChlbHRf b3ApKQoJcmV0dXJuIGZhbHNlOwogICAgfQogIHJldHVybiB0cnVlOwp9CgovKiBSZXR1cm4gYSBQ QVJBTExFTCBjb250YWluaW5nIE5FTFRTIGVsZW1lbnRzLCB3aXRoIGVsZW1lbnQgSSBlcXVhbAog ICB0byBCQVNFICsgSSAqIFNURVAuICAqLwoKcnR4CmFhcmNoNjRfZ2VuX3N0ZXBwZWRfaW50X3Bh cmFsbGVsICh1bnNpZ25lZCBpbnQgbmVsdHMsIGludCBiYXNlLCBpbnQgc3RlcCkKewogIHJ0dmVj IHZlYyA9IHJ0dmVjX2FsbG9jIChuZWx0cyk7CiAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkg PCBuZWx0czsgKytpKQogICAgUlRWRUNfRUxUICh2ZWMsIGkpID0gZ2VuX2ludF9tb2RlIChiYXNl ICsgaSAqIHN0ZXAsIERJbW9kZSk7CiAgcmV0dXJuIGdlbl9ydHhfUEFSQUxMRUwgKFZPSURtb2Rl LCB2ZWMpOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBPUCBpcyBhIFBBUkFMTEVMIG9mIENPTlNUX0lO VHMgdGhhdCBmb3JtIGEgbGluZWFyCiAgIHNlcmllcyB3aXRoIHN0ZXAgU1RFUC4gICovCgpib29s CmFhcmNoNjRfc3RlcHBlZF9pbnRfcGFyYWxsZWxfcCAocnR4IG9wLCBpbnQgc3RlcCkKewogIGlm IChHRVRfQ09ERSAob3ApICE9IFBBUkFMTEVMIHx8ICFDT05TVF9JTlRfUCAoWFZFQ0VYUCAob3As IDAsIDApKSkKICAgIHJldHVybiBmYWxzZTsKCiAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBiYXNl ID0gVUlOVFZBTCAoWFZFQ0VYUCAob3AsIDAsIDApKTsKICBmb3IgKGludCBpID0gMTsgaSA8IFhW RUNMRU4gKG9wLCAwKTsgKytpKQogICAgaWYgKCFDT05TVF9JTlRfUCAoWFZFQ0VYUCAob3AsIDAs IGkpKQoJfHwgVUlOVFZBTCAoWFZFQ0VYUCAob3AsIDAsIGkpKSAhPSBiYXNlICsgaSAqIHN0ZXAp CiAgICAgIHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIHRydWU7Cn0KCi8qIEJvdW5kcy1jaGVjayBs YW5lcy4gIEVuc3VyZSBPUEVSQU5EIGxpZXMgYmV0d2VlbiBMT1cgKGluY2x1c2l2ZSkgYW5kCiAg IEhJR0ggKGV4Y2x1c2l2ZSkuICAqLwp2b2lkCmFhcmNoNjRfc2ltZF9sYW5lX2JvdW5kcyAocnR4 IG9wZXJhbmQsIEhPU1RfV0lERV9JTlQgbG93LCBIT1NUX1dJREVfSU5UIGhpZ2gsCgkJCSAgY29u c3RfdHJlZSBleHApCnsKICBIT1NUX1dJREVfSU5UIGxhbmU7CiAgZ2NjX2Fzc2VydCAoQ09OU1Rf SU5UX1AgKG9wZXJhbmQpKTsKICBsYW5lID0gSU5UVkFMIChvcGVyYW5kKTsKCiAgaWYgKGxhbmUg PCBsb3cgfHwgbGFuZSA+PSBoaWdoKQogIHsKICAgIGlmIChleHApCiAgICAgIGVycm9yX2F0IChF WFBSX0xPQ0FUSU9OIChleHApLCAibGFuZSAld2Qgb3V0IG9mIHJhbmdlICV3ZCAtICV3ZCIsCgkJ bGFuZSwgbG93LCBoaWdoIC0gMSk7CiAgICBlbHNlCiAgICAgIGVycm9yICgibGFuZSAld2Qgb3V0 IG9mIHJhbmdlICV3ZCAtICV3ZCIsIGxhbmUsIGxvdywgaGlnaCAtIDEpOwogIH0KfQoKLyogUGVm b3JtIGVuZGlhbiBjb3JyZWN0aW9uIG9uIGxhbmUgbnVtYmVyIE4sIHdoaWNoIGluZGV4ZXMgYSB2 ZWN0b3IKICAgb2YgbW9kZSBNT0RFLCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYW4gU0ltb2Rl IHJ0eC4gICovCgpydHgKYWFyY2g2NF9lbmRpYW5fbGFuZV9ydHggKG1hY2hpbmVfbW9kZSBtb2Rl LCB1bnNpZ25lZCBpbnQgbikKewogIHJldHVybiBnZW5faW50X21vZGUgKEVORElBTl9MQU5FX04g KEdFVF9NT0RFX05VTklUUyAobW9kZSksIG4pLCBTSW1vZGUpOwp9CgovKiBSZXR1cm4gVFJVRSBp ZiBPUCBpcyBhIHZhbGlkIHZlY3RvciBhZGRyZXNzaW5nIG1vZGUuICAqLwoKYm9vbAphYXJjaDY0 X3NpbWRfbWVtX29wZXJhbmRfcCAocnR4IG9wKQp7CiAgcmV0dXJuIE1FTV9QIChvcCkgJiYgKEdF VF9DT0RFIChYRVhQIChvcCwgMCkpID09IFBPU1RfSU5DCgkJCXx8IFJFR19QIChYRVhQIChvcCwg MCkpKTsKfQoKLyogUmV0dXJuIHRydWUgaWYgT1AgaXMgYSB2YWxpZCBNRU0gb3BlcmFuZCBmb3Ig YW4gU1ZFIExEMVIgaW5zdHJ1Y3Rpb24uICAqLwoKYm9vbAphYXJjaDY0X3N2ZV9sZDFyX29wZXJh bmRfcCAocnR4IG9wKQp7CiAgc3RydWN0IGFhcmNoNjRfYWRkcmVzc19pbmZvIGFkZHI7CiAgc2Nh bGFyX21vZGUgbW9kZTsKCiAgcmV0dXJuIChNRU1fUCAob3ApCgkgICYmIGlzX2EgPHNjYWxhcl9t b2RlPiAoR0VUX01PREUgKG9wKSwgJm1vZGUpCgkgICYmIGFhcmNoNjRfY2xhc3NpZnlfYWRkcmVz cyAoJmFkZHIsIFhFWFAgKG9wLCAwKSwgbW9kZSwgZmFsc2UpCgkgICYmIGFkZHIudHlwZSA9PSBB RERSRVNTX1JFR19JTU0KCSAgJiYgb2Zmc2V0XzZiaXRfdW5zaWduZWRfc2NhbGVkX3AgKG1vZGUs IGFkZHIuY29uc3Rfb2Zmc2V0KSk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIE9QIGlzIGEgdmFsaWQg TUVNIG9wZXJhbmQgZm9yIGFuIFNWRSBMRDFSe1EsT30gaW5zdHJ1Y3Rpb24KICAgd2hlcmUgdGhl IHNpemUgb2YgdGhlIHJlYWQgZGF0YSBpcyBzcGVjaWZpZWQgYnkgYG1vZGVgIGFuZCB0aGUgc2l6 ZSBvZiB0aGUKICAgdmVjdG9yIGVsZW1lbnRzIGFyZSBzcGVjaWZpZWQgYnkgYGVsZW1fbW9kZWAu ICAgKi8KYm9vbAphYXJjaDY0X3N2ZV9sZDFycV9sZDFyb19vcGVyYW5kX3AgKHJ0eCBvcCwgbWFj aGluZV9tb2RlIG1vZGUsCgkJCQkgICBzY2FsYXJfbW9kZSBlbGVtX21vZGUpCnsKICBzdHJ1Y3Qg YWFyY2g2NF9hZGRyZXNzX2luZm8gYWRkcjsKICBpZiAoIU1FTV9QIChvcCkKICAgICAgfHwgIWFh cmNoNjRfY2xhc3NpZnlfYWRkcmVzcyAoJmFkZHIsIFhFWFAgKG9wLCAwKSwgZWxlbV9tb2RlLCBm YWxzZSkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChhZGRyLnR5cGUgPT0gQUREUkVTU19SRUdf SU1NKQogICAgcmV0dXJuIG9mZnNldF80Yml0X3NpZ25lZF9zY2FsZWRfcCAobW9kZSwgYWRkci5j b25zdF9vZmZzZXQpOwoKICBpZiAoYWRkci50eXBlID09IEFERFJFU1NfUkVHX1JFRykKICAgIHJl dHVybiAoMVUgPDwgYWRkci5zaGlmdCkgPT0gR0VUX01PREVfU0laRSAoZWxlbV9tb2RlKTsKCiAg cmV0dXJuIGZhbHNlOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBPUCBpcyBhIHZhbGlkIE1FTSBvcGVy YW5kIGZvciBhbiBTVkUgTEQxUlEgaW5zdHJ1Y3Rpb24uICAqLwpib29sCmFhcmNoNjRfc3ZlX2xk MXJxX29wZXJhbmRfcCAocnR4IG9wKQp7CiAgcmV0dXJuIGFhcmNoNjRfc3ZlX2xkMXJxX2xkMXJv X29wZXJhbmRfcCAob3AsIFRJbW9kZSwKCQkJCQkgICAgR0VUX01PREVfSU5ORVIgKEdFVF9NT0RF IChvcCkpKTsKfQoKLyogUmV0dXJuIHRydWUgaWYgT1AgaXMgYSB2YWxpZCBNRU0gb3BlcmFuZCBm b3IgYW4gU1ZFIExEMVJPIGluc3RydWN0aW9uIGZvcgogICBhY2Nlc3NpbmcgYSB2ZWN0b3Igd2hl cmUgdGhlIGVsZW1lbnQgc2l6ZSBpcyBzcGVjaWZpZWQgYnkgYGVsZW1fbW9kZWAuICAqLwpib29s CmFhcmNoNjRfc3ZlX2xkMXJvX29wZXJhbmRfcCAocnR4IG9wLCBzY2FsYXJfbW9kZSBlbGVtX21v ZGUpCnsKICByZXR1cm4gYWFyY2g2NF9zdmVfbGQxcnFfbGQxcm9fb3BlcmFuZF9wIChvcCwgT0lt b2RlLCBlbGVtX21vZGUpOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBPUCBpcyBhIHZhbGlkIE1FTSBv cGVyYW5kIGZvciBhbiBTVkUgTERGRjEgaW5zdHJ1Y3Rpb24uICAqLwpib29sCmFhcmNoNjRfc3Zl X2xkZmYxX29wZXJhbmRfcCAocnR4IG9wKQp7CiAgaWYgKCFNRU1fUCAob3ApKQogICAgcmV0dXJu IGZhbHNlOwoKICBzdHJ1Y3QgYWFyY2g2NF9hZGRyZXNzX2luZm8gYWRkcjsKICBpZiAoIWFhcmNo NjRfY2xhc3NpZnlfYWRkcmVzcyAoJmFkZHIsIFhFWFAgKG9wLCAwKSwgR0VUX01PREUgKG9wKSwg ZmFsc2UpKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoYWRkci50eXBlID09IEFERFJFU1NfUkVH X0lNTSkKICAgIHJldHVybiBrbm93bl9lcSAoYWRkci5jb25zdF9vZmZzZXQsIDApOwoKICByZXR1 cm4gYWRkci50eXBlID09IEFERFJFU1NfUkVHX1JFRzsKfQoKLyogUmV0dXJuIHRydWUgaWYgT1Ag aXMgYSB2YWxpZCBNRU0gb3BlcmFuZCBmb3IgYW4gU1ZFIExETkYxIGluc3RydWN0aW9uLiAgKi8K Ym9vbAphYXJjaDY0X3N2ZV9sZG5mMV9vcGVyYW5kX3AgKHJ0eCBvcCkKewogIHN0cnVjdCBhYXJj aDY0X2FkZHJlc3NfaW5mbyBhZGRyOwoKICByZXR1cm4gKE1FTV9QIChvcCkKCSAgJiYgYWFyY2g2 NF9jbGFzc2lmeV9hZGRyZXNzICgmYWRkciwgWEVYUCAob3AsIDApLAoJCQkJICAgICAgIEdFVF9N T0RFIChvcCksIGZhbHNlKQoJICAmJiBhZGRyLnR5cGUgPT0gQUREUkVTU19SRUdfSU1NKTsKfQoK LyogUmV0dXJuIHRydWUgaWYgT1AgaXMgYSB2YWxpZCBNRU0gb3BlcmFuZCBmb3IgYW4gU1ZFIExE UiBpbnN0cnVjdGlvbi4KICAgVGhlIGNvbmRpdGlvbnMgZm9yIFNUUiBhcmUgdGhlIHNhbWUuICAq Lwpib29sCmFhcmNoNjRfc3ZlX2xkcl9vcGVyYW5kX3AgKHJ0eCBvcCkKewogIHN0cnVjdCBhYXJj aDY0X2FkZHJlc3NfaW5mbyBhZGRyOwoKICByZXR1cm4gKE1FTV9QIChvcCkKCSAgJiYgYWFyY2g2 NF9jbGFzc2lmeV9hZGRyZXNzICgmYWRkciwgWEVYUCAob3AsIDApLCBHRVRfTU9ERSAob3ApLAoJ CQkJICAgICAgIGZhbHNlLCBBRERSX1FVRVJZX0FOWSkKCSAgJiYgYWRkci50eXBlID09IEFERFJF U1NfUkVHX0lNTSk7Cn0KCi8qIFJldHVybiB0cnVlIGlmIE9QIGlzIGEgdmFsaWQgYWRkcmVzcyBm b3IgYW4gU1ZFIFBSRltCSFdEXSBpbnN0cnVjdGlvbiwKICAgYWRkcmVzc2luZyBtZW1vcnkgb2Yg bW9kZSBNT0RFLiAgKi8KYm9vbAphYXJjaDY0X3N2ZV9wcmVmZXRjaF9vcGVyYW5kX3AgKHJ0eCBv cCwgbWFjaGluZV9tb2RlIG1vZGUpCnsKICBzdHJ1Y3QgYWFyY2g2NF9hZGRyZXNzX2luZm8gYWRk cjsKICBpZiAoIWFhcmNoNjRfY2xhc3NpZnlfYWRkcmVzcyAoJmFkZHIsIG9wLCBtb2RlLCBmYWxz ZSwgQUREUl9RVUVSWV9BTlkpKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoYWRkci50eXBlID09 IEFERFJFU1NfUkVHX0lNTSkKICAgIHJldHVybiBvZmZzZXRfNmJpdF9zaWduZWRfc2NhbGVkX3Ag KG1vZGUsIGFkZHIuY29uc3Rfb2Zmc2V0KTsKCiAgcmV0dXJuIGFkZHIudHlwZSA9PSBBRERSRVNT X1JFR19SRUc7Cn0KCi8qIFJldHVybiB0cnVlIGlmIE9QIGlzIGEgdmFsaWQgTUVNIG9wZXJhbmQg Zm9yIGFuIFNWRV9TVFJVQ1QgbW9kZS4KICAgV2UgbmVlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0 aGUgaW5kaXZpZHVhbCBwaWVjZXMsIHNvIHRoZSByYW5nZQogICBpcyBkaWZmZXJlbnQgZnJvbSBM RFsyMzRdIGFuZCBTVFsyMzRdLiAgKi8KYm9vbAphYXJjaDY0X3N2ZV9zdHJ1Y3RfbWVtb3J5X29w ZXJhbmRfcCAocnR4IG9wKQp7CiAgaWYgKCFNRU1fUCAob3ApKQogICAgcmV0dXJuIGZhbHNlOwoK ICBtYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFIChvcCk7CiAgc3RydWN0IGFhcmNoNjRfYWRk cmVzc19pbmZvIGFkZHI7CiAgaWYgKCFhYXJjaDY0X2NsYXNzaWZ5X2FkZHJlc3MgKCZhZGRyLCBY RVhQIChvcCwgMCksIFNWRV9CWVRFX01PREUsIGZhbHNlLAoJCQkJIEFERFJfUVVFUllfQU5ZKQog ICAgICB8fCBhZGRyLnR5cGUgIT0gQUREUkVTU19SRUdfSU1NKQogICAgcmV0dXJuIGZhbHNlOwoK ICBwb2x5X2ludDY0IGZpcnN0ID0gYWRkci5jb25zdF9vZmZzZXQ7CiAgcG9seV9pbnQ2NCBsYXN0 ID0gZmlyc3QgKyBHRVRfTU9ERV9TSVpFIChtb2RlKSAtIEJZVEVTX1BFUl9TVkVfVkVDVE9SOwog IHJldHVybiAob2Zmc2V0XzRiaXRfc2lnbmVkX3NjYWxlZF9wIChTVkVfQllURV9NT0RFLCBmaXJz dCkKCSAgJiYgb2Zmc2V0XzRiaXRfc2lnbmVkX3NjYWxlZF9wIChTVkVfQllURV9NT0RFLCBsYXN0 KSk7Cn0KCi8qIEVtaXQgYSByZWdpc3RlciBjb3B5IGZyb20gb3BlcmFuZCB0byBvcGVyYW5kLCB0 YWtpbmcgY2FyZSBub3QgdG8KICAgZWFybHktY2xvYmJlciBzb3VyY2UgcmVnaXN0ZXJzIGluIHRo ZSBwcm9jZXNzLgoKICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGludG8gd2hp Y2ggdGhlIGNvcHkgbmVlZHMgdG8gYmUKICAgZGVjb21wb3NlZC4gICovCnZvaWQKYWFyY2g2NF9z aW1kX2VtaXRfcmVnX3JlZ19tb3ZlIChydHggKm9wZXJhbmRzLCBtYWNoaW5lX21vZGUgbW9kZSwK CQkJCXVuc2lnbmVkIGludCBjb3VudCkKewogIHVuc2lnbmVkIGludCBpOwogIGludCByZGVzdCA9 IFJFR05PIChvcGVyYW5kc1swXSk7CiAgaW50IHJzcmMgPSBSRUdOTyAob3BlcmFuZHNbMV0pOwoK ICBpZiAoIXJlZ19vdmVybGFwX21lbnRpb25lZF9wIChvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0p CiAgICAgIHx8IHJkZXN0IDwgcnNyYykKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQog ICAgICBlbWl0X21vdmVfaW5zbiAoZ2VuX3J0eF9SRUcgKG1vZGUsIHJkZXN0ICsgaSksCgkJICAg ICAgZ2VuX3J0eF9SRUcgKG1vZGUsIHJzcmMgKyBpKSk7CiAgZWxzZQogICAgZm9yIChpID0gMDsg aSA8IGNvdW50OyBpKyspCiAgICAgIGVtaXRfbW92ZV9pbnNuIChnZW5fcnR4X1JFRyAobW9kZSwg cmRlc3QgKyBjb3VudCAtIGkgLSAxKSwKCQkgICAgICBnZW5fcnR4X1JFRyAobW9kZSwgcnNyYyAr IGNvdW50IC0gaSAtIDEpKTsKfQoKLyogQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBsZW5ndGggb2Yg YWFyY2g2NF9zaW1kX3JlZ2xpc3Q8bW9kZT4sIHdoZXJlIDxtb2RlPiBpcwogICBvbmUgb2YgVlNU UlVDVCBtb2RlczogT0ksIENJLCBvciBYSS4gICovCmludAphYXJjaDY0X3NpbWRfYXR0cl9sZW5n dGhfcmdsaXN0IChtYWNoaW5lX21vZGUgbW9kZSkKewogIC8qIFRoaXMgaXMgb25seSB1c2VkIChh bmQgb25seSBtZWFuaW5nZnVsKSBmb3IgQWR2YW5jZWQgU0lNRCwgbm90IFNWRS4gICovCiAgcmV0 dXJuIChHRVRfTU9ERV9TSVpFIChtb2RlKS50b19jb25zdGFudCAoKSAvIFVOSVRTX1BFUl9WUkVH KSAqIDQ7Cn0KCi8qIEltcGxlbWVudCB0YXJnZXQgaG9vayBUQVJHRVRfVkVDVE9SX0FMSUdOTUVO VC4gIFRoZSBBQVBDUzY0IHNldHMgdGhlIG1heGltdW0KICAgYWxpZ25tZW50IG9mIGEgdmVjdG9y IHRvIDEyOCBiaXRzLiAgU1ZFIHByZWRpY2F0ZXMgaGF2ZSBhbiBhbGlnbm1lbnQgb2YKICAgMTYg Yml0cy4gICovCnN0YXRpYyBIT1NUX1dJREVfSU5UCmFhcmNoNjRfc2ltZF92ZWN0b3JfYWxpZ25t ZW50IChjb25zdF90cmVlIHR5cGUpCnsKICAvKiA/Pz8gQ2hlY2tpbmcgdGhlIG1vZGUgaXNuJ3Qg aWRlYWwsIGJ1dCBWRUNUT1JfQk9PTEVBTl9UWVBFX1AgY2FuCiAgICAgYmUgc2V0IGZvciBub24t cHJlZGljYXRlIHZlY3RvcnMgb2YgYm9vbGVhbnMuICBNb2RlcyBhcmUgdGhlIG1vc3QKICAgICBk aXJlY3Qgd2F5IHdlIGhhdmUgb2YgaWRlbnRpZnlpbmcgcmVhbCBTVkUgcHJlZGljYXRlIHR5cGVz LiAgKi8KICBpZiAoR0VUX01PREVfQ0xBU1MgKFRZUEVfTU9ERSAodHlwZSkpID09IE1PREVfVkVD VE9SX0JPT0wpCiAgICByZXR1cm4gMTY7CiAgd2lkZXN0X2ludCBtaW5fc2l6ZQogICAgPSBjb25z dGFudF9sb3dlcl9ib3VuZCAod2k6OnRvX3BvbHlfd2lkZXN0IChUWVBFX1NJWkUgKHR5cGUpKSk7 CiAgcmV0dXJuIHdpOjp1bWluIChtaW5fc2l6ZSwgMTI4KS50b191aHdpICgpOwp9CgovKiBJbXBs ZW1lbnQgdGFyZ2V0IGhvb2sgVEFSR0VUX1ZFQ1RPUklaRV9QUkVGRVJSRURfVkVDVE9SX0FMSUdO TUVOVC4gICovCnN0YXRpYyBwb2x5X3VpbnQ2NAphYXJjaDY0X3ZlY3Rvcml6ZV9wcmVmZXJyZWRf dmVjdG9yX2FsaWdubWVudCAoY29uc3RfdHJlZSB0eXBlKQp7CiAgaWYgKGFhcmNoNjRfc3ZlX2Rh dGFfbW9kZV9wIChUWVBFX01PREUgKHR5cGUpKSkKICAgIHsKICAgICAgLyogSWYgdGhlIGxlbmd0 aCBvZiB0aGUgdmVjdG9yIGlzIGEgZml4ZWQgcG93ZXIgb2YgMiwgdHJ5IHRvIGFsaWduCgkgdG8g dGhhdCBsZW5ndGgsIG90aGVyd2lzZSBkb24ndCB0cnkgdG8gYWxpZ24gYXQgYWxsLiAgKi8KICAg ICAgSE9TVF9XSURFX0lOVCByZXN1bHQ7CiAgICAgIGlmICghR0VUX01PREVfQklUU0laRSAoVFlQ RV9NT0RFICh0eXBlKSkuaXNfY29uc3RhbnQgKCZyZXN1bHQpCgkgIHx8ICFwb3cycF9od2kgKHJl c3VsdCkpCglyZXN1bHQgPSBUWVBFX0FMSUdOIChUUkVFX1RZUEUgKHR5cGUpKTsKICAgICAgcmV0 dXJuIHJlc3VsdDsKICAgIH0KICByZXR1cm4gVFlQRV9BTElHTiAodHlwZSk7Cn0KCi8qIEltcGxl bWVudCB0YXJnZXQgaG9vayBUQVJHRVRfVkVDVE9SSVpFX1ZFQ1RPUl9BTElHTk1FTlRfUkVBQ0hB QkxFLiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2NF9zaW1kX3ZlY3Rvcl9hbGlnbm1lbnRfcmVhY2hh YmxlIChjb25zdF90cmVlIHR5cGUsIGJvb2wgaXNfcGFja2VkKQp7CiAgaWYgKGlzX3BhY2tlZCkK ICAgIHJldHVybiBmYWxzZTsKCiAgLyogRm9yIGZpeGVkLWxlbmd0aCB2ZWN0b3JzLCBjaGVjayB0 aGF0IHRoZSB2ZWN0b3JpemVyIHdpbGwgYWltIGZvcgogICAgIGZ1bGwtdmVjdG9yIGFsaWdubWVu dC4gIFRoaXMgaXNuJ3QgdHJ1ZSBmb3IgZ2VuZXJpYyBHQ0MgdmVjdG9ycwogICAgIHRoYXQgYXJl IHdpZGVyIHRoYW4gdGhlIEFCSSBtYXhpbXVtIG9mIDEyOCBiaXRzLiAgKi8KICBwb2x5X3VpbnQ2 NCBwcmVmZXJyZWRfYWxpZ25tZW50ID0KICAgIGFhcmNoNjRfdmVjdG9yaXplX3ByZWZlcnJlZF92 ZWN0b3JfYWxpZ25tZW50ICh0eXBlKTsKICBpZiAoVFJFRV9DT0RFIChUWVBFX1NJWkUgKHR5cGUp KSA9PSBJTlRFR0VSX0NTVAogICAgICAmJiBtYXliZV9uZSAod2k6OnRvX3dpZGVzdCAoVFlQRV9T SVpFICh0eXBlKSksCgkJICAgcHJlZmVycmVkX2FsaWdubWVudCkpCiAgICByZXR1cm4gZmFsc2U7 CgogIC8qIFZlY3RvcnMgd2hvc2Ugc2l6ZSBpcyA8PSBCSUdHRVNUX0FMSUdOTUVOVCBhcmUgbmF0 dXJhbGx5IGFsaWduZWQuICAqLwogIHJldHVybiB0cnVlOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiB0 aGUgdmVjdG9yIG1pc2FsaWdubWVudCBmYWN0b3IgaXMgc3VwcG9ydGVkIGJ5IHRoZQogICB0YXJn ZXQuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X2J1aWx0aW5fc3VwcG9ydF92ZWN0b3JfbWlzYWxp Z25tZW50IChtYWNoaW5lX21vZGUgbW9kZSwKCQkJCQkgICAgIGNvbnN0X3RyZWUgdHlwZSwgaW50 IG1pc2FsaWdubWVudCwKCQkJCQkgICAgIGJvb2wgaXNfcGFja2VkKQp7CiAgaWYgKFRBUkdFVF9T SU1EICYmIFNUUklDVF9BTElHTk1FTlQpCiAgICB7CiAgICAgIC8qIFJldHVybiBpZiBtb3ZtaXNh bGlnbiBwYXR0ZXJuIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZS4gICovCiAgICAgIGlm IChvcHRhYl9oYW5kbGVyIChtb3ZtaXNhbGlnbl9vcHRhYiwgbW9kZSkgPT0gQ09ERV9GT1Jfbm90 aGluZykKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvKiBNaXNhbGlnbm1lbnQgZmFjdG9y IGlzIHVua25vd24gYXQgY29tcGlsZSB0aW1lLiAgKi8KICAgICAgaWYgKG1pc2FsaWdubWVudCA9 PSAtMSkKCXJldHVybiBmYWxzZTsKICAgIH0KICByZXR1cm4gZGVmYXVsdF9idWlsdGluX3N1cHBv cnRfdmVjdG9yX21pc2FsaWdubWVudCAobW9kZSwgdHlwZSwgbWlzYWxpZ25tZW50LAoJCQkJCQkg ICAgICBpc19wYWNrZWQpOwp9CgovKiBJZiBWQUxTIGlzIGEgdmVjdG9yIGNvbnN0YW50IHRoYXQg Y2FuIGJlIGxvYWRlZCBpbnRvIGEgcmVnaXN0ZXIKICAgdXNpbmcgRFVQLCBnZW5lcmF0ZSBpbnN0 cnVjdGlvbnMgdG8gZG8gc28gYW5kIHJldHVybiBhbiBSVFggdG8KICAgYXNzaWduIHRvIHRoZSBy ZWdpc3Rlci4gIE90aGVyd2lzZSByZXR1cm4gTlVMTF9SVFguICAqLwpzdGF0aWMgcnR4CmFhcmNo NjRfc2ltZF9kdXBfY29uc3RhbnQgKHJ0eCB2YWxzKQp7CiAgbWFjaGluZV9tb2RlIG1vZGUgPSBH RVRfTU9ERSAodmFscyk7CiAgbWFjaGluZV9tb2RlIGlubmVyX21vZGUgPSBHRVRfTU9ERV9JTk5F UiAobW9kZSk7CiAgcnR4IHg7CgogIGlmICghY29uc3RfdmVjX2R1cGxpY2F0ZV9wICh2YWxzLCAm eCkpCiAgICByZXR1cm4gTlVMTF9SVFg7CgogIC8qIFdlIGNhbiBsb2FkIHRoaXMgY29uc3RhbnQg YnkgdXNpbmcgRFVQIGFuZCBhIGNvbnN0YW50IGluIGEKICAgICBzaW5nbGUgQVJNIHJlZ2lzdGVy LiAgVGhpcyB3aWxsIGJlIGNoZWFwZXIgdGhhbiBhIHZlY3RvcgogICAgIGxvYWQuICAqLwogIHgg PSBmb3JjZV9yZWcgKGlubmVyX21vZGUsIHgpOwogIHJldHVybiBnZW5fdmVjX2R1cGxpY2F0ZSAo bW9kZSwgeCk7Cn0KCgovKiBHZW5lcmF0ZSBjb2RlIHRvIGxvYWQgVkFMUywgd2hpY2ggaXMgYSBQ QVJBTExFTCBjb250YWluaW5nIG9ubHkKICAgY29uc3RhbnRzIChmb3IgdmVjX2luaXQpIG9yIENP TlNUX1ZFQ1RPUiwgZWZmaWNpZW50bHkgaW50byBhCiAgIHJlZ2lzdGVyLiAgUmV0dXJucyBhbiBS VFggdG8gY29weSBpbnRvIHRoZSByZWdpc3Rlciwgb3IgTlVMTF9SVFgKICAgZm9yIGEgUEFSQUxM RUwgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIGludG8gYSBDT05TVF9WRUNUT1IuICAqLwpzdGF0 aWMgcnR4CmFhcmNoNjRfc2ltZF9tYWtlX2NvbnN0YW50IChydHggdmFscykKewogIG1hY2hpbmVf bW9kZSBtb2RlID0gR0VUX01PREUgKHZhbHMpOwogIHJ0eCBjb25zdF9kdXA7CiAgcnR4IGNvbnN0 X3ZlYyA9IE5VTExfUlRYOwogIGludCBuX2NvbnN0ID0gMDsKICBpbnQgaTsKCiAgaWYgKENPTlNU X1ZFQ1RPUl9QICh2YWxzKSkKICAgIGNvbnN0X3ZlYyA9IHZhbHM7CiAgZWxzZSBpZiAoR0VUX0NP REUgKHZhbHMpID09IFBBUkFMTEVMKQogICAgewogICAgICAvKiBBIENPTlNUX1ZFQ1RPUiBtdXN0 IGNvbnRhaW4gb25seSBDT05TVF9JTlRzIGFuZAoJIENPTlNUX0RPVUJMRXMsIGJ1dCBDT05TVEFO VF9QIGFsbG93cyBtb3JlIChlLmcuIFNZTUJPTF9SRUYpLgoJIE9ubHkgc3RvcmUgdmFsaWQgY29u c3RhbnRzIGluIGEgQ09OU1RfVkVDVE9SLiAgKi8KICAgICAgaW50IG5fZWx0cyA9IFhWRUNMRU4g KHZhbHMsIDApOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbl9lbHRzOyArK2kpCgl7CgkgIHJ0eCB4 ID0gWFZFQ0VYUCAodmFscywgMCwgaSk7CgkgIGlmIChDT05TVF9JTlRfUCAoeCkgfHwgQ09OU1Rf RE9VQkxFX1AgKHgpKQoJICAgIG5fY29uc3QrKzsKCX0KICAgICAgaWYgKG5fY29uc3QgPT0gbl9l bHRzKQoJY29uc3RfdmVjID0gZ2VuX3J0eF9DT05TVF9WRUNUT1IgKG1vZGUsIFhWRUMgKHZhbHMs IDApKTsKICAgIH0KICBlbHNlCiAgICBnY2NfdW5yZWFjaGFibGUgKCk7CgogIGlmIChjb25zdF92 ZWMgIT0gTlVMTF9SVFgKICAgICAgJiYgYWFyY2g2NF9zaW1kX3ZhbGlkX2ltbWVkaWF0ZSAoY29u c3RfdmVjLCBOVUxMKSkKICAgIC8qIExvYWQgdXNpbmcgTU9WSS9NVk5JLiAgKi8KICAgIHJldHVy biBjb25zdF92ZWM7CiAgZWxzZSBpZiAoKGNvbnN0X2R1cCA9IGFhcmNoNjRfc2ltZF9kdXBfY29u c3RhbnQgKHZhbHMpKSAhPSBOVUxMX1JUWCkKICAgIC8qIExvYWRlZCB1c2luZyBEVVAuICAqLwog ICAgcmV0dXJuIGNvbnN0X2R1cDsKICBlbHNlIGlmIChjb25zdF92ZWMgIT0gTlVMTF9SVFgpCiAg ICAvKiBMb2FkIGZyb20gY29uc3RhbnQgcG9vbC4gV2UgY2Fubm90IHRha2UgYWR2YW50YWdlIG9m IHNpbmdsZS1jeWNsZQogICAgICAgTEQxIGJlY2F1c2Ugd2UgbmVlZCBhIFBDLXJlbGF0aXZlIGFk ZHJlc3NpbmcgbW9kZS4gICovCiAgICByZXR1cm4gY29uc3RfdmVjOwogIGVsc2UKICAgIC8qIEEg UEFSQUxMRUwgY29udGFpbmluZyBzb21ldGhpbmcgbm90IHZhbGlkIGluc2lkZSBDT05TVF9WRUNU T1IuCiAgICAgICBXZSBjYW5ub3QgY29uc3RydWN0IGFuIGluaXRpYWxpemVyLiAgKi8KICAgIHJl dHVybiBOVUxMX1JUWDsKfQoKLyogQSBzdWJyb3V0aW5lIG9mIGFhcmNoNjRfZXhwYW5kX3ZlY3Rv cl9pbml0LCB3aXRoIHRoZSBzYW1lIGludGVyZmFjZS4KICAgVGhlIGNhbGxlciBoYXMgYWxyZWFk eSB0cmllZCBhIGRpdmlkZS1hbmQtY29ucXVlciBhcHByb2FjaCwgc28gZG8KICAgbm90IGNvbnNp ZGVyIHRoYXQgY2FzZSBoZXJlLiAgKi8KCnZvaWQKYWFyY2g2NF9leHBhbmRfdmVjdG9yX2luaXRf ZmFsbGJhY2sgKHJ0eCB0YXJnZXQsIHJ0eCB2YWxzKQp7CiAgbWFjaGluZV9tb2RlIG1vZGUgPSBH RVRfTU9ERSAodGFyZ2V0KTsKICBzY2FsYXJfbW9kZSBpbm5lcl9tb2RlID0gR0VUX01PREVfSU5O RVIgKG1vZGUpOwogIC8qIFRoZSBudW1iZXIgb2YgdmVjdG9yIGVsZW1lbnRzLiAgKi8KICBpbnQg bl9lbHRzID0gWFZFQ0xFTiAodmFscywgMCk7CiAgLyogVGhlIG51bWJlciBvZiB2ZWN0b3IgZWxl bWVudHMgd2hpY2ggYXJlIG5vdCBjb25zdGFudC4gICovCiAgaW50IG5fdmFyID0gMDsKICBydHgg YW55X2NvbnN0ID0gTlVMTF9SVFg7CiAgLyogVGhlIGZpcnN0IGVsZW1lbnQgb2YgdmFscy4gICov CiAgcnR4IHYwID0gWFZFQ0VYUCAodmFscywgMCwgMCk7CiAgYm9vbCBhbGxfc2FtZSA9IHRydWU7 CgogIC8qIFRoaXMgaXMgYSBzcGVjaWFsIHZlY19pbml0PE0+PE4+IHdoZXJlIE4gaXMgbm90IGFu IGVsZW1lbnQgbW9kZSBidXQgYQogICAgIHZlY3RvciBtb2RlIHdpdGggaGFsZiB0aGUgZWxlbWVu dHMgb2YgTS4gIFdlIGV4cGVjdCB0byBmaW5kIHR3byBlbnRyaWVzCiAgICAgb2YgbW9kZSBOIGlu IFZBTFMgYW5kIHdlIG11c3QgcHV0IHRoZWlyIGNvbmNhdGVudGF0aW9uIGludG8gVEFSR0VULiAg Ki8KICBpZiAoWFZFQ0xFTiAodmFscywgMCkgPT0gMiAmJiBWRUNUT1JfTU9ERV9QIChHRVRfTU9E RSAoWFZFQ0VYUCAodmFscywgMCwgMCkpKSkKICAgIHsKICAgICAgbWFjaGluZV9tb2RlIG5hcnJv d19tb2RlID0gR0VUX01PREUgKFhWRUNFWFAgKHZhbHMsIDAsIDApKTsKICAgICAgZ2NjX2Fzc2Vy dCAoR0VUX01PREVfSU5ORVIgKG5hcnJvd19tb2RlKSA9PSBpbm5lcl9tb2RlCgkJICAmJiBrbm93 bl9lcSAoR0VUX01PREVfU0laRSAobW9kZSksCgkJCSAgICAgICAyICogR0VUX01PREVfU0laRSAo bmFycm93X21vZGUpKSk7CiAgICAgIGVtaXRfaW5zbiAoZ2VuX2FhcmNoNjRfdmVjX2NvbmNhdCAo bmFycm93X21vZGUsIHRhcmdldCwKCQkJCQkgWFZFQ0VYUCAodmFscywgMCwgMCksCgkJCQkJIFhW RUNFWFAgKHZhbHMsIDAsIDEpKSk7CiAgICAgcmV0dXJuOwogICB9CgogIC8qIENvdW50IHRoZSBu dW1iZXIgb2YgdmFyaWFibGUgZWxlbWVudHMgdG8gaW5pdGlhbGlzZS4gICovCiAgZm9yIChpbnQg aSA9IDA7IGkgPCBuX2VsdHM7ICsraSkKICAgIHsKICAgICAgcnR4IHggPSBYVkVDRVhQICh2YWxz LCAwLCBpKTsKICAgICAgaWYgKCEoQ09OU1RfSU5UX1AgKHgpIHx8IENPTlNUX0RPVUJMRV9QICh4 KSkpCgkrK25fdmFyOwogICAgICBlbHNlCglhbnlfY29uc3QgPSB4OwoKICAgICAgYWxsX3NhbWUg Jj0gcnR4X2VxdWFsX3AgKHgsIHYwKTsKICAgIH0KCiAgLyogTm8gdmFyaWFibGUgZWxlbWVudHMs IGhhbmQgb2ZmIHRvIGFhcmNoNjRfc2ltZF9tYWtlX2NvbnN0YW50IHdoaWNoIGtub3dzCiAgICAg aG93IGJlc3QgdG8gaGFuZGxlIHRoaXMuICAqLwogIGlmIChuX3ZhciA9PSAwKQogICAgewogICAg ICBydHggY29uc3RhbnQgPSBhYXJjaDY0X3NpbWRfbWFrZV9jb25zdGFudCAodmFscyk7CiAgICAg IGlmIChjb25zdGFudCAhPSBOVUxMX1JUWCkKCXsKCSAgZW1pdF9tb3ZlX2luc24gKHRhcmdldCwg Y29uc3RhbnQpOwoJICByZXR1cm47Cgl9CiAgICB9CgogIC8qIFNwbGF0IGEgc2luZ2xlIG5vbi1j b25zdGFudCBlbGVtZW50IGlmIHdlIGNhbi4gICovCiAgaWYgKGFsbF9zYW1lKQogICAgewogICAg ICBydHggeCA9IGZvcmNlX3JlZyAoaW5uZXJfbW9kZSwgdjApOwogICAgICBhYXJjaDY0X2VtaXRf bW92ZSAodGFyZ2V0LCBnZW5fdmVjX2R1cGxpY2F0ZSAobW9kZSwgeCkpOwogICAgICByZXR1cm47 CiAgICB9CgogIGVudW0gaW5zbl9jb2RlIGljb2RlID0gb3B0YWJfaGFuZGxlciAodmVjX3NldF9v cHRhYiwgbW9kZSk7CiAgZ2NjX2Fzc2VydCAoaWNvZGUgIT0gQ09ERV9GT1Jfbm90aGluZyk7Cgog IC8qIElmIHRoZXJlIGFyZSBvbmx5IHZhcmlhYmxlIGVsZW1lbnRzLCB0cnkgdG8gb3B0aW1pemUK ICAgICB0aGUgaW5zZXJ0aW9uIHVzaW5nIGR1cCBmb3IgdGhlIG1vc3QgY29tbW9uIGVsZW1lbnQK ICAgICBmb2xsb3dlZCBieSBpbnNlcnRpb25zLiAgKi8KCiAgLyogVGhlIGFsZ29yaXRobSB3aWxs IGZpbGwgbWF0Y2hlc1sqXVswXSB3aXRoIHRoZSBlYXJsaWVzdCBtYXRjaGluZyBlbGVtZW50LAog ICAgIGFuZCBtYXRjaGVzW1hdWzFdIHdpdGggdGhlIGNvdW50IG9mIGR1cGxpY2F0ZSBlbGVtZW50 cyAoaWYgWCBpcyB0aGUKICAgICBlYXJsaWVzdCBlbGVtZW50IHdoaWNoIGhhcyBkdXBsaWNhdGVz KS4gICovCgogIGlmIChuX3ZhciA9PSBuX2VsdHMgJiYgbl9lbHRzIDw9IDE2KQogICAgewogICAg ICBpbnQgbWF0Y2hlc1sxNl1bMl0gPSB7MH07CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbl9l bHRzOyBpKyspCgl7CgkgIGZvciAoaW50IGogPSAwOyBqIDw9IGk7IGorKykKCSAgICB7CgkgICAg ICBpZiAocnR4X2VxdWFsX3AgKFhWRUNFWFAgKHZhbHMsIDAsIGkpLCBYVkVDRVhQICh2YWxzLCAw LCBqKSkpCgkJewoJCSAgbWF0Y2hlc1tpXVswXSA9IGo7CgkJICBtYXRjaGVzW2pdWzFdKys7CgkJ ICBicmVhazsKCQl9CgkgICAgfQoJfQogICAgICBpbnQgbWF4ZWxlbWVudCA9IDA7CiAgICAgIGlu dCBtYXh2ID0gMDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuX2VsdHM7IGkrKykKCWlmICht YXRjaGVzW2ldWzFdID4gbWF4dikKCSAgewoJICAgIG1heGVsZW1lbnQgPSBpOwoJICAgIG1heHYg PSBtYXRjaGVzW2ldWzFdOwoJICB9CgogICAgICAvKiBDcmVhdGUgYSBkdXBsaWNhdGUgb2YgdGhl IG1vc3QgY29tbW9uIGVsZW1lbnQsIHVubGVzcyBhbGwgZWxlbWVudHMKCSBhcmUgZXF1YWxseSB1 c2VsZXNzIHRvIHVzLCBpbiB3aGljaCBjYXNlIGp1c3QgaW1tZWRpYXRlbHkgc2V0IHRoZQoJIHZl Y3RvciByZWdpc3RlciB1c2luZyB0aGUgZmlyc3QgZWxlbWVudC4gICovCgogICAgICBpZiAobWF4 diA9PSAxKQoJewoJICAvKiBGb3IgdmVjdG9ycyBvZiB0d28gNjQtYml0IGVsZW1lbnRzLCB3ZSBj YW4gZG8gZXZlbiBiZXR0ZXIuICAqLwoJICBpZiAobl9lbHRzID09IDIKCSAgICAgICYmIChpbm5l cl9tb2RlID09IEVfREltb2RlCgkJICB8fCBpbm5lcl9tb2RlID09IEVfREZtb2RlKSkKCgkgICAg ewoJICAgICAgcnR4IHgwID0gWFZFQ0VYUCAodmFscywgMCwgMCk7CgkgICAgICBydHggeDEgPSBY VkVDRVhQICh2YWxzLCAwLCAxKTsKCSAgICAgIC8qIENvbWJpbmUgY2FuIHBpY2sgdXAgdGhpcyBj YXNlLCBidXQgaGFuZGxpbmcgaXQgZGlyZWN0bHkKCQkgaGVyZSBsZWF2ZXMgY2xlYXJlciBSVEwu CgoJCSBUaGlzIGlzIGxvYWRfcGFpcl9sYW5lczxtb2RlPiwgYW5kIGFsc28gZ2l2ZXMgdXMgYSBj bGVhbi11cAoJCSBmb3Igc3RvcmVfcGFpcl9sYW5lczxtb2RlPi4gICovCgkgICAgICBpZiAobWVt b3J5X29wZXJhbmQgKHgwLCBpbm5lcl9tb2RlKQoJCSAgJiYgbWVtb3J5X29wZXJhbmQgKHgxLCBp bm5lcl9tb2RlKQoJCSAgJiYgYWFyY2g2NF9tZXJnZWFibGVfbG9hZF9wYWlyX3AgKG1vZGUsIHgw LCB4MSkpCgkJewoJCSAgcnR4IHQ7CgkJICBpZiAoaW5uZXJfbW9kZSA9PSBERm1vZGUpCgkJICAg IHQgPSBnZW5fbG9hZF9wYWlyX2xhbmVzZGYgKHRhcmdldCwgeDAsIHgxKTsKCQkgIGVsc2UKCQkg ICAgdCA9IGdlbl9sb2FkX3BhaXJfbGFuZXNkaSAodGFyZ2V0LCB4MCwgeDEpOwoJCSAgZW1pdF9p bnNuICh0KTsKCQkgIHJldHVybjsKCQl9CgkgICAgfQoJICAvKiBUaGUgc3VicmVnLW1vdmUgc2Vx dWVuY2UgYmVsb3cgd2lsbCBtb3ZlIGludG8gbGFuZSB6ZXJvIG9mIHRoZQoJICAgICB2ZWN0b3Ig cmVnaXN0ZXIuICBGb3IgYmlnLWVuZGlhbiB3ZSB3YW50IHRoYXQgcG9zaXRpb24gdG8gaG9sZAoJ ICAgICB0aGUgbGFzdCBlbGVtZW50IG9mIFZBTFMuICAqLwoJICBtYXhlbGVtZW50ID0gQllURVNf QklHX0VORElBTiA/IG5fZWx0cyAtIDEgOiAwOwoJICBydHggeCA9IGZvcmNlX3JlZyAoaW5uZXJf bW9kZSwgWFZFQ0VYUCAodmFscywgMCwgbWF4ZWxlbWVudCkpOwoJICBhYXJjaDY0X2VtaXRfbW92 ZSAodGFyZ2V0LCBsb3dwYXJ0X3N1YnJlZyAobW9kZSwgeCwgaW5uZXJfbW9kZSkpOwoJfQogICAg ICBlbHNlCgl7CgkgIHJ0eCB4ID0gZm9yY2VfcmVnIChpbm5lcl9tb2RlLCBYVkVDRVhQICh2YWxz LCAwLCBtYXhlbGVtZW50KSk7CgkgIGFhcmNoNjRfZW1pdF9tb3ZlICh0YXJnZXQsIGdlbl92ZWNf ZHVwbGljYXRlIChtb2RlLCB4KSk7Cgl9CgogICAgICAvKiBJbnNlcnQgdGhlIHJlc3QuICAqLwog ICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5fZWx0czsgaSsrKQoJewoJICBydHggeCA9IFhWRUNF WFAgKHZhbHMsIDAsIGkpOwoJICBpZiAobWF0Y2hlc1tpXVswXSA9PSBtYXhlbGVtZW50KQoJICAg IGNvbnRpbnVlOwoJICB4ID0gZm9yY2VfcmVnIChpbm5lcl9tb2RlLCB4KTsKCSAgZW1pdF9pbnNu IChHRU5fRkNOIChpY29kZSkgKHRhcmdldCwgeCwgR0VOX0lOVCAoaSkpKTsKCX0KICAgICAgcmV0 dXJuOwogICAgfQoKICAvKiBJbml0aWFsaXNlIGEgdmVjdG9yIHdoaWNoIGlzIHBhcnQtdmFyaWFi bGUuICBXZSB3YW50IHRvIGZpcnN0IHRyeQogICAgIHRvIGJ1aWxkIHRob3NlIGxhbmVzIHdoaWNo IGFyZSBjb25zdGFudCBpbiB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHdlCiAgICAgY2FuLiAgKi8K ICBpZiAobl92YXIgIT0gbl9lbHRzKQogICAgewogICAgICBydHggY29weSA9IGNvcHlfcnR4ICh2 YWxzKTsKCiAgICAgIC8qIExvYWQgY29uc3RhbnQgcGFydCBvZiB2ZWN0b3IuICBXZSByZWFsbHkg ZG9uJ3QgY2FyZSB3aGF0IGdvZXMgaW50byB0aGUKCSBwYXJ0cyB3ZSB3aWxsIG92ZXJ3cml0ZSwg YnV0IHdlJ3JlIG1vcmUgbGlrZWx5IHRvIGJlIGFibGUgdG8gbG9hZCB0aGUKCSBjb25zdGFudCBl ZmZpY2llbnRseSBpZiBpdCBoYXMgZmV3ZXIsIGxhcmdlciwgcmVwZWF0aW5nIHBhcnRzCgkgKHNl ZSBhYXJjaDY0X3NpbWRfdmFsaWRfaW1tZWRpYXRlKS4gICovCiAgICAgIGZvciAoaW50IGkgPSAw OyBpIDwgbl9lbHRzOyBpKyspCgl7CgkgIHJ0eCB4ID0gWFZFQ0VYUCAodmFscywgMCwgaSk7Cgkg IGlmIChDT05TVF9JTlRfUCAoeCkgfHwgQ09OU1RfRE9VQkxFX1AgKHgpKQoJICAgIGNvbnRpbnVl OwoJICBydHggc3Vic3QgPSBhbnlfY29uc3Q7CgkgIGZvciAoaW50IGJpdCA9IG5fZWx0cyAvIDI7 IGJpdCA+IDA7IGJpdCAvPSAyKQoJICAgIHsKCSAgICAgIC8qIExvb2sgaW4gdGhlIGNvcGllZCB2 ZWN0b3IsIGFzIG1vcmUgZWxlbWVudHMgYXJlIGNvbnN0LiAgKi8KCSAgICAgIHJ0eCB0ZXN0ID0g WFZFQ0VYUCAoY29weSwgMCwgaSBeIGJpdCk7CgkgICAgICBpZiAoQ09OU1RfSU5UX1AgKHRlc3Qp IHx8IENPTlNUX0RPVUJMRV9QICh0ZXN0KSkKCQl7CgkJICBzdWJzdCA9IHRlc3Q7CgkJICBicmVh azsKCQl9CgkgICAgfQoJICBYVkVDRVhQIChjb3B5LCAwLCBpKSA9IHN1YnN0OwoJfQogICAgICBh YXJjaDY0X2V4cGFuZF92ZWN0b3JfaW5pdF9mYWxsYmFjayAodGFyZ2V0LCBjb3B5KTsKICAgIH0K CiAgLyogSW5zZXJ0IHRoZSB2YXJpYWJsZSBsYW5lcyBkaXJlY3RseS4gICovCiAgZm9yIChpbnQg aSA9IDA7IGkgPCBuX2VsdHM7IGkrKykKICAgIHsKICAgICAgcnR4IHggPSBYVkVDRVhQICh2YWxz LCAwLCBpKTsKICAgICAgaWYgKENPTlNUX0lOVF9QICh4KSB8fCBDT05TVF9ET1VCTEVfUCAoeCkp Cgljb250aW51ZTsKICAgICAgeCA9IGZvcmNlX3JlZyAoaW5uZXJfbW9kZSwgeCk7CiAgICAgIGVt aXRfaW5zbiAoR0VOX0ZDTiAoaWNvZGUpICh0YXJnZXQsIHgsIEdFTl9JTlQgKGkpKSk7CiAgICB9 Cn0KCi8qIFJldHVybiBldmVuIG9yIG9kZCBoYWxmIG9mIFZBTFMgZGVwZW5kaW5nIG9uIEVWRU5f UC4gICovCgpzdGF0aWMgcnR4CmFhcmNoNjRfdW56aXBfdmVjdG9yX2luaXQgKG1hY2hpbmVfbW9k ZSBtb2RlLCBydHggdmFscywgYm9vbCBldmVuX3ApCnsKICBpbnQgbiA9IFhWRUNMRU4gKHZhbHMs IDApOwogIG1hY2hpbmVfbW9kZSBuZXdfbW9kZQogICAgPSBhYXJjaDY0X3NpbWRfY29udGFpbmVy X21vZGUgKEdFVF9NT0RFX0lOTkVSIChtb2RlKSwKCQkJCSAgIEdFVF9NT0RFX0JJVFNJWkUgKG1v ZGUpLnRvX2NvbnN0YW50ICgpIC8gMik7CiAgcnR2ZWMgdmVjID0gcnR2ZWNfYWxsb2MgKG4gLyAy KTsKICBmb3IgKGludCBpID0gMDsgaSA8IG4gLyAyOyBpKyspCiAgICBSVFZFQ19FTFQgKHZlYywg aSkgPSAoZXZlbl9wKSA/IFhWRUNFWFAgKHZhbHMsIDAsIDIgKiBpKQoJCQkJICA6IFhWRUNFWFAg KHZhbHMsIDAsIDIgKiBpICsgMSk7CiAgcmV0dXJuIGdlbl9ydHhfUEFSQUxMRUwgKG5ld19tb2Rl LCB2ZWMpOwp9CgovKiBSZXR1cm4gdHJ1ZSBpZiBJTlNOIGlzIGEgc2NhbGFyIG1vdmUuICAqLwoK c3RhdGljIGJvb2wKc2NhbGFyX21vdmVfaW5zbl9wIChjb25zdCBydHhfaW5zbiAqaW5zbikKewog IHJ0eCBzZXQgPSBzaW5nbGVfc2V0IChpbnNuKTsKICBpZiAoIXNldCkKICAgIHJldHVybiBmYWxz ZTsKICBydHggc3JjID0gU0VUX1NSQyAoc2V0KTsKICBydHggZGVzdCA9IFNFVF9ERVNUIChzZXQp OwogIHJldHVybiBpc19hPHNjYWxhcl9tb2RlPihHRVRfTU9ERSAoZGVzdCkpCgkgJiYgYWFyY2g2 NF9tb3Zfb3BlcmFuZCAoc3JjLCBHRVRfTU9ERSAoc3JjKSk7Cn0KCi8qIFNpbWlsYXIgdG8gc2Vx X2Nvc3QsIGJ1dCBpZ25vcmUgY29zdCBmb3Igc2NhbGFyIG1vdmVzLiAgVGhpcyBmdW5jdGlvbgog ICBpcyBjYWxsZWQgZnJvbSBhYXJjaDY0X2V4cGFuZF92ZWN0b3JfaW5pdC4gICovCgpzdGF0aWMg dW5zaWduZWQKc2VxX2Nvc3RfaWdub3Jpbmdfc2NhbGFyX21vdmVzIChjb25zdCBydHhfaW5zbiAq c2VxLCBib29sIHNwZWVkKQp7CiAgdW5zaWduZWQgY29zdCA9IDA7CgogIGZvciAoOyBzZXE7IHNl cSA9IE5FWFRfSU5TTiAoc2VxKSkKICAgIGlmIChOT05ERUJVR19JTlNOX1AgKHNlcSkKCSYmICFz Y2FsYXJfbW92ZV9pbnNuX3AgKHNlcSkpCiAgICAgIHsKCWlmIChydHggc2V0ID0gc2luZ2xlX3Nl dCAoc2VxKSkKCSAgY29zdCArPSBzZXRfcnR4X2Nvc3QgKHNldCwgc3BlZWQpOwoJZWxzZQoJICB7 CgkgICAgaW50IHRoaXNfY29zdCA9IGluc25fY29zdCAoQ09OU1RfQ0FTVF9SVFhfSU5TTiAoc2Vx KSwgc3BlZWQpOwoJICAgIGlmICh0aGlzX2Nvc3QgPiAwKQoJICAgICAgY29zdCArPSB0aGlzX2Nv c3Q7CgkgICAgZWxzZQoJICAgICAgY29zdCsrOwoJICB9CiAgICAgIH0KCiAgcmV0dXJuIGNvc3Q7 Cn0KCi8qIEV4cGFuZCBhIHZlY3RvciBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSwgc3VjaCB0aGF0 IFRBUkdFVCBpcwogICBpbml0aWFsaXplZCB0byBjb250YWluIFZBTFMuICAqLwoKdm9pZAphYXJj aDY0X2V4cGFuZF92ZWN0b3JfaW5pdCAocnR4IHRhcmdldCwgcnR4IHZhbHMpCnsKICAvKiBUcnkg ZGVjb21wb3NpbmcgdGhlIGluaXRpYWxpemVyIGludG8gZXZlbiBhbmQgb2RkIGhhbHZlcyBhbmQK ICAgICB0aGVuIFpJUCB0aGVtIHRvZ2V0aGVyLiAgVXNlIHRoZSByZXN1bHRpbmcgc2VxdWVuY2Ug aWYgaXQgaXMKICAgICBzdHJpY3RseSBjaGVhcGVyIHRoYW4gbG9hZGluZyBWQUxTIGRpcmVjdGx5 LgoKICAgICBQcmVmZXIgdGhlIGZhbGxiYWNrIHNlcXVlbmNlIGluIHRoZSBldmVudCBvZiBhIHRp ZSwgc2luY2UgaXQKICAgICB3aWxsIHRlbmQgdG8gdXNlIGZld2VyIHJlZ2lzdGVycy4gICovCgog IG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKHRhcmdldCk7CiAgaW50IG5fZWx0cyA9IFhW RUNMRU4gKHZhbHMsIDApOwoKICBpZiAobl9lbHRzIDwgNAogICAgICB8fCBtYXliZV9uZSAoR0VU X01PREVfQklUU0laRSAobW9kZSksIDEyOCkpCiAgICB7CiAgICAgIGFhcmNoNjRfZXhwYW5kX3Zl Y3Rvcl9pbml0X2ZhbGxiYWNrICh0YXJnZXQsIHZhbHMpOwogICAgICByZXR1cm47CiAgICB9Cgog IHN0YXJ0X3NlcXVlbmNlICgpOwogIHJ0eCBoYWx2ZXNbMl07CiAgdW5zaWduZWQgY29zdHNbMl07 CiAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCiAgICB7CiAgICAgIHN0YXJ0X3NlcXVlbmNl ICgpOwogICAgICBydHggbmV3X3ZhbHMgPSBhYXJjaDY0X3VuemlwX3ZlY3Rvcl9pbml0IChtb2Rl LCB2YWxzLCBpID09IDApOwogICAgICBydHggdG1wX3JlZyA9IGdlbl9yZWdfcnR4IChHRVRfTU9E RSAobmV3X3ZhbHMpKTsKICAgICAgYWFyY2g2NF9leHBhbmRfdmVjdG9yX2luaXQgKHRtcF9yZWcs IG5ld192YWxzKTsKICAgICAgaGFsdmVzW2ldID0gZ2VuX3J0eF9TVUJSRUcgKG1vZGUsIHRtcF9y ZWcsIDApOwogICAgICBydHhfaW5zbiAqcmVjX3NlcSA9IGdldF9pbnNucyAoKTsKICAgICAgZW5k X3NlcXVlbmNlICgpOwogICAgICBjb3N0c1tpXSA9IHNlcV9jb3N0X2lnbm9yaW5nX3NjYWxhcl9t b3ZlcyAocmVjX3NlcSwgIW9wdGltaXplX3NpemUpOwogICAgICBlbWl0X2luc24gKHJlY19zZXEp OwogICAgfQoKICBydHZlYyB2ID0gZ2VuX3J0dmVjICgyLCBoYWx2ZXNbMF0sIGhhbHZlc1sxXSk7 CiAgcnR4X2luc24gKnppcDFfaW5zbgogICAgPSBlbWl0X3NldF9pbnNuICh0YXJnZXQsIGdlbl9y dHhfVU5TUEVDIChtb2RlLCB2LCBVTlNQRUNfWklQMSkpOwogIHVuc2lnbmVkIHNlcV90b3RhbF9j b3N0CiAgICA9ICghb3B0aW1pemVfc2l6ZSkgPyBzdGQ6Om1heCAoY29zdHNbMF0sIGNvc3RzWzFd KSA6IGNvc3RzWzBdICsgY29zdHNbMV07CiAgc2VxX3RvdGFsX2Nvc3QgKz0gaW5zbl9jb3N0ICh6 aXAxX2luc24sICFvcHRpbWl6ZV9zaXplKTsKCiAgcnR4X2luc24gKnNlcSA9IGdldF9pbnNucyAo KTsKICBlbmRfc2VxdWVuY2UgKCk7CgogIHN0YXJ0X3NlcXVlbmNlICgpOwogIGFhcmNoNjRfZXhw YW5kX3ZlY3Rvcl9pbml0X2ZhbGxiYWNrICh0YXJnZXQsIHZhbHMpOwogIHJ0eF9pbnNuICpmYWxs YmFja19zZXEgPSBnZXRfaW5zbnMgKCk7CiAgdW5zaWduZWQgZmFsbGJhY2tfc2VxX2Nvc3QKICAg ID0gc2VxX2Nvc3RfaWdub3Jpbmdfc2NhbGFyX21vdmVzIChmYWxsYmFja19zZXEsICFvcHRpbWl6 ZV9zaXplKTsKICBlbmRfc2VxdWVuY2UgKCk7CgogIGVtaXRfaW5zbiAoc2VxX3RvdGFsX2Nvc3Qg PCBmYWxsYmFja19zZXFfY29zdCA/IHNlcSA6IGZhbGxiYWNrX3NlcSk7Cn0KCi8qIEVtaXQgUlRM IGNvcnJlc3BvbmRpbmcgdG86CiAgIGluc3IgVEFSR0VULCBFTEVNLiAgKi8KCnN0YXRpYyB2b2lk CmVtaXRfaW5zciAocnR4IHRhcmdldCwgcnR4IGVsZW0pCnsKICBtYWNoaW5lX21vZGUgbW9kZSA9 IEdFVF9NT0RFICh0YXJnZXQpOwogIHNjYWxhcl9tb2RlIGVsZW1fbW9kZSA9IEdFVF9NT0RFX0lO TkVSIChtb2RlKTsKICBlbGVtID0gZm9yY2VfcmVnIChlbGVtX21vZGUsIGVsZW0pOwoKICBpbnNu X2NvZGUgaWNvZGUgPSBvcHRhYl9oYW5kbGVyICh2ZWNfc2hsX2luc2VydF9vcHRhYiwgbW9kZSk7 CiAgZ2NjX2Fzc2VydCAoaWNvZGUgIT0gQ09ERV9GT1Jfbm90aGluZyk7CiAgZW1pdF9pbnNuIChH RU5fRkNOIChpY29kZSkgKHRhcmdldCwgdGFyZ2V0LCBlbGVtKSk7Cn0KCi8qIFN1YnJvdXRpbmUg b2YgYWFyY2g2NF9zdmVfZXhwYW5kX3ZlY3Rvcl9pbml0IGZvciBoYW5kbGluZwogICB0cmFpbGlu ZyBjb25zdGFudHMuCiAgIFRoaXMgZnVuY3Rpb24gd29ya3MgYXMgZm9sbG93czoKICAgKGEpIENy ZWF0ZSBhIG5ldyB2ZWN0b3IgY29uc2lzdGluZyBvZiB0cmFpbGluZyBjb25zdGFudHMuCiAgIChi KSBJbml0aWFsaXplIFRBUkdFVCB3aXRoIHRoZSBjb25zdGFudCB2ZWN0b3IgdXNpbmcgZW1pdF9t b3ZlX2luc24uCiAgIChjKSBJbnNlcnQgcmVtYWluaW5nIGVsZW1lbnRzIGluIFRBUkdFVCB1c2lu ZyBpbnNyLgogICBORUxUUyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIG9yaWdp bmFsIHZlY3RvciB3aGlsZQogICB3aGlsZSBORUxUU19SRVFEIGlzIHRoZSBudW1iZXIgb2YgZWxl bWVudHMgdGhhdCBhcmUgYWN0dWFsbHkKICAgc2lnbmlmaWNhbnQuCgogICA/Pz8gVGhlIGhldXJp c3RpYyB1c2VkIGlzIHRvIGRvIGFib3ZlIG9ubHkgaWYgbnVtYmVyIG9mIGNvbnN0YW50cwogICBp cyBhdCBsZWFzdCBoYWxmIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMuICBNYXkgbmVlZCBm aW5lIHR1bmluZy4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3N2ZV9leHBhbmRfdmVjdG9yX2lu aXRfaGFuZGxlX3RyYWlsaW5nX2NvbnN0YW50cwogKHJ0eCB0YXJnZXQsIGNvbnN0IHJ0eF92ZWN0 b3JfYnVpbGRlciAmYnVpbGRlciwgaW50IG5lbHRzLCBpbnQgbmVsdHNfcmVxZCkKewogIG1hY2hp bmVfbW9kZSBtb2RlID0gR0VUX01PREUgKHRhcmdldCk7CiAgc2NhbGFyX21vZGUgZWxlbV9tb2Rl ID0gR0VUX01PREVfSU5ORVIgKG1vZGUpOwogIGludCBuX3RyYWlsaW5nX2NvbnN0YW50cyA9IDA7 CgogIGZvciAoaW50IGkgPSBuZWx0c19yZXFkIC0gMTsKICAgICAgIGkgPj0gMCAmJiB2YWxpZF9m b3JfY29uc3RfdmVjdG9yX3AgKGVsZW1fbW9kZSwgYnVpbGRlci5lbHQgKGkpKTsKICAgICAgIGkt LSkKICAgIG5fdHJhaWxpbmdfY29uc3RhbnRzKys7CgogIGlmIChuX3RyYWlsaW5nX2NvbnN0YW50 cyA+PSBuZWx0c19yZXFkIC8gMikKICAgIHsKICAgICAgLyogVHJ5IHRvIHVzZSB0aGUgbmF0dXJh bCBwYXR0ZXJuIG9mIEJVSUxERVIgdG8gZXh0ZW5kIHRoZSB0cmFpbGluZwoJIGNvbnN0YW50IGVs ZW1lbnRzIHRvIGEgZnVsbCB2ZWN0b3IuICBSZXBsYWNlIGFueSB2YXJpYWJsZXMgaW4gdGhlCgkg ZXh0cmEgZWxlbWVudHMgd2l0aCB6ZXJvcy4KCgkgPz8/IEl0IHdvdWxkIGJlIGJldHRlciBpZiB0 aGUgYnVpbGRlcnMgc3VwcG9ydGVkICJkb24ndCBjYXJlIgoJICAgICBlbGVtZW50cywgd2l0aCB0 aGUgYnVpbGRlciBmaWxsaW5nIGluIHdoaWNoZXZlciBlbGVtZW50cwoJICAgICBnaXZlIHRoZSBt b3N0IGNvbXBhY3QgZW5jb2RpbmcuICAqLwogICAgICBydHhfdmVjdG9yX2J1aWxkZXIgdiAobW9k ZSwgbmVsdHMsIDEpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lbHRzOyBpKyspCgl7Cgkg IHJ0eCB4ID0gYnVpbGRlci5lbHQgKGkgKyBuZWx0c19yZXFkIC0gbl90cmFpbGluZ19jb25zdGFu dHMpOwoJICBpZiAoIXZhbGlkX2Zvcl9jb25zdF92ZWN0b3JfcCAoZWxlbV9tb2RlLCB4KSkKCSAg ICB4ID0gQ09OU1QwX1JUWCAoZWxlbV9tb2RlKTsKCSAgdi5xdWlja19wdXNoICh4KTsKCX0KICAg ICAgcnR4IGNvbnN0X3ZlYyA9IHYuYnVpbGQgKCk7CiAgICAgIGVtaXRfbW92ZV9pbnNuICh0YXJn ZXQsIGNvbnN0X3ZlYyk7CgogICAgICBmb3IgKGludCBpID0gbmVsdHNfcmVxZCAtIG5fdHJhaWxp bmdfY29uc3RhbnRzIC0gMTsgaSA+PSAwOyBpLS0pCgllbWl0X2luc3IgKHRhcmdldCwgYnVpbGRl ci5lbHQgKGkpKTsKCiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICByZXR1cm4gZmFsc2U7Cn0K Ci8qIFN1YnJvdXRpbmUgb2YgYWFyY2g2NF9zdmVfZXhwYW5kX3ZlY3Rvcl9pbml0LgogICBXb3Jr cyBhcyBmb2xsb3dzOgogICAoYSkgSW5pdGlhbGl6ZSBUQVJHRVQgYnkgYnJvYWRjYXN0aW5nIGVs ZW1lbnQgTkVMVFNfUkVRRCAtIDEgb2YgQlVJTERFUi4KICAgKGIpIFNraXAgdHJhaWxpbmcgZWxl bWVudHMgZnJvbSBCVUlMREVSLCB3aGljaCBhcmUgdGhlIHNhbWUgYXMKICAgICAgIGVsZW1lbnQg TkVMVFNfUkVRRCAtIDEuCiAgIChjKSBJbnNlcnQgZWFybGllciBlbGVtZW50cyBpbiByZXZlcnNl IG9yZGVyIGluIFRBUkdFVCB1c2luZyBpbnNyLiAgKi8KCnN0YXRpYyB2b2lkCmFhcmNoNjRfc3Zl X2V4cGFuZF92ZWN0b3JfaW5pdF9pbnNlcnRfZWxlbXMgKHJ0eCB0YXJnZXQsCgkJCQkJICAgICBj b25zdCBydHhfdmVjdG9yX2J1aWxkZXIgJmJ1aWxkZXIsCgkJCQkJICAgICBpbnQgbmVsdHNfcmVx ZCkKewogIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKHRhcmdldCk7CiAgc2NhbGFyX21v ZGUgZWxlbV9tb2RlID0gR0VUX01PREVfSU5ORVIgKG1vZGUpOwoKICBzdHJ1Y3QgZXhwYW5kX29w ZXJhbmQgb3BzWzJdOwogIGVudW0gaW5zbl9jb2RlIGljb2RlID0gb3B0YWJfaGFuZGxlciAodmVj X2R1cGxpY2F0ZV9vcHRhYiwgbW9kZSk7CiAgZ2NjX2Fzc2VydCAoaWNvZGUgIT0gQ09ERV9GT1Jf bm90aGluZyk7CgogIGNyZWF0ZV9vdXRwdXRfb3BlcmFuZCAoJm9wc1swXSwgdGFyZ2V0LCBtb2Rl KTsKICBjcmVhdGVfaW5wdXRfb3BlcmFuZCAoJm9wc1sxXSwgYnVpbGRlci5lbHQgKG5lbHRzX3Jl cWQgLSAxKSwgZWxlbV9tb2RlKTsKICBleHBhbmRfaW5zbiAoaWNvZGUsIDIsIG9wcyk7CgogIGlu dCBuZHVwcyA9IGJ1aWxkZXIuY291bnRfZHVwcyAobmVsdHNfcmVxZCAtIDEsIC0xLCAtMSk7CiAg Zm9yIChpbnQgaSA9IG5lbHRzX3JlcWQgLSBuZHVwcyAtIDE7IGkgPj0gMDsgaS0tKQogICAgZW1p dF9pbnNyICh0YXJnZXQsIGJ1aWxkZXIuZWx0IChpKSk7Cn0KCi8qIFN1YnJvdXRpbmUgb2YgYWFy Y2g2NF9zdmVfZXhwYW5kX3ZlY3Rvcl9pbml0IHRvIGhhbmRsZSBjYXNlCiAgIHdoZW4gYWxsIHRy YWlsaW5nIGVsZW1lbnRzIG9mIGJ1aWxkZXIgYXJlIHNhbWUuCiAgIFRoaXMgd29ya3MgYXMgZm9s bG93czoKICAgKGEpIFVzZSBleHBhbmRfaW5zbiBpbnRlcmZhY2UgdG8gYnJvYWRjYXN0IGxhc3Qg dmVjdG9yIGVsZW1lbnQgaW4gVEFSR0VULgogICAoYikgSW5zZXJ0IHJlbWFpbmluZyBlbGVtZW50 cyBpbiBUQVJHRVQgdXNpbmcgaW5zci4KCiAgID8/PyBUaGUgaGV1cmlzdGljIHVzZWQgaXMgdG8g ZG8gYWJvdmUgaWYgbnVtYmVyIG9mIHNhbWUgdHJhaWxpbmcgZWxlbWVudHMKICAgaXMgYXQgbGVh c3QgMy80IG9mIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cywgbG9vc2VseSBiYXNlZCBvbgogICBo ZXVyaXN0aWMgZnJvbSBtb3N0bHlfemVyb3NfcC4gIE1heSBuZWVkIGZpbmUtdHVuaW5nLiAgKi8K CnN0YXRpYyBib29sCmFhcmNoNjRfc3ZlX2V4cGFuZF92ZWN0b3JfaW5pdF9oYW5kbGVfdHJhaWxp bmdfc2FtZV9lbGVtCiAocnR4IHRhcmdldCwgY29uc3QgcnR4X3ZlY3Rvcl9idWlsZGVyICZidWls ZGVyLCBpbnQgbmVsdHNfcmVxZCkKewogIGludCBuZHVwcyA9IGJ1aWxkZXIuY291bnRfZHVwcyAo bmVsdHNfcmVxZCAtIDEsIC0xLCAtMSk7CiAgaWYgKG5kdXBzID49ICgzICogbmVsdHNfcmVxZCkg LyA0KQogICAgewogICAgICBhYXJjaDY0X3N2ZV9leHBhbmRfdmVjdG9yX2luaXRfaW5zZXJ0X2Vs ZW1zICh0YXJnZXQsIGJ1aWxkZXIsCgkJCQkJCSAgIG5lbHRzX3JlcWQgLSBuZHVwcyArIDEpOwog ICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIGZhbHNlOwp9CgovKiBJbml0aWFsaXpl IHJlZ2lzdGVyIFRBUkdFVCBmcm9tIEJVSUxERVIuIE5FTFRTIGlzIHRoZSBjb25zdGFudCBudW1i ZXIKICAgb2YgZWxlbWVudHMgaW4gQlVJTERFUi4KCiAgIFRoZSBmdW5jdGlvbiB0cmllcyB0byBp bml0aWFsaXplIFRBUkdFVCBmcm9tIEJVSUxERVIgaWYgaXQgZml0cyBvbmUKICAgb2YgdGhlIHNw ZWNpYWwgY2FzZXMgb3V0bGluZWQgYmVsb3cuCgogICBGYWlsaW5nIHRoYXQsIHRoZSBmdW5jdGlv biBkaXZpZGVzIEJVSUxERVIgaW50byB0d28gc3ViLXZlY3RvcnM6CiAgIHZfZXZlbiA9IGV2ZW4g ZWxlbWVudHMgb2YgQlVJTERFUjsKICAgdl9vZGQgPSBvZGQgZWxlbWVudHMgb2YgQlVJTERFUjsK CiAgIGFuZCByZWN1cnNpdmVseSBjYWxscyBpdHNlbGYgd2l0aCB2X2V2ZW4gYW5kIHZfb2RkLgoK ICAgaWYgKHJlY3Vyc2l2ZSBjYWxsIHN1Y2NlZWRlZCBmb3Igdl9ldmVuIG9yIHZfb2RkKQogICAg IFRBUkdFVCA9IHppcCAodl9ldmVuLCB2X29kZCkKCiAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRy dWUgaWYgaXQgbWFuYWdlZCB0byBidWlsZCBUQVJHRVQgZnJvbSBCVUlMREVSCiAgIHdpdGggb25l IG9mIHRoZSBzcGVjaWFsIGNhc2VzLCBmYWxzZSBvdGhlcndpc2UuCgogICBFeGFtcGxlOiB7YSwg MSwgYiwgMiwgYywgMywgZCwgNH0KCiAgIFRoZSB2ZWN0b3IgZ2V0cyBkaXZpZGVkIGludG86CiAg IHZfZXZlbiA9IHthLCBiLCBjLCBkfQogICB2X29kZCA9IHsxLCAyLCAzLCA0fQoKICAgYWFyY2g2 NF9zdmVfZXhwYW5kX3ZlY3Rvcl9pbml0KHZfb2RkKSBoaXRzIGNhc2UgMSBhbmQKICAgaW5pdGlh bGl6ZSB0bXAyIGZyb20gY29uc3RhbnQgdmVjdG9yIHZfb2RkIHVzaW5nIGVtaXRfbW92ZV9pbnNu LgoKICAgYWFyY2g2NF9zdmVfZXhwYW5kX3ZlY3Rvcl9pbml0KHZfZXZlbikgZmFpbHMgc2luY2Ug dl9ldmVuIGNvbnRhaW5zCiAgIDQgZWxlbWVudHMsIHNvIHdlIGNvbnN0cnVjdCB0bXAxIGZyb20g dl9ldmVuIHVzaW5nIGluc3I6CiAgIHRtcDEgPSBkdXAoZCkKICAgaW5zciB0bXAxLCBjCiAgIGlu c3IgdG1wMSwgYgogICBpbnNyIHRtcDEsIGEKCiAgIEFuZCBmaW5hbGx5OgogICBUQVJHRVQgPSB6 aXAgKHRtcDEsIHRtcDIpCiAgIHdoaWNoIHNldHMgVEFSR0VUIHRvIHthLCAxLCBiLCAyLCBjLCAz LCBkLCA0fS4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X3N2ZV9leHBhbmRfdmVjdG9yX2luaXQg KHJ0eCB0YXJnZXQsIGNvbnN0IHJ0eF92ZWN0b3JfYnVpbGRlciAmYnVpbGRlciwKCQkJCWludCBu ZWx0cywgaW50IG5lbHRzX3JlcWQpCnsKICBtYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFICh0 YXJnZXQpOwoKICAvKiBDYXNlIDE6IFZlY3RvciBjb250YWlucyB0cmFpbGluZyBjb25zdGFudHMu ICAqLwoKICBpZiAoYWFyY2g2NF9zdmVfZXhwYW5kX3ZlY3Rvcl9pbml0X2hhbmRsZV90cmFpbGlu Z19jb25zdGFudHMKICAgICAgICh0YXJnZXQsIGJ1aWxkZXIsIG5lbHRzLCBuZWx0c19yZXFkKSkK ICAgIHJldHVybiB0cnVlOwoKICAvKiBDYXNlIDI6IFZlY3RvciBjb250YWlucyBsZWFkaW5nIGNv bnN0YW50cy4gICovCgogIHJ0eF92ZWN0b3JfYnVpbGRlciByZXZfYnVpbGRlciAobW9kZSwgbmVs dHNfcmVxZCwgMSk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZWx0c19yZXFkOyBpKyspCiAgICBy ZXZfYnVpbGRlci5xdWlja19wdXNoIChidWlsZGVyLmVsdCAobmVsdHNfcmVxZCAtIGkgLSAxKSk7 CiAgcmV2X2J1aWxkZXIuZmluYWxpemUgKCk7CgogIGlmIChhYXJjaDY0X3N2ZV9leHBhbmRfdmVj dG9yX2luaXRfaGFuZGxlX3RyYWlsaW5nX2NvbnN0YW50cwogICAgICAgKHRhcmdldCwgcmV2X2J1 aWxkZXIsIG5lbHRzLCBuZWx0c19yZXFkKSkKICAgIHsKICAgICAgZW1pdF9pbnNuIChnZW5fYWFy Y2g2NF9zdmVfcmV2IChtb2RlLCB0YXJnZXQsIHRhcmdldCkpOwogICAgICByZXR1cm4gdHJ1ZTsK ICAgIH0KCiAgLyogQ2FzZSAzOiBWZWN0b3IgY29udGFpbnMgdHJhaWxpbmcgc2FtZSBlbGVtZW50 LiAgKi8KCiAgaWYgKGFhcmNoNjRfc3ZlX2V4cGFuZF92ZWN0b3JfaW5pdF9oYW5kbGVfdHJhaWxp bmdfc2FtZV9lbGVtCiAgICAgICAodGFyZ2V0LCBidWlsZGVyLCBuZWx0c19yZXFkKSkKICAgIHJl dHVybiB0cnVlOwoKICAvKiBDYXNlIDQ6IFZlY3RvciBjb250YWlucyBsZWFkaW5nIHNhbWUgZWxl bWVudC4gICovCgogIGlmIChhYXJjaDY0X3N2ZV9leHBhbmRfdmVjdG9yX2luaXRfaGFuZGxlX3Ry YWlsaW5nX3NhbWVfZWxlbQogICAgICAgKHRhcmdldCwgcmV2X2J1aWxkZXIsIG5lbHRzX3JlcWQp ICYmIG5lbHRzX3JlcWQgPT0gbmVsdHMpCiAgICB7CiAgICAgIGVtaXRfaW5zbiAoZ2VuX2FhcmNo NjRfc3ZlX3JldiAobW9kZSwgdGFyZ2V0LCB0YXJnZXQpKTsKICAgICAgcmV0dXJuIHRydWU7CiAg ICB9CgogIC8qIEF2b2lkIHJlY3Vyc2luZyBiZWxvdyA0LWVsZW1lbnRzLgogICAgID8/PyBUaGUg dGhyZXNob2xkIDQgbWF5IG5lZWQgZmluZS10dW5pbmcuICAqLwoKICBpZiAobmVsdHNfcmVxZCA8 PSA0KQogICAgcmV0dXJuIGZhbHNlOwoKICBydHhfdmVjdG9yX2J1aWxkZXIgdl9ldmVuIChtb2Rl LCBuZWx0cywgMSk7CiAgcnR4X3ZlY3Rvcl9idWlsZGVyIHZfb2RkIChtb2RlLCBuZWx0cywgMSk7 CgogIGZvciAoaW50IGkgPSAwOyBpIDwgbmVsdHMgKiAyOyBpICs9IDIpCiAgICB7CiAgICAgIHZf ZXZlbi5xdWlja19wdXNoIChidWlsZGVyLmVsdCAoaSkpOwogICAgICB2X29kZC5xdWlja19wdXNo IChidWlsZGVyLmVsdCAoaSArIDEpKTsKICAgIH0KCiAgdl9ldmVuLmZpbmFsaXplICgpOwogIHZf b2RkLmZpbmFsaXplICgpOwoKICBydHggdG1wMSA9IGdlbl9yZWdfcnR4IChtb2RlKTsKICBib29s IGRpZF9ldmVuX3AgPSBhYXJjaDY0X3N2ZV9leHBhbmRfdmVjdG9yX2luaXQgKHRtcDEsIHZfZXZl biwKCQkJCQkJICAgIG5lbHRzLCBuZWx0c19yZXFkIC8gMik7CgogIHJ0eCB0bXAyID0gZ2VuX3Jl Z19ydHggKG1vZGUpOwogIGJvb2wgZGlkX29kZF9wID0gYWFyY2g2NF9zdmVfZXhwYW5kX3ZlY3Rv cl9pbml0ICh0bXAyLCB2X29kZCwKCQkJCQkJICAgbmVsdHMsIG5lbHRzX3JlcWQgLyAyKTsKCiAg aWYgKCFkaWRfZXZlbl9wICYmICFkaWRfb2RkX3ApCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIElu aXRpYWxpemUgdl9ldmVuIGFuZCB2X29kZCB1c2luZyBJTlNSIGlmIGl0IGRpZG4ndCBtYXRjaCBh bnkgb2YgdGhlCiAgICAgc3BlY2lhbCBjYXNlcyBhbmQgemlwIHZfZXZlbiwgdl9vZGQuICAqLwoK ICBpZiAoIWRpZF9ldmVuX3ApCiAgICBhYXJjaDY0X3N2ZV9leHBhbmRfdmVjdG9yX2luaXRfaW5z ZXJ0X2VsZW1zICh0bXAxLCB2X2V2ZW4sIG5lbHRzX3JlcWQgLyAyKTsKCiAgaWYgKCFkaWRfb2Rk X3ApCiAgICBhYXJjaDY0X3N2ZV9leHBhbmRfdmVjdG9yX2luaXRfaW5zZXJ0X2VsZW1zICh0bXAy LCB2X29kZCwgbmVsdHNfcmVxZCAvIDIpOwoKICBydHZlYyB2ID0gZ2VuX3J0dmVjICgyLCB0bXAx LCB0bXAyKTsKICBlbWl0X3NldF9pbnNuICh0YXJnZXQsIGdlbl9ydHhfVU5TUEVDIChtb2RlLCB2 LCBVTlNQRUNfWklQMSkpOwogIHJldHVybiB0cnVlOwp9CgovKiBJbml0aWFsaXplIHJlZ2lzdGVy IFRBUkdFVCBmcm9tIHRoZSBlbGVtZW50cyBpbiBQQVJBTExFTCBydHggVkFMUy4gICovCgp2b2lk CmFhcmNoNjRfc3ZlX2V4cGFuZF92ZWN0b3JfaW5pdCAocnR4IHRhcmdldCwgcnR4IHZhbHMpCnsK ICBtYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFICh0YXJnZXQpOwogIGludCBuZWx0cyA9IFhW RUNMRU4gKHZhbHMsIDApOwoKICBydHhfdmVjdG9yX2J1aWxkZXIgdiAobW9kZSwgbmVsdHMsIDEp OwogIGZvciAoaW50IGkgPSAwOyBpIDwgbmVsdHM7IGkrKykKICAgIHYucXVpY2tfcHVzaCAoWFZF Q0VYUCAodmFscywgMCwgaSkpOwogIHYuZmluYWxpemUgKCk7CgogIC8qIElmIG5laXRoZXIgc3Vi LXZlY3RvcnMgb2YgdiBjb3VsZCBiZSBpbml0aWFsaXplZCBzcGVjaWFsbHksCiAgICAgdGhlbiB1 c2UgSU5TUiB0byBpbnNlcnQgYWxsIGVsZW1lbnRzIGZyb20gdiBpbnRvIFRBUkdFVC4KICAgICA/ Pz8gVGhpcyBtaWdodCBub3QgYmUgb3B0aW1hbCBmb3IgdmVjdG9ycyB3aXRoIGxhcmdlCiAgICAg aW5pdGlhbGl6ZXJzIGxpa2UgMTYtZWxlbWVudCBvciBhYm92ZS4KICAgICBGb3IgbmVsdHMgPCA0 LCBpdCBwcm9iYWJseSBpc24ndCB1c2VmdWwgdG8gaGFuZGxlIHNwZWNpYWxseS4gICovCgogIGlm IChuZWx0cyA8IDQKICAgICAgfHwgIWFhcmNoNjRfc3ZlX2V4cGFuZF92ZWN0b3JfaW5pdCAodGFy Z2V0LCB2LCBuZWx0cywgbmVsdHMpKQogICAgYWFyY2g2NF9zdmVfZXhwYW5kX3ZlY3Rvcl9pbml0 X2luc2VydF9lbGVtcyAodGFyZ2V0LCB2LCBuZWx0cyk7Cn0KCi8qIENoZWNrIHdoZXRoZXIgVkFM VUUgaXMgYSB2ZWN0b3IgY29uc3RhbnQgaW4gd2hpY2ggZXZlcnkgZWxlbWVudAogICBpcyBlaXRo ZXIgYSBwb3dlciBvZiAyIG9yIGEgbmVnYXRlZCBwb3dlciBvZiAyLiAgSWYgc28sIHJldHVybgog ICBhIGNvbnN0YW50IHZlY3RvciBvZiBsb2cycywgYW5kIGZsaXAgQ09ERSBiZXR3ZWVuIFBMVVMg YW5kIE1JTlVTCiAgIGlmIFZBTFVFIGNvbnRhaW5zIG5lZ2F0ZWQgcG93ZXJzIG9mIDIuICBSZXR1 cm4gTlVMTF9SVFggb3RoZXJ3aXNlLiAgKi8KCnN0YXRpYyBydHgKYWFyY2g2NF9jb252ZXJ0X211 bHRfdG9fc2hpZnQgKHJ0eCB2YWx1ZSwgcnR4X2NvZGUgJmNvZGUpCnsKICBpZiAoIUNPTlNUX1ZF Q1RPUl9QICh2YWx1ZSkpCiAgICByZXR1cm4gTlVMTF9SVFg7CgogIHJ0eF92ZWN0b3JfYnVpbGRl ciBidWlsZGVyOwogIGlmICghYnVpbGRlci5uZXdfdW5hcnlfb3BlcmF0aW9uIChHRVRfTU9ERSAo dmFsdWUpLCB2YWx1ZSwgZmFsc2UpKQogICAgcmV0dXJuIE5VTExfUlRYOwoKICBzY2FsYXJfbW9k ZSBpbnRfbW9kZSA9IEdFVF9NT0RFX0lOTkVSIChHRVRfTU9ERSAodmFsdWUpKTsKICAvKiAxIGlm IHRoZSByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uIG11c3QgYmUgbmVnYXRlZCwKICAgICAw IGlmIGl0IG11c3RuJ3QsIG9yIC0xIGlmIHdlIGRvbid0IHlldCBjYXJlLiAgKi8KICBpbnQgbmVn YXRlID0gLTE7CiAgdW5zaWduZWQgaW50IGVuY29kZWRfbmVsdHMgPSBjb25zdF92ZWN0b3JfZW5j b2RlZF9uZWx0cyAodmFsdWUpOwogIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZW5jb2Rl ZF9uZWx0czsgKytpKQogICAgewogICAgICBydHggZWx0ID0gQ09OU1RfVkVDVE9SX0VOQ09ERURf RUxUICh2YWx1ZSwgaSk7CiAgICAgIGlmICghQ09OU1RfU0NBTEFSX0lOVF9QIChlbHQpKQoJcmV0 dXJuIE5VTExfUlRYOwogICAgICBydHhfbW9kZV90IHZhbCAoZWx0LCBpbnRfbW9kZSk7CiAgICAg IHdpZGVfaW50IHBvdzIgPSB3aTo6bmVnICh2YWwpOwogICAgICBpZiAodmFsICE9IHBvdzIpCgl7 CgkgIC8qIEl0IG1hdHRlcnMgd2hldGhlciB3ZSBuZWdhdGUgb3Igbm90LiAgTWFrZSB0aGF0IGNo b2ljZSwKCSAgICAgYW5kIG1ha2Ugc3VyZSB0aGF0IGl0J3MgY29uc2lzdGVudCB3aXRoIHByZXZp b3VzIGVsZW1lbnRzLiAgKi8KCSAgaWYgKG5lZ2F0ZSA9PSAhd2k6Om5lZ19wICh2YWwpKQoJICAg IHJldHVybiBOVUxMX1JUWDsKCSAgbmVnYXRlID0gd2k6Om5lZ19wICh2YWwpOwoJICBpZiAoIW5l Z2F0ZSkKCSAgICBwb3cyID0gdmFsOwoJfQogICAgICAvKiBQT1cyIGlzIG5vdyB0aGUgdmFsdWUg dGhhdCB3ZSB3YW50IHRvIGJlIGEgcG93ZXIgb2YgMi4gICovCiAgICAgIGludCBzaGlmdCA9IHdp OjpleGFjdF9sb2cyIChwb3cyKTsKICAgICAgaWYgKHNoaWZ0IDwgMCkKCXJldHVybiBOVUxMX1JU WDsKICAgICAgYnVpbGRlci5xdWlja19wdXNoIChnZW5faW50X21vZGUgKHNoaWZ0LCBpbnRfbW9k ZSkpOwogICAgfQogIGlmIChuZWdhdGUgPT0gLTEpCiAgICAvKiBQTFVTIGFuZCBNSU5VUyBhcmUg ZXF1aXZhbGVudDsgY2Fub25pY2FsaXplIG9uIFBMVVMuICAqLwogICAgY29kZSA9IFBMVVM7CiAg ZWxzZSBpZiAobmVnYXRlID09IDEpCiAgICBjb2RlID0gY29kZSA9PSBQTFVTID8gTUlOVVMgOiBQ TFVTOwogIHJldHVybiBidWlsZGVyLmJ1aWxkICgpOwp9CgovKiBQcmVwYXJlIGZvciBhbiBpbnRl Z2VyIFNWRSBtdWx0aXBseS1hZGQgb3IgbXVsdGlwbHktc3VidHJhY3QgcGF0dGVybjsKICAgQ09E RSBpcyBQTFVTIGZvciB0aGUgZm9ybWVyIGFuZCBNSU5VUyBmb3IgdGhlIGxhdHRlci4gIE9QRVJB TkRTIGlzIHRoZQogICBvcGVyYW5kcyBhcnJheSwgaW4gdGhlIHNhbWUgb3JkZXIgYXMgZm9yIGZt YV9vcHRhYi4gIFJldHVybiB0cnVlIGlmCiAgIHRoZSBmdW5jdGlvbiBlbWl0dGVkIGFsbCB0aGUg bmVjZXNzYXJ5IGluc3RydWN0aW9ucywgZmFsc2UgaWYgdGhlIGNhbGxlcgogICBzaG91bGQgZ2Vu ZXJhdGUgdGhlIHBhdHRlcm4gbm9ybWFsbHkgd2l0aCB0aGUgbmV3IE9QRVJBTkRTIGFycmF5LiAg Ki8KCmJvb2wKYWFyY2g2NF9wcmVwYXJlX3N2ZV9pbnRfZm1hIChydHggKm9wZXJhbmRzLCBydHhf Y29kZSBjb2RlKQp7CiAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRfTU9ERSAob3BlcmFuZHNbMF0p OwogIGlmIChydHggc2hpZnRzID0gYWFyY2g2NF9jb252ZXJ0X211bHRfdG9fc2hpZnQgKG9wZXJh bmRzWzJdLCBjb2RlKSkKICAgIHsKICAgICAgcnR4IHByb2R1Y3QgPSBleHBhbmRfYmlub3AgKG1v ZGUsIHZhc2hsX29wdGFiLCBvcGVyYW5kc1sxXSwgc2hpZnRzLAoJCQkJICBOVUxMX1JUWCwgdHJ1 ZSwgT1BUQUJfRElSRUNUKTsKICAgICAgZm9yY2VfZXhwYW5kX2Jpbm9wIChtb2RlLCBjb2RlID09 IFBMVVMgPyBhZGRfb3B0YWIgOiBzdWJfb3B0YWIsCgkJCSAgb3BlcmFuZHNbM10sIHByb2R1Y3Qs IG9wZXJhbmRzWzBdLCB0cnVlLAoJCQkgIE9QVEFCX0RJUkVDVCk7CiAgICAgIHJldHVybiB0cnVl OwogICAgfQogIG9wZXJhbmRzWzJdID0gZm9yY2VfcmVnIChtb2RlLCBvcGVyYW5kc1syXSk7CiAg cmV0dXJuIGZhbHNlOwp9CgovKiBMaWtld2lzZSwgYnV0IGZvciBhIGNvbmRpdGlvbmFsIHBhdHRl cm4uICAqLwoKYm9vbAphYXJjaDY0X3ByZXBhcmVfc3ZlX2NvbmRfaW50X2ZtYSAocnR4ICpvcGVy YW5kcywgcnR4X2NvZGUgY29kZSkKewogIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKG9w ZXJhbmRzWzBdKTsKICBpZiAocnR4IHNoaWZ0cyA9IGFhcmNoNjRfY29udmVydF9tdWx0X3RvX3No aWZ0IChvcGVyYW5kc1szXSwgY29kZSkpCiAgICB7CiAgICAgIHJ0eCBwcm9kdWN0ID0gZXhwYW5k X2Jpbm9wIChtb2RlLCB2YXNobF9vcHRhYiwgb3BlcmFuZHNbMl0sIHNoaWZ0cywKCQkJCSAgTlVM TF9SVFgsIHRydWUsIE9QVEFCX0RJUkVDVCk7CiAgICAgIGVtaXRfaW5zbiAoZ2VuX2NvbmQgKGNv ZGUsIG1vZGUsIG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSwKCQkJICAgb3BlcmFuZHNbNF0sIHBy b2R1Y3QsIG9wZXJhbmRzWzVdKSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIG9wZXJhbmRz WzNdID0gZm9yY2VfcmVnIChtb2RlLCBvcGVyYW5kc1szXSk7CiAgcmV0dXJuIGZhbHNlOwp9Cgpz dGF0aWMgdW5zaWduZWQgSE9TVF9XSURFX0lOVAphYXJjaDY0X3NoaWZ0X3RydW5jYXRpb25fbWFz ayAobWFjaGluZV9tb2RlIG1vZGUpCnsKICBpZiAoIVNISUZUX0NPVU5UX1RSVU5DQVRFRCB8fCBh YXJjaDY0X3ZlY3Rvcl9kYXRhX21vZGVfcCAobW9kZSkpCiAgICByZXR1cm4gMDsKICByZXR1cm4g R0VUX01PREVfVU5JVF9CSVRTSVpFIChtb2RlKSAtIDE7Cn0KCi8qIFNlbGVjdCBhIGZvcm1hdCB0 byBlbmNvZGUgcG9pbnRlcnMgaW4gZXhjZXB0aW9uIGhhbmRsaW5nIGRhdGEuICAqLwppbnQKYWFy Y2g2NF9hc21fcHJlZmVycmVkX2VoX2RhdGFfZm9ybWF0IChpbnQgY29kZSBBVFRSSUJVVEVfVU5V U0VELCBpbnQgZ2xvYmFsKQp7CiAgIGludCB0eXBlOwogICBzd2l0Y2ggKGFhcmNoNjRfY21vZGVs KQogICAgIHsKICAgICBjYXNlIEFBUkNINjRfQ01PREVMX1RJTlk6CiAgICAgY2FzZSBBQVJDSDY0 X0NNT0RFTF9USU5ZX1BJQzoKICAgICBjYXNlIEFBUkNINjRfQ01PREVMX1NNQUxMOgogICAgIGNh c2UgQUFSQ0g2NF9DTU9ERUxfU01BTExfUElDOgogICAgIGNhc2UgQUFSQ0g2NF9DTU9ERUxfU01B TExfU1BJQzoKICAgICAgIC8qIHRleHQrZ290K2RhdGEgPCA0R2IuICA0LWJ5dGUgc2lnbmVkIHJl bG9jcyBhcmUgc3VmZmljaWVudAoJICBmb3IgZXZlcnl0aGluZy4gICovCiAgICAgICB0eXBlID0g RFdfRUhfUEVfc2RhdGE0OwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIC8qIE5v IGFzc3VtcHRpb25zIGhlcmUuICA4LWJ5dGUgcmVsb2NzIHJlcXVpcmVkLiAgKi8KICAgICAgIHR5 cGUgPSBEV19FSF9QRV9zZGF0YTg7CiAgICAgICBicmVhazsKICAgICB9CiAgIHJldHVybiAoZ2xv YmFsID8gRFdfRUhfUEVfaW5kaXJlY3QgOiAwKSB8IERXX0VIX1BFX3BjcmVsIHwgdHlwZTsKfQoK LyogT3V0cHV0IC52YXJpYW50X3BjcyBmb3IgYWFyY2g2NF92ZWN0b3JfcGNzIGZ1bmN0aW9uIHN5 bWJvbHMuICAqLwoKc3RhdGljIHZvaWQKYWFyY2g2NF9hc21fb3V0cHV0X3ZhcmlhbnRfcGNzIChG SUxFICpzdHJlYW0sIGNvbnN0IHRyZWUgZGVjbCwgY29uc3QgY2hhciogbmFtZSkKewogIGlmIChU UkVFX0NPREUgKGRlY2wpID09IEZVTkNUSU9OX0RFQ0wpCiAgICB7CiAgICAgIGFybV9wY3MgcGNz ID0gKGFybV9wY3MpIGZuZGVjbF9hYmkgKGRlY2wpLmlkICgpOwogICAgICBpZiAocGNzID09IEFS TV9QQ1NfU0lNRCB8fCBwY3MgPT0gQVJNX1BDU19TVkUpCgl7CgkgIGZwcmludGYgKHN0cmVhbSwg Ilx0LnZhcmlhbnRfcGNzXHQiKTsKCSAgYXNzZW1ibGVfbmFtZSAoc3RyZWFtLCBuYW1lKTsKCSAg ZnByaW50ZiAoc3RyZWFtLCAiXG4iKTsKCX0KICAgIH0KfQoKLyogVGhlIGxhc3QgLmFyY2ggYW5k IC50dW5lIGFzc2VtYmx5IHN0cmluZ3MgdGhhdCB3ZSBwcmludGVkLiAgKi8Kc3RhdGljIHN0ZDo6 c3RyaW5nIGFhcmNoNjRfbGFzdF9wcmludGVkX2FyY2hfc3RyaW5nOwpzdGF0aWMgc3RkOjpzdHJp bmcgYWFyY2g2NF9sYXN0X3ByaW50ZWRfdHVuZV9zdHJpbmc7CgovKiBJbXBsZW1lbnQgQVNNX0RF Q0xBUkVfRlVOQ1RJT05fTkFNRS4gIE91dHB1dCB0aGUgSVNBIGZlYXR1cmVzIHVzZWQKICAgYnkg dGhlIGZ1bmN0aW9uIGZuZGVjbC4gICovCgp2b2lkCmFhcmNoNjRfZGVjbGFyZV9mdW5jdGlvbl9u YW1lIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIqIG5hbWUsCgkJCQl0cmVlIGZuZGVjbCkKewog IHRyZWUgdGFyZ2V0X3BhcnRzID0gREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGZuZGVj bCk7CgogIHN0cnVjdCBjbF90YXJnZXRfb3B0aW9uICp0YXJnX29wdGlvbnM7CiAgaWYgKHRhcmdl dF9wYXJ0cykKICAgIHRhcmdfb3B0aW9ucyA9IFRSRUVfVEFSR0VUX09QVElPTiAodGFyZ2V0X3Bh cnRzKTsKICBlbHNlCiAgICB0YXJnX29wdGlvbnMgPSBUUkVFX1RBUkdFVF9PUFRJT04gKHRhcmdl dF9vcHRpb25fY3VycmVudF9ub2RlKTsKICBnY2NfYXNzZXJ0ICh0YXJnX29wdGlvbnMpOwoKICBj b25zdCBzdHJ1Y3QgcHJvY2Vzc29yICp0aGlzX2FyY2gKICAgID0gYWFyY2g2NF9nZXRfYXJjaCAo dGFyZ19vcHRpb25zLT54X3NlbGVjdGVkX2FyY2gpOwoKICBhdXRvIGlzYV9mbGFncyA9IHRhcmdf b3B0aW9ucy0+eF9hYXJjaDY0X2FzbV9pc2FfZmxhZ3M7CiAgc3RkOjpzdHJpbmcgZXh0ZW5zaW9u CiAgICA9IGFhcmNoNjRfZ2V0X2V4dGVuc2lvbl9zdHJpbmdfZm9yX2lzYV9mbGFncyAoaXNhX2Zs YWdzLAoJCQkJCQkgIHRoaXNfYXJjaC0+ZmxhZ3MpOwogIC8qIE9ubHkgdXBkYXRlIHRoZSBhc3Nl bWJsZXIgLmFyY2ggc3RyaW5nIGlmIGl0IGlzIGRpc3RpbmN0IGZyb20gdGhlIGxhc3QKICAgICBz dWNoIHN0cmluZyB3ZSBwcmludGVkLiAgKi8KICBzdGQ6OnN0cmluZyB0b19wcmludCA9IHRoaXNf YXJjaC0+bmFtZSArIGV4dGVuc2lvbjsKICBpZiAodG9fcHJpbnQgIT0gYWFyY2g2NF9sYXN0X3By aW50ZWRfYXJjaF9zdHJpbmcpCiAgICB7CiAgICAgIGFzbV9mcHJpbnRmIChhc21fb3V0X2ZpbGUs ICJcdC5hcmNoICVzXG4iLCB0b19wcmludC5jX3N0ciAoKSk7CiAgICAgIGFhcmNoNjRfbGFzdF9w cmludGVkX2FyY2hfc3RyaW5nID0gdG9fcHJpbnQ7CiAgICB9CgogIC8qIFByaW50IHRoZSBjcHUg bmFtZSB3ZSdyZSB0dW5pbmcgZm9yIGluIHRoZSBjb21tZW50cywgbWlnaHQgYmUKICAgICB1c2Vm dWwgdG8gcmVhZGVycyBvZiB0aGUgZ2VuZXJhdGVkIGFzbS4gIERvIGl0IG9ubHkgd2hlbiBpdCBj aGFuZ2VzCiAgICAgZnJvbSBmdW5jdGlvbiB0byBmdW5jdGlvbiBhbmQgdmVyYm9zZSBhc3NlbWJs eSBpcyByZXF1ZXN0ZWQuICAqLwogIGNvbnN0IHN0cnVjdCBwcm9jZXNzb3IgKnRoaXNfdHVuZQog ICAgPSBhYXJjaDY0X2dldF90dW5lX2NwdSAodGFyZ19vcHRpb25zLT54X3NlbGVjdGVkX3R1bmUp OwoKICBpZiAoZmxhZ19kZWJ1Z19hc20gJiYgYWFyY2g2NF9sYXN0X3ByaW50ZWRfdHVuZV9zdHJp bmcgIT0gdGhpc190dW5lLT5uYW1lKQogICAgewogICAgICBhc21fZnByaW50ZiAoYXNtX291dF9m aWxlLCAiXHQiIEFTTV9DT01NRU5UX1NUQVJUICIudHVuZSAlc1xuIiwKCQkgICB0aGlzX3R1bmUt Pm5hbWUpOwogICAgICBhYXJjaDY0X2xhc3RfcHJpbnRlZF90dW5lX3N0cmluZyA9IHRoaXNfdHVu ZS0+bmFtZTsKICAgIH0KCiAgYWFyY2g2NF9hc21fb3V0cHV0X3ZhcmlhbnRfcGNzIChzdHJlYW0s IGZuZGVjbCwgbmFtZSk7CgogIC8qIERvbid0IGZvcmdldCB0aGUgdHlwZSBkaXJlY3RpdmUgZm9y IEVMRi4gICovCiAgQVNNX09VVFBVVF9UWVBFX0RJUkVDVElWRSAoc3RyZWFtLCBuYW1lLCAiZnVu Y3Rpb24iKTsKICBBU01fT1VUUFVUX0xBQkVMIChzdHJlYW0sIG5hbWUpOwoKICBjZnVuLT5tYWNo aW5lLT5sYWJlbF9pc19hc3NlbWJsZWQgPSB0cnVlOwp9CgovKiBJbXBsZW1lbnQgUFJJTlRfUEFU Q0hBQkxFX0ZVTkNUSU9OX0VOVFJZLiAgKi8KCnZvaWQKYWFyY2g2NF9wcmludF9wYXRjaGFibGVf ZnVuY3Rpb25fZW50cnkgKEZJTEUgKmZpbGUsCgkJCQkJdW5zaWduZWQgSE9TVF9XSURFX0lOVCBw YXRjaF9hcmVhX3NpemUsCgkJCQkJYm9vbCByZWNvcmRfcCkKewogIGlmICghY2Z1bi0+bWFjaGlu ZS0+bGFiZWxfaXNfYXNzZW1ibGVkKQogICAgewogICAgICAvKiBFbWl0IHRoZSBwYXRjaGluZyBh cmVhIGJlZm9yZSB0aGUgZW50cnkgbGFiZWwsIGlmIGFueS4gICovCiAgICAgIGRlZmF1bHRfcHJp bnRfcGF0Y2hhYmxlX2Z1bmN0aW9uX2VudHJ5IChmaWxlLCBwYXRjaF9hcmVhX3NpemUsCgkJCQkJ ICAgICAgcmVjb3JkX3ApOwogICAgICByZXR1cm47CiAgICB9CgogIHJ0eCBwYSA9IGdlbl9wYXRj aGFibGVfYXJlYSAoR0VOX0lOVCAocGF0Y2hfYXJlYV9zaXplKSwKCQkJICAgICAgIEdFTl9JTlQg KHJlY29yZF9wKSk7CiAgYmFzaWNfYmxvY2sgYmIgPSBFTlRSWV9CTE9DS19QVFJfRk9SX0ZOIChj ZnVuKS0+bmV4dF9iYjsKCiAgaWYgKCFhYXJjaF9idGlfZW5hYmxlZCAoKQogICAgICB8fCBjZ3Jh cGhfbm9kZTo6Z2V0IChjZnVuLT5kZWNsKS0+b25seV9jYWxsZWRfZGlyZWN0bHlfcCAoKSkKICAg IHsKICAgICAgLyogRW1pdCB0aGUgcGF0Y2hhYmxlX2FyZWEgYXQgdGhlIGJlZ2lubmluZyBvZiB0 aGUgZnVuY3Rpb24uICAqLwogICAgICBydHhfaW5zbiAqaW5zbiA9IGVtaXRfaW5zbl9iZWZvcmUg KHBhLCBCQl9IRUFEIChiYikpOwogICAgICBJTlNOX0FERFJFU1NFU19ORVcgKGluc24sIC0xKTsK ICAgICAgcmV0dXJuOwogICAgfQoKICBydHhfaW5zbiAqaW5zbiA9IG5leHRfcmVhbF9ub25kZWJ1 Z19pbnNuIChnZXRfaW5zbnMgKCkpOwogIGlmICghaW5zbgogICAgICB8fCAhSU5TTl9QIChpbnNu KQogICAgICB8fCBHRVRfQ09ERSAoUEFUVEVSTiAoaW5zbikpICE9IFVOU1BFQ19WT0xBVElMRQog ICAgICB8fCBYSU5UIChQQVRURVJOIChpbnNuKSwgMSkgIT0gVU5TUEVDVl9CVElfQykKICAgIHsK ICAgICAgLyogRW1pdCBhIEJUSV9DLiAgKi8KICAgICAgaW5zbiA9IGVtaXRfaW5zbl9iZWZvcmUg KGdlbl9idGlfYyAoKSwgQkJfSEVBRCAoYmIpKTsKICAgIH0KCiAgLyogRW1pdCB0aGUgcGF0Y2hh YmxlX2FyZWEgYWZ0ZXIgQlRJX0MuICAqLwogIGluc24gPSBlbWl0X2luc25fYWZ0ZXIgKHBhLCBp bnNuKTsKICBJTlNOX0FERFJFU1NFU19ORVcgKGluc24sIC0xKTsKfQoKLyogT3V0cHV0IHBhdGNo YWJsZSBhcmVhLiAgKi8KCnZvaWQKYWFyY2g2NF9vdXRwdXRfcGF0Y2hhYmxlX2FyZWEgKHVuc2ln bmVkIGludCBwYXRjaF9hcmVhX3NpemUsIGJvb2wgcmVjb3JkX3ApCnsKICBkZWZhdWx0X3ByaW50 X3BhdGNoYWJsZV9mdW5jdGlvbl9lbnRyeSAoYXNtX291dF9maWxlLCBwYXRjaF9hcmVhX3NpemUs CgkJCQkJICByZWNvcmRfcCk7Cn0KCi8qIEltcGxlbWVudCBBU01fT1VUUFVUX0RFRl9GUk9NX0RF Q0xTLiAgT3V0cHV0IC52YXJpYW50X3BjcyBmb3IgYWxpYXNlcy4gICovCgp2b2lkCmFhcmNoNjRf YXNtX291dHB1dF9hbGlhcyAoRklMRSAqc3RyZWFtLCBjb25zdCB0cmVlIGRlY2wsIGNvbnN0IHRy ZWUgdGFyZ2V0KQp7CiAgY29uc3QgY2hhciAqbmFtZSA9IFhTVFIgKFhFWFAgKERFQ0xfUlRMIChk ZWNsKSwgMCksIDApOwogIGNvbnN0IGNoYXIgKnZhbHVlID0gSURFTlRJRklFUl9QT0lOVEVSICh0 YXJnZXQpOwogIGFhcmNoNjRfYXNtX291dHB1dF92YXJpYW50X3BjcyAoc3RyZWFtLCBkZWNsLCBu YW1lKTsKICBBU01fT1VUUFVUX0RFRiAoc3RyZWFtLCBuYW1lLCB2YWx1ZSk7Cn0KCi8qIEltcGxl bWVudCBBU01fT1VUUFVUX0VYVEVSTkFMLiAgT3V0cHV0IC52YXJpYW50X3BjcyBmb3IgdW5kZWZp bmVkCiAgIGZ1bmN0aW9uIHN5bWJvbCByZWZlcmVuY2VzLiAgKi8KCnZvaWQKYWFyY2g2NF9hc21f b3V0cHV0X2V4dGVybmFsIChGSUxFICpzdHJlYW0sIHRyZWUgZGVjbCwgY29uc3QgY2hhciogbmFt ZSkKewogIGRlZmF1bHRfZWxmX2FzbV9vdXRwdXRfZXh0ZXJuYWwgKHN0cmVhbSwgZGVjbCwgbmFt ZSk7CiAgYWFyY2g2NF9hc21fb3V0cHV0X3ZhcmlhbnRfcGNzIChzdHJlYW0sIGRlY2wsIG5hbWUp Owp9CgovKiBUcmlnZ2VyZWQgYWZ0ZXIgYSAuY2ZpX3N0YXJ0cHJvYyBkaXJlY3RpdmUgaXMgZW1p dHRlZCBpbnRvIHRoZSBhc3NlbWJseSBmaWxlLgogICBVc2VkIHRvIG91dHB1dCB0aGUgLmNmaV9i X2tleV9mcmFtZSBkaXJlY3RpdmUgd2hlbiBzaWduaW5nIHRoZSBjdXJyZW50CiAgIGZ1bmN0aW9u IHdpdGggdGhlIEIga2V5LiAgKi8KCnZvaWQKYWFyY2g2NF9wb3N0X2NmaV9zdGFydHByb2MgKEZJ TEUgKmYsIHRyZWUgaWdub3JlZCBBVFRSSUJVVEVfVU5VU0VEKQp7CiAgaWYgKGNmdW4tPm1hY2hp bmUtPmZyYW1lLmxhaWRfb3V0ICYmIGFhcmNoNjRfcmV0dXJuX2FkZHJlc3Nfc2lnbmluZ19lbmFi bGVkICgpCiAgICAgICYmIGFhcmNoX3JhX3NpZ25fa2V5ID09IEFBUkNIX0tFWV9CKQoJYXNtX2Zw cmludGYgKGYsICJcdC5jZmlfYl9rZXlfZnJhbWVcbiIpOwp9CgovKiBJbXBsZW1lbnRzIFRBUkdF VF9BU01fRklMRV9TVEFSVC4gIE91dHB1dCB0aGUgYXNzZW1ibHkgaGVhZGVyLiAgKi8KCnN0YXRp YyB2b2lkCmFhcmNoNjRfc3RhcnRfZmlsZSAodm9pZCkKewogIHN0cnVjdCBjbF90YXJnZXRfb3B0 aW9uICpkZWZhdWx0X29wdGlvbnMKICAgID0gVFJFRV9UQVJHRVRfT1BUSU9OICh0YXJnZXRfb3B0 aW9uX2RlZmF1bHRfbm9kZSk7CgogIGNvbnN0IHN0cnVjdCBwcm9jZXNzb3IgKmRlZmF1bHRfYXJj aAogICAgPSBhYXJjaDY0X2dldF9hcmNoIChkZWZhdWx0X29wdGlvbnMtPnhfc2VsZWN0ZWRfYXJj aCk7CiAgYXV0byBkZWZhdWx0X2lzYV9mbGFncyA9IGRlZmF1bHRfb3B0aW9ucy0+eF9hYXJjaDY0 X2FzbV9pc2FfZmxhZ3M7CiAgc3RkOjpzdHJpbmcgZXh0ZW5zaW9uCiAgICA9IGFhcmNoNjRfZ2V0 X2V4dGVuc2lvbl9zdHJpbmdfZm9yX2lzYV9mbGFncyAoZGVmYXVsdF9pc2FfZmxhZ3MsCgkJCQkJ CSAgZGVmYXVsdF9hcmNoLT5mbGFncyk7CgogICBhYXJjaDY0X2xhc3RfcHJpbnRlZF9hcmNoX3N0 cmluZyA9IGRlZmF1bHRfYXJjaC0+bmFtZSArIGV4dGVuc2lvbjsKICAgYWFyY2g2NF9sYXN0X3By aW50ZWRfdHVuZV9zdHJpbmcgPSAiIjsKICAgYXNtX2ZwcmludGYgKGFzbV9vdXRfZmlsZSwgIlx0 LmFyY2ggJXNcbiIsCgkJYWFyY2g2NF9sYXN0X3ByaW50ZWRfYXJjaF9zdHJpbmcuY19zdHIgKCkp OwoKICAgZGVmYXVsdF9maWxlX3N0YXJ0ICgpOwp9CgovKiBFbWl0IGxvYWQgZXhjbHVzaXZlLiAg Ki8KCnN0YXRpYyB2b2lkCmFhcmNoNjRfZW1pdF9sb2FkX2V4Y2x1c2l2ZSAobWFjaGluZV9tb2Rl IG1vZGUsIHJ0eCBydmFsLAoJCQkgICAgIHJ0eCBtZW0sIHJ0eCBtb2RlbF9ydHgpCnsKICBpZiAo bW9kZSA9PSBUSW1vZGUpCiAgICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X2xvYWRfZXhjbHVzaXZl X3BhaXIgKGdlbl9sb3dwYXJ0IChESW1vZGUsIHJ2YWwpLAoJCQkJCQlnZW5faGlnaHBhcnQgKERJ bW9kZSwgcnZhbCksCgkJCQkJCW1lbSwgbW9kZWxfcnR4KSk7CiAgZWxzZQogICAgZW1pdF9pbnNu IChnZW5fYWFyY2g2NF9sb2FkX2V4Y2x1c2l2ZSAobW9kZSwgcnZhbCwgbWVtLCBtb2RlbF9ydHgp KTsKfQoKLyogRW1pdCBzdG9yZSBleGNsdXNpdmUuICAqLwoKc3RhdGljIHZvaWQKYWFyY2g2NF9l bWl0X3N0b3JlX2V4Y2x1c2l2ZSAobWFjaGluZV9tb2RlIG1vZGUsIHJ0eCBidmFsLAoJCQkgICAg ICBydHggbWVtLCBydHggcnZhbCwgcnR4IG1vZGVsX3J0eCkKewogIGlmIChtb2RlID09IFRJbW9k ZSkKICAgIGVtaXRfaW5zbiAoZ2VuX2FhcmNoNjRfc3RvcmVfZXhjbHVzaXZlX3BhaXIKCSAgICAg ICAoYnZhbCwgbWVtLCBvcGVyYW5kX3N1YndvcmQgKHJ2YWwsIDAsIDAsIFRJbW9kZSksCgkJb3Bl cmFuZF9zdWJ3b3JkIChydmFsLCAxLCAwLCBUSW1vZGUpLCBtb2RlbF9ydHgpKTsKICBlbHNlCiAg ICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X3N0b3JlX2V4Y2x1c2l2ZSAobW9kZSwgYnZhbCwgbWVt LCBydmFsLCBtb2RlbF9ydHgpKTsKfQoKLyogTWFyayB0aGUgcHJldmlvdXMganVtcCBpbnN0cnVj dGlvbiBhcyB1bmxpa2VseS4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X2VtaXRfdW5saWtlbHlf anVtcCAocnR4IGluc24pCnsKICBydHhfaW5zbiAqanVtcCA9IGVtaXRfanVtcF9pbnNuIChpbnNu KTsKICBhZGRfcmVnX2JyX3Byb2Jfbm90ZSAoanVtcCwgcHJvZmlsZV9wcm9iYWJpbGl0eTo6dmVy eV91bmxpa2VseSAoKSk7Cn0KCi8qIFdlIHN0b3JlIHRoZSBuYW1lcyBvZiB0aGUgdmFyaW91cyBh dG9taWMgaGVscGVycyBpbiBhIDV4NSBhcnJheS4KICAgUmV0dXJuIHRoZSBsaWJjYWxsIGZ1bmN0 aW9uIGdpdmVuIE1PREUsIE1PREVMIGFuZCBOQU1FUy4gICovCgpydHgKYWFyY2g2NF9hdG9taWNf b29sX2Z1bmMobWFjaGluZV9tb2RlIG1vZGUsIHJ0eCBtb2RlbF9ydHgsCgkJCWNvbnN0IGF0b21p Y19vb2xfbmFtZXMgKm5hbWVzKQp7CiAgbWVtbW9kZWwgbW9kZWwgPSBtZW1tb2RlbF9mcm9tX2lu dCAoSU5UVkFMIChtb2RlbF9ydHgpKTsKICBpbnQgbW9kZV9pZHgsIG1vZGVsX2lkeDsKCiAgc3dp dGNoIChtb2RlKQogICAgewogICAgY2FzZSBFX1FJbW9kZToKICAgICAgbW9kZV9pZHggPSAwOwog ICAgICBicmVhazsKICAgIGNhc2UgRV9ISW1vZGU6CiAgICAgIG1vZGVfaWR4ID0gMTsKICAgICAg YnJlYWs7CiAgICBjYXNlIEVfU0ltb2RlOgogICAgICBtb2RlX2lkeCA9IDI7CiAgICAgIGJyZWFr OwogICAgY2FzZSBFX0RJbW9kZToKICAgICAgbW9kZV9pZHggPSAzOwogICAgICBicmVhazsKICAg IGNhc2UgRV9USW1vZGU6CiAgICAgIG1vZGVfaWR4ID0gNDsKICAgICAgYnJlYWs7CiAgICBkZWZh dWx0OgogICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CiAgICB9CgogIHN3aXRjaCAobW9kZWwpCiAg ICB7CiAgICBjYXNlIE1FTU1PREVMX1JFTEFYRUQ6CiAgICAgIG1vZGVsX2lkeCA9IDA7CiAgICAg IGJyZWFrOwogICAgY2FzZSBNRU1NT0RFTF9DT05TVU1FOgogICAgY2FzZSBNRU1NT0RFTF9BQ1FV SVJFOgogICAgICBtb2RlbF9pZHggPSAxOwogICAgICBicmVhazsKICAgIGNhc2UgTUVNTU9ERUxf UkVMRUFTRToKICAgICAgbW9kZWxfaWR4ID0gMjsKICAgICAgYnJlYWs7CiAgICBjYXNlIE1FTU1P REVMX0FDUV9SRUw6CiAgICBjYXNlIE1FTU1PREVMX1NFUV9DU1Q6CiAgICAgIG1vZGVsX2lkeCA9 IDM7CiAgICAgIGJyZWFrOwogICAgY2FzZSBNRU1NT0RFTF9TWU5DX0FDUVVJUkU6CiAgICBjYXNl IE1FTU1PREVMX1NZTkNfUkVMRUFTRToKICAgIGNhc2UgTUVNTU9ERUxfU1lOQ19TRVFfQ1NUOgog ICAgICBtb2RlbF9pZHggPSA0OwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGdjY191 bnJlYWNoYWJsZSAoKTsKICAgIH0KCiAgcmV0dXJuIGluaXRfb25lX2xpYmZ1bmNfdmlzaWJpbGl0 eSAobmFtZXMtPnN0clttb2RlX2lkeF1bbW9kZWxfaWR4XSwKCQkJCSAgICAgIFZJU0lCSUxJVFlf SElEREVOKTsKfQoKI2RlZmluZSBERUYwKEIsIE4pIFwKICB7ICJfX2FhcmNoNjRfIiAjQiAjTiAi X3JlbGF4IiwgXAogICAgIl9fYWFyY2g2NF8iICNCICNOICJfYWNxIiwgXAogICAgIl9fYWFyY2g2 NF8iICNCICNOICJfcmVsIiwgXAogICAgIl9fYWFyY2g2NF8iICNCICNOICJfYWNxX3JlbCIsIFwK ICAgICJfX2FhcmNoNjRfIiAjQiAjTiAiX3N5bmMiIH0KCiNkZWZpbmUgREVGNChCKSAgREVGMChC LCAxKSwgREVGMChCLCAyKSwgREVGMChCLCA0KSwgREVGMChCLCA4KSwgXAoJCSB7IE5VTEwsIE5V TEwsIE5VTEwsIE5VTEwgfQojZGVmaW5lIERFRjUoQikgIERFRjAoQiwgMSksIERFRjAoQiwgMiks IERFRjAoQiwgNCksIERFRjAoQiwgOCksIERFRjAoQiwgMTYpCgpzdGF0aWMgY29uc3QgYXRvbWlj X29vbF9uYW1lcyBhYXJjaDY0X29vbF9jYXNfbmFtZXMgPSB7IHsgREVGNShjYXMpIH0gfTsKY29u c3QgYXRvbWljX29vbF9uYW1lcyBhYXJjaDY0X29vbF9zd3BfbmFtZXMgPSB7IHsgREVGNChzd3Ap IH0gfTsKY29uc3QgYXRvbWljX29vbF9uYW1lcyBhYXJjaDY0X29vbF9sZGFkZF9uYW1lcyA9IHsg eyBERUY0KGxkYWRkKSB9IH07CmNvbnN0IGF0b21pY19vb2xfbmFtZXMgYWFyY2g2NF9vb2xfbGRz ZXRfbmFtZXMgPSB7IHsgREVGNChsZHNldCkgfSB9Owpjb25zdCBhdG9taWNfb29sX25hbWVzIGFh cmNoNjRfb29sX2xkY2xyX25hbWVzID0geyB7IERFRjQobGRjbHIpIH0gfTsKY29uc3QgYXRvbWlj X29vbF9uYW1lcyBhYXJjaDY0X29vbF9sZGVvcl9uYW1lcyA9IHsgeyBERUY0KGxkZW9yKSB9IH07 CgojdW5kZWYgREVGMAojdW5kZWYgREVGNAojdW5kZWYgREVGNQoKLyogRXhwYW5kIGEgY29tcGFy ZSBhbmQgc3dhcCBwYXR0ZXJuLiAgKi8KCnZvaWQKYWFyY2g2NF9leHBhbmRfY29tcGFyZV9hbmRf c3dhcCAocnR4IG9wZXJhbmRzW10pCnsKICBydHggYnZhbCwgcnZhbCwgbWVtLCBvbGR2YWwsIG5l d3ZhbCwgaXNfd2VhaywgbW9kX3MsIG1vZF9mLCB4LCBjY19yZWc7CiAgbWFjaGluZV9tb2RlIG1v ZGUsIHJfbW9kZTsKCiAgYnZhbCA9IG9wZXJhbmRzWzBdOwogIHJ2YWwgPSBvcGVyYW5kc1sxXTsK ICBtZW0gPSBvcGVyYW5kc1syXTsKICBvbGR2YWwgPSBvcGVyYW5kc1szXTsKICBuZXd2YWwgPSBv cGVyYW5kc1s0XTsKICBpc193ZWFrID0gb3BlcmFuZHNbNV07CiAgbW9kX3MgPSBvcGVyYW5kc1s2 XTsKICBtb2RfZiA9IG9wZXJhbmRzWzddOwogIG1vZGUgPSBHRVRfTU9ERSAobWVtKTsKCiAgLyog Tm9ybWFsbHkgdGhlIHN1Y2MgbWVtb3J5IG1vZGVsIG11c3QgYmUgc3Ryb25nZXIgdGhhbiBmYWls LCBidXQgaW4gdGhlCiAgICAgdW5saWtlbHkgZXZlbnQgb2YgZmFpbCBiZWluZyBBQ1FVSVJFIGFu ZCBzdWNjIGJlaW5nIFJFTEVBU0Ugd2UgbmVlZCB0bwogICAgIHByb21vdGUgc3VjYyB0byBBQ1Ff UkVMIHNvIHRoYXQgd2UgZG9uJ3QgbG9zZSB0aGUgYWNxdWlyZSBzZW1hbnRpY3MuICAqLwogIGlm IChpc19tbV9hY3F1aXJlIChtZW1tb2RlbF9mcm9tX2ludCAoSU5UVkFMIChtb2RfZikpKQogICAg ICAmJiBpc19tbV9yZWxlYXNlIChtZW1tb2RlbF9mcm9tX2ludCAoSU5UVkFMIChtb2RfcykpKSkK ICAgIG1vZF9zID0gR0VOX0lOVCAoTUVNTU9ERUxfQUNRX1JFTCk7CgogIHJfbW9kZSA9IG1vZGU7 CiAgaWYgKG1vZGUgPT0gUUltb2RlIHx8IG1vZGUgPT0gSEltb2RlKQogICAgewogICAgICByX21v ZGUgPSBTSW1vZGU7CiAgICAgIHJ2YWwgPSBnZW5fcmVnX3J0eCAocl9tb2RlKTsKICAgIH0KCiAg aWYgKFRBUkdFVF9MU0UpCiAgICB7CiAgICAgIC8qIFRoZSBDQVMgaW5zbiByZXF1aXJlcyBvbGR2 YWwgYW5kIHJ2YWwgb3ZlcmxhcCwgYnV0IHdlIG5lZWQgdG8KCSBoYXZlIGEgY29weSBvZiBvbGR2 YWwgc2F2ZWQgYWNyb3NzIHRoZSBvcGVyYXRpb24gdG8gdGVsbCBpZgoJIHRoZSBvcGVyYXRpb24g aXMgc3VjY2Vzc2Z1bC4gICovCiAgICAgIGlmIChyZWdfb3ZlcmxhcF9tZW50aW9uZWRfcCAocnZh bCwgb2xkdmFsKSkKICAgICAgICBydmFsID0gY29weV90b19tb2RlX3JlZyAocl9tb2RlLCBvbGR2 YWwpOwogICAgICBlbHNlCgllbWl0X21vdmVfaW5zbiAocnZhbCwgZ2VuX2xvd3BhcnQgKHJfbW9k ZSwgb2xkdmFsKSk7CgogICAgICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X2NvbXBhcmVfYW5kX3N3 YXBfbHNlIChtb2RlLCBydmFsLCBtZW0sCgkJCQkJCSAgIG5ld3ZhbCwgbW9kX3MpKTsKICAgICAg Y2NfcmVnID0gYWFyY2g2NF9nZW5fY29tcGFyZV9yZWdfbWF5YmVfemUgKE5FLCBydmFsLCBvbGR2 YWwsIG1vZGUpOwogICAgfQogIGVsc2UgaWYgKFRBUkdFVF9PVVRMSU5FX0FUT01JQ1MpCiAgICB7 CiAgICAgIC8qIE9sZHZhbCBtdXN0IHNhdGlzZnkgY29tcGFyZSBhZnRlcndhcmQuICAqLwogICAg ICBpZiAoIWFhcmNoNjRfcGx1c19vcGVyYW5kIChvbGR2YWwsIG1vZGUpKQoJb2xkdmFsID0gZm9y Y2VfcmVnIChtb2RlLCBvbGR2YWwpOwogICAgICBydHggZnVuYyA9IGFhcmNoNjRfYXRvbWljX29v bF9mdW5jIChtb2RlLCBtb2RfcywgJmFhcmNoNjRfb29sX2Nhc19uYW1lcyk7CiAgICAgIHJ2YWwg PSBlbWl0X2xpYnJhcnlfY2FsbF92YWx1ZSAoZnVuYywgTlVMTF9SVFgsIExDVF9OT1JNQUwsIHJf bW9kZSwKCQkJCSAgICAgIG9sZHZhbCwgbW9kZSwgbmV3dmFsLCBtb2RlLAoJCQkJICAgICAgWEVY UCAobWVtLCAwKSwgUG1vZGUpOwogICAgICBjY19yZWcgPSBhYXJjaDY0X2dlbl9jb21wYXJlX3Jl Z19tYXliZV96ZSAoTkUsIHJ2YWwsIG9sZHZhbCwgbW9kZSk7CiAgICB9CiAgZWxzZQogICAgewog ICAgICAvKiBUaGUgb2xkdmFsIHByZWRpY2F0ZSB2YXJpZXMgYnkgbW9kZS4gIFRlc3QgaXQgYW5k IGZvcmNlIHRvIHJlZy4gICovCiAgICAgIGluc25fY29kZSBjb2RlID0gY29kZV9mb3JfYWFyY2g2 NF9jb21wYXJlX2FuZF9zd2FwIChtb2RlKTsKICAgICAgaWYgKCFpbnNuX2RhdGFbY29kZV0ub3Bl cmFuZFsyXS5wcmVkaWNhdGUgKG9sZHZhbCwgbW9kZSkpCglvbGR2YWwgPSBmb3JjZV9yZWcgKG1v ZGUsIG9sZHZhbCk7CgogICAgICBlbWl0X2luc24gKEdFTl9GQ04gKGNvZGUpIChydmFsLCBtZW0s IG9sZHZhbCwgbmV3dmFsLAoJCQkJIGlzX3dlYWssIG1vZF9zLCBtb2RfZikpOwogICAgICBjY19y ZWcgPSBnZW5fcnR4X1JFRyAoQ0Ntb2RlLCBDQ19SRUdOVU0pOwogICAgfQoKICBpZiAocl9tb2Rl ICE9IG1vZGUpCiAgICBydmFsID0gZ2VuX2xvd3BhcnQgKG1vZGUsIHJ2YWwpOwogIGVtaXRfbW92 ZV9pbnNuIChvcGVyYW5kc1sxXSwgcnZhbCk7CgogIHggPSBnZW5fcnR4X0VRIChTSW1vZGUsIGNj X3JlZywgY29uc3QwX3J0eCk7CiAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAoYnZhbCwgeCkpOwp9 CgovKiBFbWl0IGEgYmFycmllciwgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgbWVtb3J5IG1vZGVs IE1PREVMLCBhdCB0aGUgZW5kIG9mIGEKICAgc2VxdWVuY2UgaW1wbGVtZW50aW5nIGFuIGF0b21p YyBvcGVyYXRpb24uICAqLwoKc3RhdGljIHZvaWQKYWFyY2g2NF9lbWl0X3Bvc3RfYmFycmllciAo ZW51bSBtZW1tb2RlbCBtb2RlbCkKewogIGNvbnN0IGVudW0gbWVtbW9kZWwgYmFzZV9tb2RlbCA9 IG1lbW1vZGVsX2Jhc2UgKG1vZGVsKTsKCiAgaWYgKGlzX21tX3N5bmMgKG1vZGVsKQogICAgICAm JiAoYmFzZV9tb2RlbCA9PSBNRU1NT0RFTF9BQ1FVSVJFCgkgIHx8IGJhc2VfbW9kZWwgPT0gTUVN TU9ERUxfQUNRX1JFTAoJICB8fCBiYXNlX21vZGVsID09IE1FTU1PREVMX1NFUV9DU1QpKQogICAg ewogICAgICBlbWl0X2luc24gKGdlbl9tZW1fdGhyZWFkX2ZlbmNlIChHRU5fSU5UIChNRU1NT0RF TF9TRVFfQ1NUKSkpOwogICAgfQp9CgovKiBTcGxpdCBhIGNvbXBhcmUgYW5kIHN3YXAgcGF0dGVy bi4gICovCgp2b2lkCmFhcmNoNjRfc3BsaXRfY29tcGFyZV9hbmRfc3dhcCAocnR4IG9wZXJhbmRz W10pCnsKICAvKiBTcGxpdCBhZnRlciBwcm9sb2cvZXBpbG9nIHRvIGF2b2lkIGludGVyYWN0aW9u cyB3aXRoIHNocmlua3dyYXBwaW5nLiAgKi8KICBnY2NfYXNzZXJ0IChlcGlsb2d1ZV9jb21wbGV0 ZWQpOwoKICBydHggcnZhbCwgbWVtLCBvbGR2YWwsIG5ld3ZhbCwgc2NyYXRjaCwgeCwgbW9kZWxf cnR4OwogIG1hY2hpbmVfbW9kZSBtb2RlOwogIGJvb2wgaXNfd2VhazsKICBydHhfY29kZV9sYWJl bCAqbGFiZWwxLCAqbGFiZWwyOwogIGVudW0gbWVtbW9kZWwgbW9kZWw7CgogIHJ2YWwgPSBvcGVy YW5kc1swXTsKICBtZW0gPSBvcGVyYW5kc1sxXTsKICBvbGR2YWwgPSBvcGVyYW5kc1syXTsKICBu ZXd2YWwgPSBvcGVyYW5kc1szXTsKICBpc193ZWFrID0gKG9wZXJhbmRzWzRdICE9IGNvbnN0MF9y dHgpOwogIG1vZGVsX3J0eCA9IG9wZXJhbmRzWzVdOwogIHNjcmF0Y2ggPSBvcGVyYW5kc1s3XTsK ICBtb2RlID0gR0VUX01PREUgKG1lbSk7CiAgbW9kZWwgPSBtZW1tb2RlbF9mcm9tX2ludCAoSU5U VkFMIChtb2RlbF9ydHgpKTsKCiAgLyogV2hlbiBPTERWQUwgaXMgemVybyBhbmQgd2Ugd2FudCB0 aGUgc3Ryb25nIHZlcnNpb24gd2UgY2FuIGVtaXQgYSB0aWdodGVyCiAgICBsb29wOgogICAgLmxh YmVsMToKCUxEW0FdWFIJcnZhbCwgW21lbV0KCUNCTloJcnZhbCwgLmxhYmVsMgoJU1RbTF1YUglz Y3JhdGNoLCBuZXd2YWwsIFttZW1dCglDQk5aCXNjcmF0Y2gsIC5sYWJlbDEKICAgIC5sYWJlbDI6 CglDTVAJcnZhbCwgMC4gICovCiAgYm9vbCBzdHJvbmdfemVyb19wID0gKCFpc193ZWFrICYmICFh YXJjaDY0X3RyYWNrX3NwZWN1bGF0aW9uICYmCgkJCW9sZHZhbCA9PSBjb25zdDBfcnR4ICYmIG1v ZGUgIT0gVEltb2RlKTsKCiAgbGFiZWwxID0gTlVMTDsKICBpZiAoIWlzX3dlYWspCiAgICB7CiAg ICAgIGxhYmVsMSA9IGdlbl9sYWJlbF9ydHggKCk7CiAgICAgIGVtaXRfbGFiZWwgKGxhYmVsMSk7 CiAgICB9CiAgbGFiZWwyID0gZ2VuX2xhYmVsX3J0eCAoKTsKCiAgLyogVGhlIGluaXRpYWwgbG9h ZCBjYW4gYmUgcmVsYXhlZCBmb3IgYSBfX3N5bmMgb3BlcmF0aW9uIHNpbmNlIGEgZmluYWwKICAg ICBiYXJyaWVyIHdpbGwgYmUgZW1pdHRlZCB0byBzdG9wIGNvZGUgaG9pc3RpbmcuICAqLwogIGlm IChpc19tbV9zeW5jIChtb2RlbCkpCiAgICBhYXJjaDY0X2VtaXRfbG9hZF9leGNsdXNpdmUgKG1v ZGUsIHJ2YWwsIG1lbSwgR0VOX0lOVCAoTUVNTU9ERUxfUkVMQVhFRCkpOwogIGVsc2UKICAgIGFh cmNoNjRfZW1pdF9sb2FkX2V4Y2x1c2l2ZSAobW9kZSwgcnZhbCwgbWVtLCBtb2RlbF9ydHgpOwoK ICBpZiAoc3Ryb25nX3plcm9fcCkKICAgIHggPSBnZW5fcnR4X05FIChWT0lEbW9kZSwgcnZhbCwg Y29uc3QwX3J0eCk7CiAgZWxzZQogICAgewogICAgICBydHggY2NfcmVnID0gYWFyY2g2NF9nZW5f Y29tcGFyZV9yZWdfbWF5YmVfemUgKE5FLCBydmFsLCBvbGR2YWwsIG1vZGUpOwogICAgICB4ID0g Z2VuX3J0eF9ORSAoVk9JRG1vZGUsIGNjX3JlZywgY29uc3QwX3J0eCk7CiAgICB9CiAgeCA9IGdl bl9ydHhfSUZfVEhFTl9FTFNFIChWT0lEbW9kZSwgeCwKCQkJICAgIGdlbl9ydHhfTEFCRUxfUkVG IChQbW9kZSwgbGFiZWwyKSwgcGNfcnR4KTsKICBhYXJjaDY0X2VtaXRfdW5saWtlbHlfanVtcCAo Z2VuX3J0eF9TRVQgKHBjX3J0eCwgeCkpOwoKICBhYXJjaDY0X2VtaXRfc3RvcmVfZXhjbHVzaXZl IChtb2RlLCBzY3JhdGNoLCBtZW0sIG5ld3ZhbCwgbW9kZWxfcnR4KTsKCiAgaWYgKCFpc193ZWFr KQogICAgewogICAgICBpZiAoYWFyY2g2NF90cmFja19zcGVjdWxhdGlvbikKCXsKCSAgLyogRW1p dCBhbiBleHBsaWNpdCBjb21wYXJlIGluc3RydWN0aW9uLCBzbyB0aGF0IHdlIGNhbiBjb3JyZWN0 bHkKCSAgICAgdHJhY2sgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCgkgIHJ0eCBjY19yZWcgPSBh YXJjaDY0X2dlbl9jb21wYXJlX3JlZyAoTkUsIHNjcmF0Y2gsIGNvbnN0MF9ydHgpOwoJICB4ID0g Z2VuX3J0eF9ORSAoR0VUX01PREUgKGNjX3JlZyksIGNjX3JlZywgY29uc3QwX3J0eCk7Cgl9CiAg ICAgIGVsc2UKCXggPSBnZW5fcnR4X05FIChWT0lEbW9kZSwgc2NyYXRjaCwgY29uc3QwX3J0eCk7 CgogICAgICB4ID0gZ2VuX3J0eF9JRl9USEVOX0VMU0UgKFZPSURtb2RlLCB4LAoJCQkJZ2VuX3J0 eF9MQUJFTF9SRUYgKFBtb2RlLCBsYWJlbDEpLCBwY19ydHgpOwogICAgICBhYXJjaDY0X2VtaXRf dW5saWtlbHlfanVtcCAoZ2VuX3J0eF9TRVQgKHBjX3J0eCwgeCkpOwogICAgfQogIGVsc2UKICAg IGFhcmNoNjRfZ2VuX2NvbXBhcmVfcmVnIChORSwgc2NyYXRjaCwgY29uc3QwX3J0eCk7CgogIGVt aXRfbGFiZWwgKGxhYmVsMik7CgogIC8qIElmIHdlIHVzZWQgYSBDQk5aIGluIHRoZSBleGNoYW5n ZSBsb29wIGVtaXQgYW4gZXhwbGljaXQgY29tcGFyZSB3aXRoIFJWQUwKICAgICB0byBzZXQgdGhl IGNvbmRpdGlvbiBmbGFncy4gIElmIHRoaXMgaXMgbm90IHVzZWQgaXQgd2lsbCBiZSByZW1vdmVk IGJ5CiAgICAgbGF0ZXIgcGFzc2VzLiAgKi8KICBpZiAoc3Ryb25nX3plcm9fcCkKICAgIGFhcmNo NjRfZ2VuX2NvbXBhcmVfcmVnIChORSwgcnZhbCwgY29uc3QwX3J0eCk7CgogIC8qIEVtaXQgYW55 IGZpbmFsIGJhcnJpZXIgbmVlZGVkIGZvciBhIF9fc3luYyBvcGVyYXRpb24uICAqLwogIGlmIChp c19tbV9zeW5jIChtb2RlbCkpCiAgICBhYXJjaDY0X2VtaXRfcG9zdF9iYXJyaWVyIChtb2RlbCk7 Cn0KCi8qIFNwbGl0IGFuIGF0b21pYyBvcGVyYXRpb24uICAqLwoKdm9pZAphYXJjaDY0X3NwbGl0 X2F0b21pY19vcCAoZW51bSBydHhfY29kZSBjb2RlLCBydHggb2xkX291dCwgcnR4IG5ld19vdXQs IHJ0eCBtZW0sCgkJCSBydHggdmFsdWUsIHJ0eCBtb2RlbF9ydHgsIHJ0eCBjb25kKQp7CiAgLyog U3BsaXQgYWZ0ZXIgcHJvbG9nL2VwaWxvZyB0byBhdm9pZCBpbnRlcmFjdGlvbnMgd2l0aCBzaHJp bmt3cmFwcGluZy4gICovCiAgZ2NjX2Fzc2VydCAoZXBpbG9ndWVfY29tcGxldGVkKTsKCiAgbWFj aGluZV9tb2RlIG1vZGUgPSBHRVRfTU9ERSAobWVtKTsKICBtYWNoaW5lX21vZGUgd21vZGUgPSAo bW9kZSA9PSBESW1vZGUgPyBESW1vZGUgOiBTSW1vZGUpOwogIGNvbnN0IGVudW0gbWVtbW9kZWwg bW9kZWwgPSBtZW1tb2RlbF9mcm9tX2ludCAoSU5UVkFMIChtb2RlbF9ydHgpKTsKICBjb25zdCBi b29sIGlzX3N5bmMgPSBpc19tbV9zeW5jIChtb2RlbCk7CiAgcnR4X2NvZGVfbGFiZWwgKmxhYmVs OwogIHJ0eCB4OwoKICAvKiBTcGxpdCB0aGUgYXRvbWljIG9wZXJhdGlvbiBpbnRvIGEgc2VxdWVu Y2UuICAqLwogIGxhYmVsID0gZ2VuX2xhYmVsX3J0eCAoKTsKICBlbWl0X2xhYmVsIChsYWJlbCk7 CgogIGlmIChuZXdfb3V0KQogICAgbmV3X291dCA9IGdlbl9sb3dwYXJ0ICh3bW9kZSwgbmV3X291 dCk7CiAgaWYgKG9sZF9vdXQpCiAgICBvbGRfb3V0ID0gZ2VuX2xvd3BhcnQgKHdtb2RlLCBvbGRf b3V0KTsKICBlbHNlCiAgICBvbGRfb3V0ID0gbmV3X291dDsKICB2YWx1ZSA9IHNpbXBsaWZ5X2dl bl9zdWJyZWcgKHdtb2RlLCB2YWx1ZSwgbW9kZSwgMCk7CgogIC8qIFRoZSBpbml0aWFsIGxvYWQg Y2FuIGJlIHJlbGF4ZWQgZm9yIGEgX19zeW5jIG9wZXJhdGlvbiBzaW5jZSBhIGZpbmFsCiAgICAg YmFycmllciB3aWxsIGJlIGVtaXR0ZWQgdG8gc3RvcCBjb2RlIGhvaXN0aW5nLiAgKi8KIGlmIChp c19zeW5jKQogICAgYWFyY2g2NF9lbWl0X2xvYWRfZXhjbHVzaXZlIChtb2RlLCBvbGRfb3V0LCBt ZW0sCgkJCQkgR0VOX0lOVCAoTUVNTU9ERUxfUkVMQVhFRCkpOwogIGVsc2UKICAgIGFhcmNoNjRf ZW1pdF9sb2FkX2V4Y2x1c2l2ZSAobW9kZSwgb2xkX291dCwgbWVtLCBtb2RlbF9ydHgpOwoKICBz d2l0Y2ggKGNvZGUpCiAgICB7CiAgICBjYXNlIFNFVDoKICAgICAgbmV3X291dCA9IHZhbHVlOwog ICAgICBicmVhazsKCiAgICBjYXNlIE5PVDoKICAgICAgeCA9IGdlbl9ydHhfQU5EICh3bW9kZSwg b2xkX291dCwgdmFsdWUpOwogICAgICBlbWl0X2luc24gKGdlbl9ydHhfU0VUIChuZXdfb3V0LCB4 KSk7CiAgICAgIHggPSBnZW5fcnR4X05PVCAod21vZGUsIG5ld19vdXQpOwogICAgICBlbWl0X2lu c24gKGdlbl9ydHhfU0VUIChuZXdfb3V0LCB4KSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTUlO VVM6CiAgICAgIGlmIChDT05TVF9JTlRfUCAodmFsdWUpKQoJewoJICB2YWx1ZSA9IEdFTl9JTlQg KC1VSU5UVkFMICh2YWx1ZSkpOwoJICBjb2RlID0gUExVUzsKCX0KICAgICAgLyogRmFsbCB0aHJv dWdoLiAgKi8KCiAgICBkZWZhdWx0OgogICAgICB4ID0gZ2VuX3J0eF9mbXRfZWUgKGNvZGUsIHdt b2RlLCBvbGRfb3V0LCB2YWx1ZSk7CiAgICAgIGVtaXRfaW5zbiAoZ2VuX3J0eF9TRVQgKG5ld19v dXQsIHgpKTsKICAgICAgYnJlYWs7CiAgICB9CgogIGFhcmNoNjRfZW1pdF9zdG9yZV9leGNsdXNp dmUgKG1vZGUsIGNvbmQsIG1lbSwKCQkJCWdlbl9sb3dwYXJ0IChtb2RlLCBuZXdfb3V0KSwgbW9k ZWxfcnR4KTsKCiAgaWYgKGFhcmNoNjRfdHJhY2tfc3BlY3VsYXRpb24pCiAgICB7CiAgICAgIC8q IEVtaXQgYW4gZXhwbGljaXQgY29tcGFyZSBpbnN0cnVjdGlvbiwgc28gdGhhdCB3ZSBjYW4gY29y cmVjdGx5CgkgdHJhY2sgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCiAgICAgIHJ0eCBjY19yZWcg PSBhYXJjaDY0X2dlbl9jb21wYXJlX3JlZyAoTkUsIGNvbmQsIGNvbnN0MF9ydHgpOwogICAgICB4 ID0gZ2VuX3J0eF9ORSAoR0VUX01PREUgKGNjX3JlZyksIGNjX3JlZywgY29uc3QwX3J0eCk7CiAg ICB9CiAgZWxzZQogICAgeCA9IGdlbl9ydHhfTkUgKFZPSURtb2RlLCBjb25kLCBjb25zdDBfcnR4 KTsKCiAgeCA9IGdlbl9ydHhfSUZfVEhFTl9FTFNFIChWT0lEbW9kZSwgeCwKCQkJICAgIGdlbl9y dHhfTEFCRUxfUkVGIChQbW9kZSwgbGFiZWwpLCBwY19ydHgpOwogIGFhcmNoNjRfZW1pdF91bmxp a2VseV9qdW1wIChnZW5fcnR4X1NFVCAocGNfcnR4LCB4KSk7CgogIC8qIEVtaXQgYW55IGZpbmFs IGJhcnJpZXIgbmVlZGVkIGZvciBhIF9fc3luYyBvcGVyYXRpb24uICAqLwogIGlmIChpc19zeW5j KQogICAgYWFyY2g2NF9lbWl0X3Bvc3RfYmFycmllciAobW9kZWwpOwp9CgpzdGF0aWMgdm9pZAph YXJjaDY0X2luaXRfbGliZnVuY3MgKHZvaWQpCnsKICAgLyogSGFsZi1wcmVjaXNpb24gZmxvYXQg b3BlcmF0aW9ucy4gIFRoZSBjb21waWxlciBoYW5kbGVzIGFsbCBvcGVyYXRpb25zCiAgICAgd2l0 aCBOVUxMIGxpYmZ1bmNzIGJ5IGNvbnZlcnRpbmcgdG8gU0Ztb2RlLiAgKi8KCiAgLyogQ29udmVy c2lvbnMuICAqLwogIHNldF9jb252X2xpYmZ1bmMgKHRydW5jX29wdGFiLCBIRm1vZGUsIFNGbW9k ZSwgIl9fZ251X2YyaF9pZWVlIik7CiAgc2V0X2NvbnZfbGliZnVuYyAoc2V4dF9vcHRhYiwgU0Zt b2RlLCBIRm1vZGUsICJfX2dudV9oMmZfaWVlZSIpOwoKICAvKiBBcml0aG1ldGljLiAgKi8KICBz ZXRfb3B0YWJfbGliZnVuYyAoYWRkX29wdGFiLCBIRm1vZGUsIE5VTEwpOwogIHNldF9vcHRhYl9s aWJmdW5jIChzZGl2X29wdGFiLCBIRm1vZGUsIE5VTEwpOwogIHNldF9vcHRhYl9saWJmdW5jIChz bXVsX29wdGFiLCBIRm1vZGUsIE5VTEwpOwogIHNldF9vcHRhYl9saWJmdW5jIChuZWdfb3B0YWIs IEhGbW9kZSwgTlVMTCk7CiAgc2V0X29wdGFiX2xpYmZ1bmMgKHN1Yl9vcHRhYiwgSEZtb2RlLCBO VUxMKTsKCiAgLyogQ29tcGFyaXNvbnMuICAqLwogIHNldF9vcHRhYl9saWJmdW5jIChlcV9vcHRh YiwgSEZtb2RlLCBOVUxMKTsKICBzZXRfb3B0YWJfbGliZnVuYyAobmVfb3B0YWIsIEhGbW9kZSwg TlVMTCk7CiAgc2V0X29wdGFiX2xpYmZ1bmMgKGx0X29wdGFiLCBIRm1vZGUsIE5VTEwpOwogIHNl dF9vcHRhYl9saWJmdW5jIChsZV9vcHRhYiwgSEZtb2RlLCBOVUxMKTsKICBzZXRfb3B0YWJfbGli ZnVuYyAoZ2Vfb3B0YWIsIEhGbW9kZSwgTlVMTCk7CiAgc2V0X29wdGFiX2xpYmZ1bmMgKGd0X29w dGFiLCBIRm1vZGUsIE5VTEwpOwogIHNldF9vcHRhYl9saWJmdW5jICh1bm9yZF9vcHRhYiwgSEZt b2RlLCBOVUxMKTsKfQoKLyogVGFyZ2V0IGhvb2sgZm9yIGNfbW9kZV9mb3Jfc3VmZml4LiAgKi8K c3RhdGljIG1hY2hpbmVfbW9kZQphYXJjaDY0X2NfbW9kZV9mb3Jfc3VmZml4IChjaGFyIHN1ZmZp eCkKewogIGlmIChzdWZmaXggPT0gJ3EnKQogICAgcmV0dXJuIFRGbW9kZTsKCiAgcmV0dXJuIFZP SURtb2RlOwp9CgovKiBXZSBjYW4gb25seSByZXByZXNlbnQgZmxvYXRpbmcgcG9pbnQgY29uc3Rh bnRzIHdoaWNoIHdpbGwgZml0IGluCiAgICJxdWFydGVyLXByZWNpc2lvbiIgdmFsdWVzLiAgVGhl c2UgdmFsdWVzIGFyZSBjaGFyYWN0ZXJpc2VkIGJ5CiAgIGEgc2lnbiBiaXQsIGEgNC1iaXQgbWFu dGlzc2EgYW5kIGEgMy1iaXQgZXhwb25lbnQuICBBbmQgYXJlIGdpdmVuCiAgIGJ5OgoKICAgKC0x KV5zICogKG4vMTYpICogMl5yCgogICBXaGVyZToKICAgICAncycgaXMgdGhlIHNpZ24gYml0Lgog ICAgICduJyBpcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAxNiA8PSBuIDw9IDMxLgogICAgICdy JyBpcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAtMyA8PSByIDw9IDQuICAqLwoKLyogUmV0dXJu IHRydWUgaWZmIFggY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGEgcXVhcnRlci1wcmVjaXNpb24KICAg ZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIG9wZXJhbmQgWC4gIE5vdGUsIHdlIGNhbm5vdCByZXBy ZXNlbnQgMC4wLiAgKi8KYm9vbAphYXJjaDY0X2Zsb2F0X2NvbnN0X3JlcHJlc2VudGFibGVfcCAo cnR4IHgpCnsKICAvKiBUaGlzIHJlcHJlc2VudHMgb3VyIGN1cnJlbnQgdmlldyBvZiBob3cgbWFu eSBiaXRzCiAgICAgbWFrZSB1cCB0aGUgbWFudGlzc2EuICAqLwogIGludCBwb2ludF9wb3MgPSAy ICogSE9TVF9CSVRTX1BFUl9XSURFX0lOVCAtIDE7CiAgaW50IGV4cG9uZW50OwogIHVuc2lnbmVk IEhPU1RfV0lERV9JTlQgbWFudGlzc2EsIG1hc2s7CiAgUkVBTF9WQUxVRV9UWVBFIHIsIG07CiAg Ym9vbCBmYWlsOwoKICB4ID0gdW53cmFwX2NvbnN0X3ZlY19kdXBsaWNhdGUgKHgpOwogIGlmICgh Q09OU1RfRE9VQkxFX1AgKHgpKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoR0VUX01PREUgKHgp ID09IFZPSURtb2RlCiAgICAgIHx8IChHRVRfTU9ERSAoeCkgPT0gSEZtb2RlICYmICFUQVJHRVRf RlBfRjE2SU5TVCkpCiAgICByZXR1cm4gZmFsc2U7CgogIHIgPSAqQ09OU1RfRE9VQkxFX1JFQUxf VkFMVUUgKHgpOwoKICAvKiBXZSBjYW5ub3QgcmVwcmVzZW50IGluZmluaXRpZXMsIE5hTnMgb3Ig Ky8temVyby4gIFdlIHdvbid0CiAgICAga25vdyBpZiB3ZSBoYXZlICt6ZXJvIHVudGlsIHdlIGFu YWx5c2UgdGhlIG1hbnRpc3NhLCBidXQgd2UKICAgICBjYW4gcmVqZWN0IHRoZSBvdGhlciBpbnZh bGlkIHZhbHVlcy4gICovCiAgaWYgKFJFQUxfVkFMVUVfSVNJTkYgKHIpIHx8IFJFQUxfVkFMVUVf SVNOQU4gKHIpCiAgICAgIHx8IFJFQUxfVkFMVUVfTUlOVVNfWkVSTyAocikpCiAgICByZXR1cm4g ZmFsc2U7CgogIC8qIEV4dHJhY3QgZXhwb25lbnQuICAqLwogIHIgPSByZWFsX3ZhbHVlX2FicyAo JnIpOwogIGV4cG9uZW50ID0gUkVBTF9FWFAgKCZyKTsKCiAgLyogRm9yIHRoZSBtYW50aXNzYSwg d2UgZXhwYW5kIGludG8gdHdvIEhPU1RfV0lERV9JTlRTLCBhcGFydCBmcm9tIHRoZQogICAgIGhp Z2hlc3QgKHNpZ24pIGJpdCwgd2l0aCBhIGZpeGVkIGJpbmFyeSBwb2ludCBhdCBiaXQgcG9pbnRf cG9zLgogICAgIG0xIGhvbGRzIHRoZSBsb3cgcGFydCBvZiB0aGUgbWFudGlzc2EsIG0yIHRoZSBo aWdoIHBhcnQuCiAgICAgV0FSTklORzogSWYgd2UgZXZlciBoYXZlIGEgcmVwcmVzZW50YXRpb24g dXNpbmcgbW9yZSB0aGFuIDIgKiBIX1dfSSAtIDEKICAgICBiaXRzIGZvciB0aGUgbWFudGlzc2Es IHRoaXMgY2FuIGZhaWwgKGxvdyBiaXRzIHdpbGwgYmUgbG9zdCkuICAqLwogIHJlYWxfbGRleHAg KCZtLCAmciwgcG9pbnRfcG9zIC0gZXhwb25lbnQpOwogIHdpZGVfaW50IHcgPSByZWFsX3RvX2lu dGVnZXIgKCZtLCAmZmFpbCwgSE9TVF9CSVRTX1BFUl9XSURFX0lOVCAqIDIpOwoKICAvKiBJZiB0 aGUgbG93IHBhcnQgb2YgdGhlIG1hbnRpc3NhIGhhcyBiaXRzIHNldCB3ZSBjYW5ub3QgcmVwcmVz ZW50CiAgICAgdGhlIHZhbHVlLiAgKi8KICBpZiAody51bG93ICgpICE9IDApCiAgICByZXR1cm4g ZmFsc2U7CiAgLyogV2UgaGF2ZSByZWplY3RlZCB0aGUgbG93ZXIgSE9TVF9XSURFX0lOVCwgc28g dXBkYXRlIG91cgogICAgIHVuZGVyc3RhbmRpbmcgb2YgaG93IG1hbnkgYml0cyBsaWUgaW4gdGhl IG1hbnRpc3NhIGFuZAogICAgIGxvb2sgb25seSBhdCB0aGUgaGlnaCBIT1NUX1dJREVfSU5ULiAg Ki8KICBtYW50aXNzYSA9IHcuZWx0ICgxKTsKICBwb2ludF9wb3MgLT0gSE9TVF9CSVRTX1BFUl9X SURFX0lOVDsKCiAgLyogV2UgY2FuIG9ubHkgcmVwcmVzZW50IHZhbHVlcyB3aXRoIGEgbWFudGlz c2Egb2YgdGhlIGZvcm0gMS54eHh4LiAgKi8KICBtYXNrID0gKCh1bnNpZ25lZCBIT1NUX1dJREVf SU5UKTEgPDwgKHBvaW50X3BvcyAtIDUpKSAtIDE7CiAgaWYgKChtYW50aXNzYSAmIG1hc2spICE9 IDApCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIEhhdmluZyBmaWx0ZXJlZCB1bnJlcHJlc2VudGFi bGUgdmFsdWVzLCB3ZSBtYXkgbm93IHJlbW92ZSBhbGwKICAgICBidXQgdGhlIGhpZ2hlc3QgNSBi aXRzLiAgKi8KICBtYW50aXNzYSA+Pj0gcG9pbnRfcG9zIC0gNTsKCiAgLyogV2UgY2Fubm90IHJl cHJlc2VudCB0aGUgdmFsdWUgMC4wLCBzbyByZWplY3QgaXQuICBUaGlzIGlzIGhhbmRsZWQKICAg ICBlbHNld2hlcmUuICAqLwogIGlmIChtYW50aXNzYSA9PSAwKQogICAgcmV0dXJuIGZhbHNlOwoK ICAvKiBUaGVuLCBhcyBiaXQgNCBpcyBhbHdheXMgc2V0LCB3ZSBjYW4gbWFzayBpdCBvZmYsIGxl YXZpbmcKICAgICB0aGUgbWFudGlzc2EgaW4gdGhlIHJhbmdlIFswLCAxNV0uICAqLwogIG1hbnRp c3NhICY9IH4oMSA8PCA0KTsKICBnY2NfYXNzZXJ0IChtYW50aXNzYSA8PSAxNSk7CgogIC8qIEdD QyBpbnRlcm5hbGx5IGRvZXMgbm90IHVzZSBJRUVFNzU0LWxpa2UgZW5jb2RpbmcgKHdoZXJlIG5v cm1hbGl6ZWQKICAgICBzaWduaWZpY2FuZHMgYXJlIGluIHRoZSByYW5nZSBbMSwgMikuICBHQ0Mg dXNlcyBbMC41LCAxKSAoc2VlIHJlYWwuY2MpLgogICAgIE91ciBtYW50aXNzYSB2YWx1ZXMgYXJl IHNoaWZ0ZWQgNCBwbGFjZXMgdG8gdGhlIGxlZnQgcmVsYXRpdmUgdG8KICAgICBub3JtYWxpemVk IElFRUU3NTQgc28gd2UgbXVzdCBtb2RpZnkgdGhlIGV4cG9uZW50IHJldHVybmVkIGJ5IFJFQUxf RVhQCiAgICAgYnkgNSBwbGFjZXMgdG8gY29ycmVjdCBmb3IgR0NDJ3MgcmVwcmVzZW50YXRpb24u ICAqLwogIGV4cG9uZW50ID0gNSAtIGV4cG9uZW50OwoKICByZXR1cm4gKGV4cG9uZW50ID49IDAg JiYgZXhwb25lbnQgPD0gNyk7Cn0KCi8qIFJldHVybnMgdGhlIHN0cmluZyB3aXRoIHRoZSBpbnN0 cnVjdGlvbiBmb3IgQWR2U0lNRCBNT1ZJLCBNVk5JLCBPUlIgb3IgQklDCiAgIGltbWVkaWF0ZSB3 aXRoIGEgQ09OU1RfVkVDVE9SIG9mIE1PREUgYW5kIFdJRFRILiAgV0hJQ0ggc2VsZWN0cyB3aGV0 aGVyIHRvCiAgIG91dHB1dCBNT1ZJL01WTkksIE9SUiBvciBCSUMgaW1tZWRpYXRlLiAgKi8KY2hh cioKYWFyY2g2NF9vdXRwdXRfc2ltZF9tb3ZfaW1tZWRpYXRlIChydHggY29uc3RfdmVjdG9yLCB1 bnNpZ25lZCB3aWR0aCwKCQkJCSAgIGVudW0gc2ltZF9pbW1lZGlhdGVfY2hlY2sgd2hpY2gpCnsK ICBib29sIGlzX3ZhbGlkOwogIHN0YXRpYyBjaGFyIHRlbXBsWzQwXTsKICBjb25zdCBjaGFyICpt bmVtb25pYzsKICBjb25zdCBjaGFyICpzaGlmdF9vcDsKICB1bnNpZ25lZCBpbnQgbGFuZV9jb3Vu dCA9IDA7CiAgY2hhciBlbGVtZW50X2NoYXI7CgogIHN0cnVjdCBzaW1kX2ltbWVkaWF0ZV9pbmZv IGluZm87CgogIC8qIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSB0byBzaG93IGNvbnN0X3ZlY3RvciBp cyBsZWdhbCBmb3IgdXNlIGFzIGVpdGhlcgogICAgIGEgQWR2U0lNRCBNT1ZJIGluc3RydWN0aW9u IChvciwgaW1wbGljaXRseSwgTVZOSSksIE9SUiBvciBCSUMgaW1tZWRpYXRlLgogICAgIEl0IHdp bGwgYWxzbyB1cGRhdGUgSU5GTyB0byBzaG93IGhvdyB0aGUgaW1tZWRpYXRlIHNob3VsZCBiZSBn ZW5lcmF0ZWQuCiAgICAgV0hJQ0ggc2VsZWN0cyB3aGV0aGVyIHRvIGNoZWNrIGZvciBNT1ZJL01W TkksIE9SUiBvciBCSUMuICAqLwogIGlzX3ZhbGlkID0gYWFyY2g2NF9zaW1kX3ZhbGlkX2ltbWVk aWF0ZSAoY29uc3RfdmVjdG9yLCAmaW5mbywgd2hpY2gpOwogIGdjY19hc3NlcnQgKGlzX3ZhbGlk KTsKCiAgZWxlbWVudF9jaGFyID0gc2l6ZXRvY2hhciAoR0VUX01PREVfQklUU0laRSAoaW5mby5l bHRfbW9kZSkpOwogIGxhbmVfY291bnQgPSB3aWR0aCAvIEdFVF9NT0RFX0JJVFNJWkUgKGluZm8u ZWx0X21vZGUpOwoKICBpZiAoR0VUX01PREVfQ0xBU1MgKGluZm8uZWx0X21vZGUpID09IE1PREVf RkxPQVQpCiAgICB7CiAgICAgIGdjY19hc3NlcnQgKGluZm8uaW5zbiA9PSBzaW1kX2ltbWVkaWF0 ZV9pbmZvOjpNT1YKCQkgICYmIGluZm8udS5tb3Yuc2hpZnQgPT0gMCk7CiAgICAgIC8qIEZvciBG UCB6ZXJvIGNoYW5nZSBpdCB0byBhIENPTlNUX0lOVCAwIGFuZCB1c2UgdGhlIGludGVnZXIgU0lN RAoJIG1vdmUgaW1tZWRpYXRlIHBhdGguICAqLwogICAgICBpZiAoYWFyY2g2NF9mbG9hdF9jb25z dF96ZXJvX3J0eF9wIChpbmZvLnUubW92LnZhbHVlKSkKICAgICAgICBpbmZvLnUubW92LnZhbHVl ID0gR0VOX0lOVCAoMCk7CiAgICAgIGVsc2UKCXsKCSAgY29uc3QgdW5zaWduZWQgaW50IGJ1Zl9z aXplID0gMjA7CgkgIGNoYXIgZmxvYXRfYnVmW2J1Zl9zaXplXSA9IHsnXDAnfTsKCSAgcmVhbF90 b19kZWNpbWFsX2Zvcl9tb2RlIChmbG9hdF9idWYsCgkJCQkgICAgQ09OU1RfRE9VQkxFX1JFQUxf VkFMVUUgKGluZm8udS5tb3YudmFsdWUpLAoJCQkJICAgIGJ1Zl9zaXplLCBidWZfc2l6ZSwgMSwg aW5mby5lbHRfbW9kZSk7CgoJICBpZiAobGFuZV9jb3VudCA9PSAxKQoJICAgIHNucHJpbnRmICh0 ZW1wbCwgc2l6ZW9mICh0ZW1wbCksICJmbW92XHQlJWQwLCAlcyIsIGZsb2F0X2J1Zik7CgkgIGVs c2UKCSAgICBzbnByaW50ZiAodGVtcGwsIHNpemVvZiAodGVtcGwpLCAiZm1vdlx0JSUwLiVkJWMs ICVzIiwKCQkgICAgICBsYW5lX2NvdW50LCBlbGVtZW50X2NoYXIsIGZsb2F0X2J1Zik7CgkgIHJl dHVybiB0ZW1wbDsKCX0KICAgIH0KCiAgZ2NjX2Fzc2VydCAoQ09OU1RfSU5UX1AgKGluZm8udS5t b3YudmFsdWUpKTsKCiAgaWYgKHdoaWNoID09IEFBUkNINjRfQ0hFQ0tfTU9WKQogICAgewogICAg ICBtbmVtb25pYyA9IGluZm8uaW5zbiA9PSBzaW1kX2ltbWVkaWF0ZV9pbmZvOjpNVk4gPyAibXZu aSIgOiAibW92aSI7CiAgICAgIHNoaWZ0X29wID0gKGluZm8udS5tb3YubW9kaWZpZXIgPT0gc2lt ZF9pbW1lZGlhdGVfaW5mbzo6TVNMCgkJICA/ICJtc2wiIDogImxzbCIpOwogICAgICBpZiAobGFu ZV9jb3VudCA9PSAxKQoJc25wcmludGYgKHRlbXBsLCBzaXplb2YgKHRlbXBsKSwgIiVzXHQlJWQw LCAiIEhPU1RfV0lERV9JTlRfUFJJTlRfSEVYLAoJCSAgbW5lbW9uaWMsIFVJTlRWQUwgKGluZm8u dS5tb3YudmFsdWUpKTsKICAgICAgZWxzZSBpZiAoaW5mby51Lm1vdi5zaGlmdCkKCXNucHJpbnRm ICh0ZW1wbCwgc2l6ZW9mICh0ZW1wbCksICIlc1x0JSUwLiVkJWMsICIKCQkgIEhPU1RfV0lERV9J TlRfUFJJTlRfSEVYICIsICVzICVkIiwgbW5lbW9uaWMsIGxhbmVfY291bnQsCgkJICBlbGVtZW50 X2NoYXIsIFVJTlRWQUwgKGluZm8udS5tb3YudmFsdWUpLCBzaGlmdF9vcCwKCQkgIGluZm8udS5t b3Yuc2hpZnQpOwogICAgICBlbHNlCglzbnByaW50ZiAodGVtcGwsIHNpemVvZiAodGVtcGwpLCAi JXNcdCUlMC4lZCVjLCAiCgkJICBIT1NUX1dJREVfSU5UX1BSSU5UX0hFWCwgbW5lbW9uaWMsIGxh bmVfY291bnQsCgkJICBlbGVtZW50X2NoYXIsIFVJTlRWQUwgKGluZm8udS5tb3YudmFsdWUpKTsK ICAgIH0KICBlbHNlCiAgICB7CiAgICAgIC8qIEZvciBBQVJDSDY0X0NIRUNLX0JJQyBhbmQgQUFS Q0g2NF9DSEVDS19PUlIuICAqLwogICAgICBtbmVtb25pYyA9IGluZm8uaW5zbiA9PSBzaW1kX2lt bWVkaWF0ZV9pbmZvOjpNVk4gPyAiYmljIiA6ICJvcnIiOwogICAgICBpZiAoaW5mby51Lm1vdi5z aGlmdCkKCXNucHJpbnRmICh0ZW1wbCwgc2l6ZW9mICh0ZW1wbCksICIlc1x0JSUwLiVkJWMsICMi CgkJICBIT1NUX1dJREVfSU5UX1BSSU5UX0RFQyAiLCAlcyAjJWQiLCBtbmVtb25pYywgbGFuZV9j b3VudCwKCQkgIGVsZW1lbnRfY2hhciwgVUlOVFZBTCAoaW5mby51Lm1vdi52YWx1ZSksICJsc2wi LAoJCSAgaW5mby51Lm1vdi5zaGlmdCk7CiAgICAgIGVsc2UKCXNucHJpbnRmICh0ZW1wbCwgc2l6 ZW9mICh0ZW1wbCksICIlc1x0JSUwLiVkJWMsICMiCgkJICBIT1NUX1dJREVfSU5UX1BSSU5UX0RF QywgbW5lbW9uaWMsIGxhbmVfY291bnQsCgkJICBlbGVtZW50X2NoYXIsIFVJTlRWQUwgKGluZm8u dS5tb3YudmFsdWUpKTsKICAgIH0KICByZXR1cm4gdGVtcGw7Cn0KCmNoYXIqCmFhcmNoNjRfb3V0 cHV0X3NjYWxhcl9zaW1kX21vdl9pbW1lZGlhdGUgKHJ0eCBpbW1lZGlhdGUsIHNjYWxhcl9pbnRf bW9kZSBtb2RlKQp7CgogIC8qIElmIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdhcyBwYXNzZWQg YW5kIHdlIGRlc2lyZSB0byB1c2UgaXQgaW4gYW4KICAgICBpbnRlZ2VyIG1vZGUgZG8gdGhlIGNv bnZlcnNpb24gdG8gaW50ZWdlci4gICovCiAgaWYgKENPTlNUX0RPVUJMRV9QIChpbW1lZGlhdGUp ICYmIEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX0lOVCkKICAgIHsKICAgICAgdW5zaWdu ZWQgSE9TVF9XSURFX0lOVCBpdmFsOwogICAgICBpZiAoIWFhcmNoNjRfcmVpbnRlcnByZXRfZmxv YXRfYXNfaW50IChpbW1lZGlhdGUsICZpdmFsKSkKCSAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAg ICBpbW1lZGlhdGUgPSBnZW5faW50X21vZGUgKGl2YWwsIG1vZGUpOwogICAgfQoKICBtYWNoaW5l X21vZGUgdm1vZGU7CiAgLyogdXNlIGEgNjQgYml0IG1vZGUgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0 IGZvciBESS9ERi9ERCBtb2RlLCB3aGVyZSB3ZSB1c2UKICAgICBhIDEyOCBiaXQgdmVjdG9yIG1v ZGUuICAqLwogIGludCB3aWR0aCA9IEdFVF9NT0RFX0JJVFNJWkUgKG1vZGUpID09IDY0ID8gMTI4 IDogNjQ7CgogIHZtb2RlID0gYWFyY2g2NF9zaW1kX2NvbnRhaW5lcl9tb2RlIChtb2RlLCB3aWR0 aCk7CiAgcnR4IHZfb3AgPSBhYXJjaDY0X3NpbWRfZ2VuX2NvbnN0X3ZlY3Rvcl9kdXAgKHZtb2Rl LCBJTlRWQUwgKGltbWVkaWF0ZSkpOwogIHJldHVybiBhYXJjaDY0X291dHB1dF9zaW1kX21vdl9p bW1lZGlhdGUgKHZfb3AsIHdpZHRoKTsKfQoKLyogUmV0dXJuIHRoZSBvdXRwdXQgc3RyaW5nIHRv IHVzZSBmb3IgbW92aW5nIGltbWVkaWF0ZSBDT05TVF9WRUNUT1IKICAgaW50byBhbiBTVkUgcmVn aXN0ZXIuICAqLwoKY2hhciAqCmFhcmNoNjRfb3V0cHV0X3N2ZV9tb3ZfaW1tZWRpYXRlIChydHgg Y29uc3RfdmVjdG9yKQp7CiAgc3RhdGljIGNoYXIgdGVtcGxbNDBdOwogIHN0cnVjdCBzaW1kX2lt bWVkaWF0ZV9pbmZvIGluZm87CiAgY2hhciBlbGVtZW50X2NoYXI7CgogIGJvb2wgaXNfdmFsaWQg PSBhYXJjaDY0X3NpbWRfdmFsaWRfaW1tZWRpYXRlIChjb25zdF92ZWN0b3IsICZpbmZvKTsKICBn Y2NfYXNzZXJ0IChpc192YWxpZCk7CgogIGVsZW1lbnRfY2hhciA9IHNpemV0b2NoYXIgKEdFVF9N T0RFX0JJVFNJWkUgKGluZm8uZWx0X21vZGUpKTsKCiAgbWFjaGluZV9tb2RlIHZlY19tb2RlID0g R0VUX01PREUgKGNvbnN0X3ZlY3Rvcik7CiAgaWYgKGFhcmNoNjRfc3ZlX3ByZWRfbW9kZV9wICh2 ZWNfbW9kZSkpCiAgICB7CiAgICAgIHN0YXRpYyBjaGFyIGJ1ZltzaXplb2YgKCJwdHJ1ZVx0JTAu TiwgdmxOTk5OTiIpXTsKICAgICAgaWYgKGluZm8uaW5zbiA9PSBzaW1kX2ltbWVkaWF0ZV9pbmZv OjpNT1YpCgl7CgkgIGdjY19hc3NlcnQgKGluZm8udS5tb3YudmFsdWUgPT0gY29uc3QwX3J0eCk7 CgkgIHNucHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSwgInBmYWxzZVx0JSUwLmIiKTsKCX0KICAg ICAgZWxzZQoJewoJICBnY2NfYXNzZXJ0IChpbmZvLmluc24gPT0gc2ltZF9pbW1lZGlhdGVfaW5m bzo6UFRSVUUpOwoJICB1bnNpZ25lZCBpbnQgdG90YWxfYnl0ZXM7CgkgIGlmIChpbmZvLnUucGF0 dGVybiA9PSBBQVJDSDY0X1NWX0FMTAoJICAgICAgJiYgQllURVNfUEVSX1NWRV9WRUNUT1IuaXNf Y29uc3RhbnQgKCZ0b3RhbF9ieXRlcykpCgkgICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYp LCAicHRydWVcdCUlMC4lYywgdmwlZCIsIGVsZW1lbnRfY2hhciwKCQkgICAgICB0b3RhbF9ieXRl cyAvIEdFVF9NT0RFX1NJWkUgKGluZm8uZWx0X21vZGUpKTsKCSAgZWxzZQoJICAgIHNucHJpbnRm IChidWYsIHNpemVvZiAoYnVmKSwgInB0cnVlXHQlJTAuJWMsICVzIiwgZWxlbWVudF9jaGFyLAoJ CSAgICAgIHN2cGF0dGVybl90b2tlbiAoaW5mby51LnBhdHRlcm4pKTsKCX0KICAgICAgcmV0dXJu IGJ1ZjsKICAgIH0KCiAgaWYgKGluZm8uaW5zbiA9PSBzaW1kX2ltbWVkaWF0ZV9pbmZvOjpJTkRF WCkKICAgIHsKICAgICAgc25wcmludGYgKHRlbXBsLCBzaXplb2YgKHRlbXBsKSwgImluZGV4XHQl JTAuJWMsICMiCgkJSE9TVF9XSURFX0lOVF9QUklOVF9ERUMgIiwgIyIgSE9TVF9XSURFX0lOVF9Q UklOVF9ERUMsCgkJZWxlbWVudF9jaGFyLCBJTlRWQUwgKGluZm8udS5pbmRleC5iYXNlKSwKCQlJ TlRWQUwgKGluZm8udS5pbmRleC5zdGVwKSk7CiAgICAgIHJldHVybiB0ZW1wbDsKICAgIH0KCiAg aWYgKEdFVF9NT0RFX0NMQVNTIChpbmZvLmVsdF9tb2RlKSA9PSBNT0RFX0ZMT0FUKQogICAgewog ICAgICBpZiAoYWFyY2g2NF9mbG9hdF9jb25zdF96ZXJvX3J0eF9wIChpbmZvLnUubW92LnZhbHVl KSkKCWluZm8udS5tb3YudmFsdWUgPSBHRU5fSU5UICgwKTsKICAgICAgZWxzZQoJewoJICBjb25z dCBpbnQgYnVmX3NpemUgPSAyMDsKCSAgY2hhciBmbG9hdF9idWZbYnVmX3NpemVdID0ge307Cgkg IHJlYWxfdG9fZGVjaW1hbF9mb3JfbW9kZSAoZmxvYXRfYnVmLAoJCQkJICAgIENPTlNUX0RPVUJM RV9SRUFMX1ZBTFVFIChpbmZvLnUubW92LnZhbHVlKSwKCQkJCSAgICBidWZfc2l6ZSwgYnVmX3Np emUsIDEsIGluZm8uZWx0X21vZGUpOwoKCSAgc25wcmludGYgKHRlbXBsLCBzaXplb2YgKHRlbXBs KSwgImZtb3ZcdCUlMC4lYywgIyVzIiwKCQkgICAgZWxlbWVudF9jaGFyLCBmbG9hdF9idWYpOwoJ ICByZXR1cm4gdGVtcGw7Cgl9CiAgICB9CgogIHNucHJpbnRmICh0ZW1wbCwgc2l6ZW9mICh0ZW1w bCksICJtb3ZcdCUlMC4lYywgIyIgSE9TVF9XSURFX0lOVF9QUklOVF9ERUMsCgkgICAgZWxlbWVu dF9jaGFyLCBJTlRWQUwgKGluZm8udS5tb3YudmFsdWUpKTsKICByZXR1cm4gdGVtcGw7Cn0KCi8q IFJldHVybiB0aGUgYXNtIHRlbXBsYXRlIGZvciBhIFBUUlVFUy4gIENPTlNUX1VOU1BFQyBpcyB0 aGUKICAgYWFyY2g2NF9zdmVfcHRydWVfc3ZwYXR0ZXJuX2ltbWVkaWF0ZSB0aGF0IGRlc2NyaWJl cyB0aGUgcHJlZGljYXRlCiAgIHBhdHRlcm4uICAqLwoKY2hhciAqCmFhcmNoNjRfb3V0cHV0X3N2 ZV9wdHJ1ZXMgKHJ0eCBjb25zdF91bnNwZWMpCnsKICBzdGF0aWMgY2hhciB0ZW1wbFs0MF07Cgog IHN0cnVjdCBzaW1kX2ltbWVkaWF0ZV9pbmZvIGluZm87CiAgYm9vbCBpc192YWxpZCA9IGFhcmNo NjRfc2ltZF92YWxpZF9pbW1lZGlhdGUgKGNvbnN0X3Vuc3BlYywgJmluZm8pOwogIGdjY19hc3Nl cnQgKGlzX3ZhbGlkICYmIGluZm8uaW5zbiA9PSBzaW1kX2ltbWVkaWF0ZV9pbmZvOjpQVFJVRSk7 CgogIGNoYXIgZWxlbWVudF9jaGFyID0gc2l6ZXRvY2hhciAoR0VUX01PREVfQklUU0laRSAoaW5m by5lbHRfbW9kZSkpOwogIHNucHJpbnRmICh0ZW1wbCwgc2l6ZW9mICh0ZW1wbCksICJwdHJ1ZXNc dCUlMC4lYywgJXMiLCBlbGVtZW50X2NoYXIsCgkgICAgc3ZwYXR0ZXJuX3Rva2VuIChpbmZvLnUu cGF0dGVybikpOwogIHJldHVybiB0ZW1wbDsKfQoKLyogU3BsaXQgb3BlcmFuZHMgaW50byBtb3Zl cyBmcm9tIG9wWzFdICsgb3BbMl0gaW50byBvcFswXS4gICovCgp2b2lkCmFhcmNoNjRfc3BsaXRf Y29tYmluZXYxNnFpIChydHggb3BlcmFuZHNbM10pCnsKICB1bnNpZ25lZCBpbnQgZGVzdCA9IFJF R05PIChvcGVyYW5kc1swXSk7CiAgdW5zaWduZWQgaW50IHNyYzEgPSBSRUdOTyAob3BlcmFuZHNb MV0pOwogIHVuc2lnbmVkIGludCBzcmMyID0gUkVHTk8gKG9wZXJhbmRzWzJdKTsKICBtYWNoaW5l X21vZGUgaGFsZm1vZGUgPSBHRVRfTU9ERSAob3BlcmFuZHNbMV0pOwogIHVuc2lnbmVkIGludCBo YWxmcmVncyA9IFJFR19OUkVHUyAob3BlcmFuZHNbMV0pOwogIHJ0eCBkZXN0bG8sIGRlc3RoaTsK CiAgZ2NjX2Fzc2VydCAoaGFsZm1vZGUgPT0gVjE2UUltb2RlKTsKCiAgaWYgKHNyYzEgPT0gZGVz dCAmJiBzcmMyID09IGRlc3QgKyBoYWxmcmVncykKICAgIHsKICAgICAgLyogTm8tb3AgbW92ZS4g IENhbid0IHNwbGl0IHRvIG5vdGhpbmc7IGVtaXQgc29tZXRoaW5nLiAgKi8KICAgICAgZW1pdF9u b3RlIChOT1RFX0lOU05fREVMRVRFRCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgLyogUHJlc2Vy dmUgcmVnaXN0ZXIgYXR0cmlidXRlcyBmb3IgdmFyaWFibGUgdHJhY2tpbmcuICAqLwogIGRlc3Rs byA9IGdlbl9ydHhfUkVHX29mZnNldCAob3BlcmFuZHNbMF0sIGhhbGZtb2RlLCBkZXN0LCAwKTsK ICBkZXN0aGkgPSBnZW5fcnR4X1JFR19vZmZzZXQgKG9wZXJhbmRzWzBdLCBoYWxmbW9kZSwgZGVz dCArIGhhbGZyZWdzLAoJCQkgICAgICAgR0VUX01PREVfU0laRSAoaGFsZm1vZGUpKTsKCiAgLyog U3BlY2lhbCBjYXNlIG9mIHJldmVyc2VkIGhpZ2gvbG93IHBhcnRzLiAgKi8KICBpZiAocmVnX292 ZXJsYXBfbWVudGlvbmVkX3AgKG9wZXJhbmRzWzJdLCBkZXN0bG8pCiAgICAgICYmIHJlZ19vdmVy bGFwX21lbnRpb25lZF9wIChvcGVyYW5kc1sxXSwgZGVzdGhpKSkKICAgIHsKICAgICAgZW1pdF9p bnNuIChnZW5feG9ydjE2cWkzIChvcGVyYW5kc1sxXSwgb3BlcmFuZHNbMV0sIG9wZXJhbmRzWzJd KSk7CiAgICAgIGVtaXRfaW5zbiAoZ2VuX3hvcnYxNnFpMyAob3BlcmFuZHNbMl0sIG9wZXJhbmRz WzFdLCBvcGVyYW5kc1syXSkpOwogICAgICBlbWl0X2luc24gKGdlbl94b3J2MTZxaTMgKG9wZXJh bmRzWzFdLCBvcGVyYW5kc1sxXSwgb3BlcmFuZHNbMl0pKTsKICAgIH0KICBlbHNlIGlmICghcmVn X292ZXJsYXBfbWVudGlvbmVkX3AgKG9wZXJhbmRzWzJdLCBkZXN0bG8pKQogICAgewogICAgICAv KiBUcnkgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbW92ZXMgaWYgcGFydCBvZiB0aGUgcmVzdWx0Cgkg aXMgaW4gdGhlIHJpZ2h0IHBsYWNlIGFscmVhZHkuICAqLwogICAgICBpZiAoc3JjMSAhPSBkZXN0 KQoJZW1pdF9tb3ZlX2luc24gKGRlc3Rsbywgb3BlcmFuZHNbMV0pOwogICAgICBpZiAoc3JjMiAh PSBkZXN0ICsgaGFsZnJlZ3MpCgllbWl0X21vdmVfaW5zbiAoZGVzdGhpLCBvcGVyYW5kc1syXSk7 CiAgICB9CiAgZWxzZQogICAgewogICAgICBpZiAoc3JjMiAhPSBkZXN0ICsgaGFsZnJlZ3MpCgll bWl0X21vdmVfaW5zbiAoZGVzdGhpLCBvcGVyYW5kc1syXSk7CiAgICAgIGlmIChzcmMxICE9IGRl c3QpCgllbWl0X21vdmVfaW5zbiAoZGVzdGxvLCBvcGVyYW5kc1sxXSk7CiAgICB9Cn0KCi8qIHZl Y19wZXJtIHN1cHBvcnQuICAqLwoKc3RydWN0IGV4cGFuZF92ZWNfcGVybV9kCnsKICBydHggdGFy Z2V0LCBvcDAsIG9wMTsKICB2ZWNfcGVybV9pbmRpY2VzIHBlcm07CiAgbWFjaGluZV9tb2RlIHZt b2RlOwogIG1hY2hpbmVfbW9kZSBvcF9tb2RlOwogIHVuc2lnbmVkIGludCB2ZWNfZmxhZ3M7CiAg dW5zaWduZWQgaW50IG9wX3ZlY19mbGFnczsKICBib29sIG9uZV92ZWN0b3JfcDsKICBib29sIHRl c3RpbmdfcDsKfTsKCnN0YXRpYyBib29sIGFhcmNoNjRfZXhwYW5kX3ZlY19wZXJtX2NvbnN0XzEg KHN0cnVjdCBleHBhbmRfdmVjX3Blcm1fZCAqZCk7CgovKiBHZW5lcmF0ZSBhIHZhcmlhYmxlIHBl cm11dGF0aW9uLiAgKi8KCnN0YXRpYyB2b2lkCmFhcmNoNjRfZXhwYW5kX3ZlY19wZXJtXzEgKHJ0 eCB0YXJnZXQsIHJ0eCBvcDAsIHJ0eCBvcDEsIHJ0eCBzZWwpCnsKICBtYWNoaW5lX21vZGUgdm1v ZGUgPSBHRVRfTU9ERSAodGFyZ2V0KTsKICBib29sIG9uZV92ZWN0b3JfcCA9IHJ0eF9lcXVhbF9w IChvcDAsIG9wMSk7CgogIGdjY19jaGVja2luZ19hc3NlcnQgKHZtb2RlID09IFY4UUltb2RlIHx8 IHZtb2RlID09IFYxNlFJbW9kZSk7CiAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoR0VUX01PREUgKG9w MCkgPT0gdm1vZGUpOwogIGdjY19jaGVja2luZ19hc3NlcnQgKEdFVF9NT0RFIChvcDEpID09IHZt b2RlKTsKICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChHRVRfTU9ERSAoc2VsKSA9PSB2bW9kZSk7CiAg Z2NjX2NoZWNraW5nX2Fzc2VydCAoVEFSR0VUX1NJTUQpOwoKICBpZiAob25lX3ZlY3Rvcl9wKQog ICAgewogICAgICBpZiAodm1vZGUgPT0gVjhRSW1vZGUpCgl7CgkgIC8qIEV4cGFuZCB0aGUgYXJn dW1lbnQgdG8gYSBWMTZRSSBtb2RlIGJ5IGR1cGxpY2F0aW5nIGl0LiAgKi8KCSAgcnR4IHBhaXIg PSBnZW5fcmVnX3J0eCAoVjE2UUltb2RlKTsKCSAgZW1pdF9pbnNuIChnZW5fYWFyY2g2NF9jb21i aW5ldjhxaSAocGFpciwgb3AwLCBvcDApKTsKCSAgZW1pdF9pbnNuIChnZW5fYWFyY2g2NF9xdGJs MXY4cWkgKHRhcmdldCwgcGFpciwgc2VsKSk7Cgl9CiAgICAgIGVsc2UKCXsKCSAgZW1pdF9pbnNu IChnZW5fYWFyY2g2NF9xdGJsMXYxNnFpICh0YXJnZXQsIG9wMCwgc2VsKSk7Cgl9CiAgICB9CiAg ZWxzZQogICAgewogICAgICBydHggcGFpcjsKCiAgICAgIGlmICh2bW9kZSA9PSBWOFFJbW9kZSkK CXsKCSAgcGFpciA9IGdlbl9yZWdfcnR4IChWMTZRSW1vZGUpOwoJICBlbWl0X2luc24gKGdlbl9h YXJjaDY0X2NvbWJpbmV2OHFpIChwYWlyLCBvcDAsIG9wMSkpOwoJICBlbWl0X2luc24gKGdlbl9h YXJjaDY0X3F0YmwxdjhxaSAodGFyZ2V0LCBwYWlyLCBzZWwpKTsKCX0KICAgICAgZWxzZQoJewoJ ICBwYWlyID0gZ2VuX3JlZ19ydHggKFYyeDE2UUltb2RlKTsKCSAgZW1pdF9pbnNuIChnZW5fYWFy Y2g2NF9jb21iaW5ldjE2cWkgKHBhaXIsIG9wMCwgb3AxKSk7CgkgIGVtaXRfaW5zbiAoZ2VuX2Fh cmNoNjRfcXRibDJ2MTZxaSAodGFyZ2V0LCBwYWlyLCBzZWwpKTsKCX0KICAgIH0KfQoKLyogRXhw YW5kIGEgdmVjX3Blcm0gd2l0aCB0aGUgb3BlcmFuZHMgZ2l2ZW4gYnkgVEFSR0VULCBPUDAsIE9Q MSBhbmQgU0VMLgogICBORUxUIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3Rv ci4gICovCgp2b2lkCmFhcmNoNjRfZXhwYW5kX3ZlY19wZXJtIChydHggdGFyZ2V0LCBydHggb3Aw LCBydHggb3AxLCBydHggc2VsLAoJCQkgdW5zaWduZWQgaW50IG5lbHQpCnsKICBtYWNoaW5lX21v ZGUgdm1vZGUgPSBHRVRfTU9ERSAodGFyZ2V0KTsKICBib29sIG9uZV92ZWN0b3JfcCA9IHJ0eF9l cXVhbF9wIChvcDAsIG9wMSk7CiAgcnR4IG1hc2s7CgogIC8qIFRoZSBUQkwgaW5zdHJ1Y3Rpb24g ZG9lcyBub3QgdXNlIGEgbW9kdWxvIGluZGV4LCBzbyB3ZSBtdXN0IHRha2UgY2FyZQogICAgIG9m IHRoYXQgb3Vyc2VsdmVzLiAgKi8KICBtYXNrID0gYWFyY2g2NF9zaW1kX2dlbl9jb25zdF92ZWN0 b3JfZHVwICh2bW9kZSwKICAgICAgb25lX3ZlY3Rvcl9wID8gbmVsdCAtIDEgOiAyICogbmVsdCAt IDEpOwogIHNlbCA9IGV4cGFuZF9zaW1wbGVfYmlub3AgKHZtb2RlLCBBTkQsIHNlbCwgbWFzaywg TlVMTCwgMCwgT1BUQUJfTElCX1dJREVOKTsKCiAgLyogRm9yIGJpZy1lbmRpYW4sIHdlIGFsc28g bmVlZCB0byByZXZlcnNlIHRoZSBpbmRleCB3aXRoaW4gdGhlIHZlY3RvcgogICAgIChidXQgbm90 IHdoaWNoIHZlY3RvcikuICAqLwogIGlmIChCWVRFU19CSUdfRU5ESUFOKQogICAgewogICAgICAv KiBJZiBvbmVfdmVjdG9yX3AsIG1hc2sgaXMgYSB2ZWN0b3Igb2YgKG5lbHQgLSAxKSdzIGFscmVh ZHkuICAqLwogICAgICBpZiAoIW9uZV92ZWN0b3JfcCkKICAgICAgICBtYXNrID0gYWFyY2g2NF9z aW1kX2dlbl9jb25zdF92ZWN0b3JfZHVwICh2bW9kZSwgbmVsdCAtIDEpOwogICAgICBzZWwgPSBl eHBhbmRfc2ltcGxlX2Jpbm9wICh2bW9kZSwgWE9SLCBzZWwsIG1hc2ssCgkJCQkgTlVMTCwgMCwg T1BUQUJfTElCX1dJREVOKTsKICAgIH0KICBhYXJjaDY0X2V4cGFuZF92ZWNfcGVybV8xICh0YXJn ZXQsIG9wMCwgb3AxLCBzZWwpOwp9CgovKiBHZW5lcmF0ZSAoc2V0IFRBUkdFVCAodW5zcGVjIFtP UDAgT1AxXSBDT0RFKSkuICAqLwoKc3RhdGljIHZvaWQKZW1pdF91bnNwZWMyIChydHggdGFyZ2V0 LCBpbnQgY29kZSwgcnR4IG9wMCwgcnR4IG9wMSkKewogIGVtaXRfaW5zbiAoZ2VuX3J0eF9TRVQg KHRhcmdldCwKCQkJICBnZW5fcnR4X1VOU1BFQyAoR0VUX01PREUgKHRhcmdldCksCgkJCQkJICBn ZW5fcnR2ZWMgKDIsIG9wMCwgb3AxKSwgY29kZSkpKTsKfQoKLyogRXhwYW5kIGFuIFNWRSB2ZWNf cGVybSB3aXRoIHRoZSBnaXZlbiBvcGVyYW5kcy4gICovCgp2b2lkCmFhcmNoNjRfZXhwYW5kX3N2 ZV92ZWNfcGVybSAocnR4IHRhcmdldCwgcnR4IG9wMCwgcnR4IG9wMSwgcnR4IHNlbCkKewogIG1h Y2hpbmVfbW9kZSBkYXRhX21vZGUgPSBHRVRfTU9ERSAodGFyZ2V0KTsKICBtYWNoaW5lX21vZGUg c2VsX21vZGUgPSBHRVRfTU9ERSAoc2VsKTsKICAvKiBFbmZvcmNlZCBieSB0aGUgcGF0dGVybiBj b25kaXRpb24uICAqLwogIGludCBudW5pdHMgPSBHRVRfTU9ERV9OVU5JVFMgKHNlbF9tb2RlKS50 b19jb25zdGFudCAoKTsKCiAgLyogTm90ZTogdmVjX3Blcm0gaW5kaWNlcyBhcmUgc3VwcG9zZWQg dG8gd3JhcCB3aGVuIHRoZXkgZ28gYmV5b25kIHRoZQogICAgIHNpemUgb2YgdGhlIHR3byB2YWx1 ZSB2ZWN0b3JzLCBpLmUuIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBpbmRpY2VzCiAgICAgYXJlIGVm ZmVjdGl2ZWx5IGlnbm9yZWQuICBTVkUgVEJMIGluc3RlYWQgcHJvZHVjZXMgMCBmb3IgYW55CiAg ICAgb3V0LW9mLXJhbmdlIGluZGljZXMsIHNvIHdlIG5lZWQgdG8gbW9kdWxvIGFsbCB0aGUgdmVj X3Blcm0gaW5kaWNlcwogICAgIHRvIGVuc3VyZSB0aGV5IGFyZSBhbGwgaW4gcmFuZ2UuICAqLwog IHJ0eCBzZWxfcmVnID0gZm9yY2VfcmVnIChzZWxfbW9kZSwgc2VsKTsKCiAgLyogQ2hlY2sgaWYg dGhlIHNlbCBvbmx5IHJlZmVyZW5jZXMgdGhlIGZpcnN0IHZhbHVlcyB2ZWN0b3IuICAqLwogIGlm IChDT05TVF9WRUNUT1JfUCAoc2VsKQogICAgICAmJiBhYXJjaDY0X2NvbnN0X3ZlY19hbGxfaW5f cmFuZ2VfcCAoc2VsLCAwLCBudW5pdHMgLSAxKSkKICAgIHsKICAgICAgZW1pdF91bnNwZWMyICh0 YXJnZXQsIFVOU1BFQ19UQkwsIG9wMCwgc2VsX3JlZyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAg LyogQ2hlY2sgaWYgdGhlIHR3byB2YWx1ZXMgdmVjdG9ycyBhcmUgdGhlIHNhbWUuICAqLwogIGlm IChydHhfZXF1YWxfcCAob3AwLCBvcDEpKQogICAgewogICAgICBydHggbWF4X3NlbCA9IGFhcmNo NjRfc2ltZF9nZW5fY29uc3RfdmVjdG9yX2R1cCAoc2VsX21vZGUsIG51bml0cyAtIDEpOwogICAg ICBydHggc2VsX21vZCA9IGV4cGFuZF9zaW1wbGVfYmlub3AgKHNlbF9tb2RlLCBBTkQsIHNlbF9y ZWcsIG1heF9zZWwsCgkJCQkJIE5VTEwsIDAsIE9QVEFCX0RJUkVDVCk7CiAgICAgIGVtaXRfdW5z cGVjMiAodGFyZ2V0LCBVTlNQRUNfVEJMLCBvcDAsIHNlbF9tb2QpOwogICAgICByZXR1cm47CiAg ICB9CgogIC8qIFJ1biBUQkwgb24gZm9yIGVhY2ggdmFsdWUgdmVjdG9yIGFuZCBjb21iaW5lIHRo ZSByZXN1bHRzLiAgKi8KCiAgcnR4IHJlczAgPSBnZW5fcmVnX3J0eCAoZGF0YV9tb2RlKTsKICBy dHggcmVzMSA9IGdlbl9yZWdfcnR4IChkYXRhX21vZGUpOwogIHJ0eCBuZWdfbnVtX2VsZW1zID0g YWFyY2g2NF9zaW1kX2dlbl9jb25zdF92ZWN0b3JfZHVwIChzZWxfbW9kZSwgLW51bml0cyk7CiAg aWYgKCFDT05TVF9WRUNUT1JfUCAoc2VsKQogICAgICB8fCAhYWFyY2g2NF9jb25zdF92ZWNfYWxs X2luX3JhbmdlX3AgKHNlbCwgMCwgMiAqIG51bml0cyAtIDEpKQogICAgewogICAgICBydHggbWF4 X3NlbCA9IGFhcmNoNjRfc2ltZF9nZW5fY29uc3RfdmVjdG9yX2R1cCAoc2VsX21vZGUsCgkJCQkJ CSAgICAgICAyICogbnVuaXRzIC0gMSk7CiAgICAgIHNlbF9yZWcgPSBleHBhbmRfc2ltcGxlX2Jp bm9wIChzZWxfbW9kZSwgQU5ELCBzZWxfcmVnLCBtYXhfc2VsLAoJCQkJICAgICBOVUxMLCAwLCBP UFRBQl9ESVJFQ1QpOwogICAgfQogIGVtaXRfdW5zcGVjMiAocmVzMCwgVU5TUEVDX1RCTCwgb3Aw LCBzZWxfcmVnKTsKICBydHggc2VsX3N1YiA9IGV4cGFuZF9zaW1wbGVfYmlub3AgKHNlbF9tb2Rl LCBQTFVTLCBzZWxfcmVnLCBuZWdfbnVtX2VsZW1zLAoJCQkJICAgICBOVUxMLCAwLCBPUFRBQl9E SVJFQ1QpOwogIGVtaXRfdW5zcGVjMiAocmVzMSwgVU5TUEVDX1RCTCwgb3AxLCBzZWxfc3ViKTsK ICBpZiAoR0VUX01PREVfQ0xBU1MgKGRhdGFfbW9kZSkgPT0gTU9ERV9WRUNUT1JfSU5UKQogICAg ZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAodGFyZ2V0LCBnZW5fcnR4X0lPUiAoZGF0YV9tb2RlLCBy ZXMwLCByZXMxKSkpOwogIGVsc2UKICAgIGVtaXRfdW5zcGVjMiAodGFyZ2V0LCBVTlNQRUNfSU9S RiwgcmVzMCwgcmVzMSk7Cn0KCi8qIFJlY29nbml6ZSBwYXR0ZXJucyBzdWl0YWJsZSBmb3IgdGhl IFRSTiBpbnN0cnVjdGlvbnMuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X2V2cGNfdHJuIChzdHJ1 Y3QgZXhwYW5kX3ZlY19wZXJtX2QgKmQpCnsKICBIT1NUX1dJREVfSU5UIG9kZDsKICBwb2x5X3Vp bnQ2NCBuZWx0ID0gZC0+cGVybS5sZW5ndGggKCk7CiAgcnR4IG91dCwgaW4wLCBpbjE7CiAgbWFj aGluZV9tb2RlIHZtb2RlID0gZC0+dm1vZGU7CgogIGlmIChHRVRfTU9ERV9VTklUX1NJWkUgKHZt b2RlKSA+IDgpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIE5vdGUgdGhhdCB0aGVzZSBhcmUgbGl0 dGxlLWVuZGlhbiB0ZXN0cy4KICAgICBXZSBjb3JyZWN0IGZvciBiaWctZW5kaWFuIGxhdGVyLiAg Ki8KICBpZiAoIWQtPnBlcm1bMF0uaXNfY29uc3RhbnQgKCZvZGQpCiAgICAgIHx8IChvZGQgIT0g MCAmJiBvZGQgIT0gMSkKICAgICAgfHwgIWQtPnBlcm0uc2VyaWVzX3AgKDAsIDIsIG9kZCwgMikK ICAgICAgfHwgIWQtPnBlcm0uc2VyaWVzX3AgKDEsIDIsIG5lbHQgKyBvZGQsIDIpKQogICAgcmV0 dXJuIGZhbHNlOwoKICAvKiBTdWNjZXNzISAgKi8KICBpZiAoZC0+dGVzdGluZ19wKQogICAgcmV0 dXJuIHRydWU7CgogIGluMCA9IGQtPm9wMDsKICBpbjEgPSBkLT5vcDE7CiAgLyogV2UgZG9uJ3Qg bmVlZCBhIGJpZy1lbmRpYW4gbGFuZSBjb3JyZWN0aW9uIGZvciBTVkU7IHNlZSB0aGUgY29tbWVu dAogICAgIGF0IHRoZSBoZWFkIG9mIGFhcmNoNjQtc3ZlLm1kIGZvciBkZXRhaWxzLiAgKi8KICBp ZiAoQllURVNfQklHX0VORElBTiAmJiBkLT52ZWNfZmxhZ3MgPT0gVkVDX0FEVlNJTUQpCiAgICB7 CiAgICAgIHN0ZDo6c3dhcCAoaW4wLCBpbjEpOwogICAgICBvZGQgPSAhb2RkOwogICAgfQogIG91 dCA9IGQtPnRhcmdldDsKCiAgZW1pdF9zZXRfaW5zbiAob3V0LCBnZW5fcnR4X1VOU1BFQyAodm1v ZGUsIGdlbl9ydHZlYyAoMiwgaW4wLCBpbjEpLAoJCQkJICAgICAgb2RkID8gVU5TUEVDX1RSTjIg OiBVTlNQRUNfVFJOMSkpOwogIHJldHVybiB0cnVlOwp9CgovKiBUcnkgdG8gcmUtZW5jb2RlIHRo ZSBQRVJNIGNvbnN0YW50IHNvIGl0IGNvbWJpbmVzIG9kZCBhbmQgZXZlbiBlbGVtZW50cy4KICAg VGhpcyByZXdyaXRlcyBjb25zdGFudHMgc3VjaCBhcyB7MCwgMSwgNCwgNX0vVjRTRiB0byB7MCwg Mn0vVjJESS4KICAgV2UgcmV0cnkgd2l0aCB0aGlzIG5ldyBjb25zdGFudCB3aXRoIHRoZSBmdWxs IHN1aXRlIG9mIHBhdHRlcm5zLiAgKi8Kc3RhdGljIGJvb2wKYWFyY2g2NF9ldnBjX3JlZW5jb2Rl IChzdHJ1Y3QgZXhwYW5kX3ZlY19wZXJtX2QgKmQpCnsKICBleHBhbmRfdmVjX3Blcm1fZCBuZXdk OwogIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbmVsdDsKCiAgaWYgKGQtPnZlY19mbGFncyAhPSBW RUNfQURWU0lNRCkKICAgIHJldHVybiBmYWxzZTsKCiAgLyogR2V0IHRoZSBuZXcgbW9kZS4gIEFs d2F5cyB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgaW5uZXIKICAgICBhbmQgaGFsZiB0aGUgZWxlbWVu dHMuICAqLwogIHBvbHlfdWludDY0IHZlY19iaXRzID0gR0VUX01PREVfQklUU0laRSAoZC0+dm1v ZGUpOwogIHVuc2lnbmVkIGludCBuZXdfZWx0X2JpdHMgPSBHRVRfTU9ERV9VTklUX0JJVFNJWkUg KGQtPnZtb2RlKSAqIDI7CiAgYXV0byBuZXdfZWx0X21vZGUgPSBpbnRfbW9kZV9mb3Jfc2l6ZSAo bmV3X2VsdF9iaXRzLCBmYWxzZSkucmVxdWlyZSAoKTsKICBtYWNoaW5lX21vZGUgbmV3X21vZGUg PSBhYXJjaDY0X3NpbWRfY29udGFpbmVyX21vZGUgKG5ld19lbHRfbW9kZSwgdmVjX2JpdHMpOwoK ICBpZiAobmV3X21vZGUgPT0gd29yZF9tb2RlKQogICAgcmV0dXJuIGZhbHNlOwoKICAvKiB0b19j b25zdGFudCBpcyBzYWZlIHNpbmNlIHRoaXMgcm91dGluZSBpcyBzcGVjaWZpYyB0byBBZHZhbmNl ZCBTSU1ECiAgICAgdmVjdG9ycy4gICovCiAgbmVsdCA9IGQtPnBlcm0ubGVuZ3RoICgpLnRvX2Nv bnN0YW50ICgpOwoKICB2ZWNfcGVybV9idWlsZGVyIG5ld3Blcm1jb25zdDsKICBuZXdwZXJtY29u c3QubmV3X3ZlY3RvciAobmVsdCAvIDIsIG5lbHQgLyAyLCAxKTsKCiAgLyogQ29udmVydCB0aGUg cGVybSBjb25zdGFudCBpZiB3ZSBjYW4uICBSZXF1aXJlIGV2ZW4sIG9kZCBhcyB0aGUgcGFpcnMu ICAqLwogIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbmVsdDsgaSArPSAyKQogICAgewog ICAgICBwb2x5X2ludDY0IGVsdDAgPSBkLT5wZXJtW2ldOwogICAgICBwb2x5X2ludDY0IGVsdDEg PSBkLT5wZXJtW2kgKyAxXTsKICAgICAgcG9seV9pbnQ2NCBuZXdlbHQ7CiAgICAgIGlmICghbXVs dGlwbGVfcCAoZWx0MCwgMiwgJm5ld2VsdCkgfHwgbWF5YmVfbmUgKGVsdDAgKyAxLCBlbHQxKSkK CXJldHVybiBmYWxzZTsKICAgICAgbmV3cGVybWNvbnN0LnF1aWNrX3B1c2ggKG5ld2VsdC50b19j b25zdGFudCAoKSk7CiAgICB9CiAgbmV3cGVybWNvbnN0LmZpbmFsaXplICgpOwoKICBuZXdkLnZt b2RlID0gbmV3X21vZGU7CiAgbmV3ZC52ZWNfZmxhZ3MgPSBWRUNfQURWU0lNRDsKICBuZXdkLm9w X21vZGUgPSBuZXdkLnZtb2RlOwogIG5ld2Qub3BfdmVjX2ZsYWdzID0gbmV3ZC52ZWNfZmxhZ3M7 CiAgbmV3ZC50YXJnZXQgPSBkLT50YXJnZXQgPyBnZW5fbG93cGFydCAobmV3X21vZGUsIGQtPnRh cmdldCkgOiBOVUxMOwogIG5ld2Qub3AwID0gZC0+b3AwID8gZ2VuX2xvd3BhcnQgKG5ld19tb2Rl LCBkLT5vcDApIDogTlVMTDsKICBuZXdkLm9wMSA9IGQtPm9wMSA/IGdlbl9sb3dwYXJ0IChuZXdf bW9kZSwgZC0+b3AxKSA6IE5VTEw7CiAgbmV3ZC50ZXN0aW5nX3AgPSBkLT50ZXN0aW5nX3A7CiAg bmV3ZC5vbmVfdmVjdG9yX3AgPSBkLT5vbmVfdmVjdG9yX3A7CgogIG5ld2QucGVybS5uZXdfdmVj dG9yIChuZXdwZXJtY29uc3QsIG5ld2Qub25lX3ZlY3Rvcl9wID8gMSA6IDIsIG5lbHQgLyAyKTsK ICByZXR1cm4gYWFyY2g2NF9leHBhbmRfdmVjX3Blcm1fY29uc3RfMSAoJm5ld2QpOwp9CgovKiBS ZWNvZ25pemUgcGF0dGVybnMgc3VpdGFibGUgZm9yIHRoZSBVWlAgaW5zdHJ1Y3Rpb25zLiAgKi8K c3RhdGljIGJvb2wKYWFyY2g2NF9ldnBjX3V6cCAoc3RydWN0IGV4cGFuZF92ZWNfcGVybV9kICpk KQp7CiAgSE9TVF9XSURFX0lOVCBvZGQ7CiAgcnR4IG91dCwgaW4wLCBpbjE7CiAgbWFjaGluZV9t b2RlIHZtb2RlID0gZC0+dm1vZGU7CgogIGlmIChHRVRfTU9ERV9VTklUX1NJWkUgKHZtb2RlKSA+ IDgpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIE5vdGUgdGhhdCB0aGVzZSBhcmUgbGl0dGxlLWVu ZGlhbiB0ZXN0cy4KICAgICBXZSBjb3JyZWN0IGZvciBiaWctZW5kaWFuIGxhdGVyLiAgKi8KICBp ZiAoIWQtPnBlcm1bMF0uaXNfY29uc3RhbnQgKCZvZGQpCiAgICAgIHx8IChvZGQgIT0gMCAmJiBv ZGQgIT0gMSkKICAgICAgfHwgIWQtPnBlcm0uc2VyaWVzX3AgKDAsIDEsIG9kZCwgMikpCiAgICBy ZXR1cm4gZmFsc2U7CgogIC8qIFN1Y2Nlc3MhICAqLwogIGlmIChkLT50ZXN0aW5nX3ApCiAgICBy ZXR1cm4gdHJ1ZTsKCiAgaW4wID0gZC0+b3AwOwogIGluMSA9IGQtPm9wMTsKICAvKiBXZSBkb24n dCBuZWVkIGEgYmlnLWVuZGlhbiBsYW5lIGNvcnJlY3Rpb24gZm9yIFNWRTsgc2VlIHRoZSBjb21t ZW50CiAgICAgYXQgdGhlIGhlYWQgb2YgYWFyY2g2NC1zdmUubWQgZm9yIGRldGFpbHMuICAqLwog IGlmIChCWVRFU19CSUdfRU5ESUFOICYmIGQtPnZlY19mbGFncyA9PSBWRUNfQURWU0lNRCkKICAg IHsKICAgICAgc3RkOjpzd2FwIChpbjAsIGluMSk7CiAgICAgIG9kZCA9ICFvZGQ7CiAgICB9CiAg b3V0ID0gZC0+dGFyZ2V0OwoKICBlbWl0X3NldF9pbnNuIChvdXQsIGdlbl9ydHhfVU5TUEVDICh2 bW9kZSwgZ2VuX3J0dmVjICgyLCBpbjAsIGluMSksCgkJCQkgICAgICBvZGQgPyBVTlNQRUNfVVpQ MiA6IFVOU1BFQ19VWlAxKSk7CiAgcmV0dXJuIHRydWU7Cn0KCi8qIFJlY29nbml6ZSBwYXR0ZXJu cyBzdWl0YWJsZSBmb3IgdGhlIFpJUCBpbnN0cnVjdGlvbnMuICAqLwpzdGF0aWMgYm9vbAphYXJj aDY0X2V2cGNfemlwIChzdHJ1Y3QgZXhwYW5kX3ZlY19wZXJtX2QgKmQpCnsKICB1bnNpZ25lZCBp bnQgaGlnaDsKICBwb2x5X3VpbnQ2NCBuZWx0ID0gZC0+cGVybS5sZW5ndGggKCk7CiAgcnR4IG91 dCwgaW4wLCBpbjE7CiAgbWFjaGluZV9tb2RlIHZtb2RlID0gZC0+dm1vZGU7CgogIGlmIChHRVRf TU9ERV9VTklUX1NJWkUgKHZtb2RlKSA+IDgpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIE5vdGUg dGhhdCB0aGVzZSBhcmUgbGl0dGxlLWVuZGlhbiB0ZXN0cy4KICAgICBXZSBjb3JyZWN0IGZvciBi aWctZW5kaWFuIGxhdGVyLiAgKi8KICBwb2x5X3VpbnQ2NCBmaXJzdCA9IGQtPnBlcm1bMF07CiAg aWYgKChtYXliZV9uZSAoZmlyc3QsIDBVKSAmJiBtYXliZV9uZSAoZmlyc3QgKiAyLCBuZWx0KSkK ICAgICAgfHwgIWQtPnBlcm0uc2VyaWVzX3AgKDAsIDIsIGZpcnN0LCAxKQogICAgICB8fCAhZC0+ cGVybS5zZXJpZXNfcCAoMSwgMiwgZmlyc3QgKyBuZWx0LCAxKSkKICAgIHJldHVybiBmYWxzZTsK ICBoaWdoID0gbWF5YmVfbmUgKGZpcnN0LCAwVSk7CgogIC8qIFN1Y2Nlc3MhICAqLwogIGlmIChk LT50ZXN0aW5nX3ApCiAgICByZXR1cm4gdHJ1ZTsKCiAgaW4wID0gZC0+b3AwOwogIGluMSA9IGQt Pm9wMTsKICAvKiBXZSBkb24ndCBuZWVkIGEgYmlnLWVuZGlhbiBsYW5lIGNvcnJlY3Rpb24gZm9y IFNWRTsgc2VlIHRoZSBjb21tZW50CiAgICAgYXQgdGhlIGhlYWQgb2YgYWFyY2g2NC1zdmUubWQg Zm9yIGRldGFpbHMuICAqLwogIGlmIChCWVRFU19CSUdfRU5ESUFOICYmIGQtPnZlY19mbGFncyA9 PSBWRUNfQURWU0lNRCkKICAgIHsKICAgICAgc3RkOjpzd2FwIChpbjAsIGluMSk7CiAgICAgIGhp Z2ggPSAhaGlnaDsKICAgIH0KICBvdXQgPSBkLT50YXJnZXQ7CgogIGVtaXRfc2V0X2luc24gKG91 dCwgZ2VuX3J0eF9VTlNQRUMgKHZtb2RlLCBnZW5fcnR2ZWMgKDIsIGluMCwgaW4xKSwKCQkJCSAg ICAgIGhpZ2ggPyBVTlNQRUNfWklQMiA6IFVOU1BFQ19aSVAxKSk7CiAgcmV0dXJuIHRydWU7Cn0K Ci8qIFJlY29nbml6ZSBwYXR0ZXJucyBmb3IgdGhlIEVYVCBpbnNuLiAgKi8KCnN0YXRpYyBib29s CmFhcmNoNjRfZXZwY19leHQgKHN0cnVjdCBleHBhbmRfdmVjX3Blcm1fZCAqZCkKewogIEhPU1Rf V0lERV9JTlQgbG9jYXRpb247CiAgcnR4IG9mZnNldDsKCiAgLyogVGhlIGZpcnN0IGVsZW1lbnQg YWx3YXlzIHJlZmVycyB0byB0aGUgZmlyc3QgdmVjdG9yLgogICAgIENoZWNrIGlmIHRoZSBleHRy YWN0ZWQgaW5kaWNlcyBhcmUgaW5jcmVhc2luZyBieSBvbmUuICAqLwogIGlmIChkLT52ZWNfZmxh Z3MgPT0gVkVDX1NWRV9QUkVECiAgICAgIHx8ICFkLT5wZXJtWzBdLmlzX2NvbnN0YW50ICgmbG9j YXRpb24pCiAgICAgIHx8ICFkLT5wZXJtLnNlcmllc19wICgwLCAxLCBsb2NhdGlvbiwgMSkpCiAg ICByZXR1cm4gZmFsc2U7CgogIC8qIFN1Y2Nlc3MhICovCiAgaWYgKGQtPnRlc3RpbmdfcCkKICAg IHJldHVybiB0cnVlOwoKICAvKiBUaGUgY2FzZSB3aGVyZSAobG9jYXRpb24gPT0gMCkgaXMgYSBu by1vcCBmb3IgYm90aCBiaWctIGFuZCBsaXR0bGUtZW5kaWFuLAogICAgIGFuZCBpcyByZW1vdmVk IGJ5IHRoZSBtaWQtZW5kIGF0IG9wdGltaXphdGlvbiBsZXZlbHMgLU8xIGFuZCBoaWdoZXIuCgog ICAgIFdlIGRvbid0IG5lZWQgYSBiaWctZW5kaWFuIGxhbmUgY29ycmVjdGlvbiBmb3IgU1ZFOyBz ZWUgdGhlIGNvbW1lbnQKICAgICBhdCB0aGUgaGVhZCBvZiBhYXJjaDY0LXN2ZS5tZCBmb3IgZGV0 YWlscy4gICovCiAgaWYgKEJZVEVTX0JJR19FTkRJQU4gJiYgbG9jYXRpb24gIT0gMCAmJiBkLT52 ZWNfZmxhZ3MgPT0gVkVDX0FEVlNJTUQpCiAgICB7CiAgICAgIC8qIEFmdGVyIHNldHVwLCB3ZSB3 YW50IHRoZSBoaWdoIGVsZW1lbnRzIG9mIHRoZSBmaXJzdCB2ZWN0b3IgKHN0b3JlZAogICAgICAg ICBhdCB0aGUgTFNCIGVuZCBvZiB0aGUgcmVnaXN0ZXIpLCBhbmQgdGhlIGxvdyBlbGVtZW50cyBv ZiB0aGUgc2Vjb25kCiAgICAgICAgIHZlY3RvciAoc3RvcmVkIGF0IHRoZSBNU0IgZW5kIG9mIHRo ZSByZWdpc3RlcikuIFNvIHN3YXAuICAqLwogICAgICBzdGQ6OnN3YXAgKGQtPm9wMCwgZC0+b3Ax KTsKICAgICAgLyogbG9jYXRpb24gIT0gMCAoYWJvdmUpLCBzbyBzYWZlIHRvIGFzc3VtZSAobmVs dCAtIGxvY2F0aW9uKSA8IG5lbHQuCgkgdG9fY29uc3RhbnQgKCkgaXMgc2FmZSBzaW5jZSB0aGlz IGlzIHJlc3RyaWN0ZWQgdG8gQWR2YW5jZWQgU0lNRAoJIHZlY3RvcnMuICAqLwogICAgICBsb2Nh dGlvbiA9IGQtPnBlcm0ubGVuZ3RoICgpLnRvX2NvbnN0YW50ICgpIC0gbG9jYXRpb247CiAgICB9 CgogIG9mZnNldCA9IEdFTl9JTlQgKGxvY2F0aW9uKTsKICBlbWl0X3NldF9pbnNuIChkLT50YXJn ZXQsCgkJIGdlbl9ydHhfVU5TUEVDIChkLT52bW9kZSwKCQkJCSBnZW5fcnR2ZWMgKDMsIGQtPm9w MCwgZC0+b3AxLCBvZmZzZXQpLAoJCQkJIFVOU1BFQ19FWFQpKTsKICByZXR1cm4gdHJ1ZTsKfQoK LyogUmVjb2duaXplIHBhdHRlcm5zIGZvciB0aGUgUkVWezY0LDMyLDE2fSBpbnNucywgd2hpY2gg cmV2ZXJzZSBlbGVtZW50cwogICB3aXRoaW4gZWFjaCA2NC1iaXQsIDMyLWJpdCBvciAxNi1iaXQg Z3JhbnVsZS4gICovCgpzdGF0aWMgYm9vbAphYXJjaDY0X2V2cGNfcmV2X2xvY2FsIChzdHJ1Y3Qg ZXhwYW5kX3ZlY19wZXJtX2QgKmQpCnsKICBIT1NUX1dJREVfSU5UIGRpZmY7CiAgdW5zaWduZWQg aW50IGksIHNpemUsIHVuc3BlYzsKICBtYWNoaW5lX21vZGUgcHJlZF9tb2RlOwoKICBpZiAoZC0+ dmVjX2ZsYWdzID09IFZFQ19TVkVfUFJFRAogICAgICB8fCAhZC0+b25lX3ZlY3Rvcl9wCiAgICAg IHx8ICFkLT5wZXJtWzBdLmlzX2NvbnN0YW50ICgmZGlmZikKICAgICAgfHwgIWRpZmYpCiAgICBy ZXR1cm4gZmFsc2U7CgogIGlmIChkLT52ZWNfZmxhZ3MgJiBWRUNfU1ZFX0RBVEEpCiAgICBzaXpl ID0gKGRpZmYgKyAxKSAqIGFhcmNoNjRfc3ZlX2NvbnRhaW5lcl9iaXRzIChkLT52bW9kZSk7CiAg ZWxzZQogICAgc2l6ZSA9IChkaWZmICsgMSkgKiBHRVRfTU9ERV9VTklUX0JJVFNJWkUgKGQtPnZt b2RlKTsKICBpZiAoc2l6ZSA9PSA2NCkKICAgIHsKICAgICAgdW5zcGVjID0gVU5TUEVDX1JFVjY0 OwogICAgICBwcmVkX21vZGUgPSBWTngyQkltb2RlOwogICAgfQogIGVsc2UgaWYgKHNpemUgPT0g MzIpCiAgICB7CiAgICAgIHVuc3BlYyA9IFVOU1BFQ19SRVYzMjsKICAgICAgcHJlZF9tb2RlID0g Vk54NEJJbW9kZTsKICAgIH0KICBlbHNlIGlmIChzaXplID09IDE2KQogICAgewogICAgICB1bnNw ZWMgPSBVTlNQRUNfUkVWMTY7CiAgICAgIHByZWRfbW9kZSA9IFZOeDhCSW1vZGU7CiAgICB9CiAg ZWxzZQogICAgcmV0dXJuIGZhbHNlOwoKICB1bnNpZ25lZCBpbnQgc3RlcCA9IGRpZmYgKyAxOwog IGZvciAoaSA9IDA7IGkgPCBzdGVwOyArK2kpCiAgICBpZiAoIWQtPnBlcm0uc2VyaWVzX3AgKGks IHN0ZXAsIGRpZmYgLSBpLCBzdGVwKSkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAvKiBTdWNjZXNz ISAqLwogIGlmIChkLT50ZXN0aW5nX3ApCiAgICByZXR1cm4gdHJ1ZTsKCiAgaWYgKGQtPnZlY19m bGFncyAmIFZFQ19TVkVfREFUQSkKICAgIHsKICAgICAgcnR4IHByZWQgPSBhYXJjaDY0X3B0cnVl X3JlZyAocHJlZF9tb2RlKTsKICAgICAgZW1pdF9pbnNuIChnZW5fYWFyY2g2NF9zdmVfcmV2Ymh3 IChkLT52bW9kZSwgcHJlZF9tb2RlLAoJCQkJCSBkLT50YXJnZXQsIHByZWQsIGQtPm9wMCkpOwog ICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICBydHggc3JjID0gZ2VuX3J0eF9VTlNQRUMgKGQtPnZt b2RlLCBnZW5fcnR2ZWMgKDEsIGQtPm9wMCksIHVuc3BlYyk7CiAgZW1pdF9zZXRfaW5zbiAoZC0+ dGFyZ2V0LCBzcmMpOwogIHJldHVybiB0cnVlOwp9CgovKiBSZWNvZ25pemUgcGF0dGVybnMgZm9y IHRoZSBSRVYgaW5zbiwgd2hpY2ggcmV2ZXJzZXMgZWxlbWVudHMgd2l0aGluCiAgIGEgZnVsbCB2 ZWN0b3IuICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF9ldnBjX3Jldl9nbG9iYWwgKHN0cnVjdCBl eHBhbmRfdmVjX3Blcm1fZCAqZCkKewogIHBvbHlfdWludDY0IG5lbHQgPSBkLT5wZXJtLmxlbmd0 aCAoKTsKCiAgaWYgKCFkLT5vbmVfdmVjdG9yX3AgfHwgZC0+dmVjX2ZsYWdzID09IFZFQ19BRFZT SU1EKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoIWQtPnBlcm0uc2VyaWVzX3AgKDAsIDEsIG5l bHQgLSAxLCAtMSkpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIFN1Y2Nlc3MhICovCiAgaWYgKGQt PnRlc3RpbmdfcCkKICAgIHJldHVybiB0cnVlOwoKICBydHggc3JjID0gZ2VuX3J0eF9VTlNQRUMg KGQtPnZtb2RlLCBnZW5fcnR2ZWMgKDEsIGQtPm9wMCksIFVOU1BFQ19SRVYpOwogIGVtaXRfc2V0 X2luc24gKGQtPnRhcmdldCwgc3JjKTsKICByZXR1cm4gdHJ1ZTsKfQoKc3RhdGljIGJvb2wKYWFy Y2g2NF9ldnBjX2R1cCAoc3RydWN0IGV4cGFuZF92ZWNfcGVybV9kICpkKQp7CiAgcnR4IG91dCA9 IGQtPnRhcmdldDsKICBydHggaW4wOwogIEhPU1RfV0lERV9JTlQgZWx0OwogIG1hY2hpbmVfbW9k ZSB2bW9kZSA9IGQtPnZtb2RlOwogIHJ0eCBsYW5lOwoKICBpZiAoZC0+dmVjX2ZsYWdzID09IFZF Q19TVkVfUFJFRAogICAgICB8fCBkLT5wZXJtLmVuY29kaW5nICgpLmVuY29kZWRfbmVsdHMgKCkg IT0gMQogICAgICB8fCAhZC0+cGVybVswXS5pc19jb25zdGFudCAoJmVsdCkpCiAgICByZXR1cm4g ZmFsc2U7CgogIGlmICgoZC0+dmVjX2ZsYWdzICYgVkVDX1NWRV9EQVRBKQogICAgICAmJiBlbHQg KiAoYWFyY2g2NF9zdmVfY29udGFpbmVyX2JpdHMgKHZtb2RlKSAvIDgpID49IDY0KQogICAgcmV0 dXJuIGZhbHNlOwoKICAvKiBTdWNjZXNzISAqLwogIGlmIChkLT50ZXN0aW5nX3ApCiAgICByZXR1 cm4gdHJ1ZTsKCiAgLyogVGhlIGdlbmVyaWMgcHJlcGFyYXRpb24gaW4gYWFyY2g2NF9leHBhbmRf dmVjX3Blcm1fY29uc3RfMQogICAgIHN3YXBzIHRoZSBvcGVyYW5kIG9yZGVyIGFuZCB0aGUgcGVy bXV0ZSBpbmRpY2VzIGlmIGl0IGZpbmRzCiAgICAgZC0+cGVybVswXSB0byBiZSBpbiB0aGUgc2Vj b25kIG9wZXJhbmQuICBUaHVzLCB3ZSBjYW4gYWx3YXlzCiAgICAgdXNlIGQtPm9wMCBhbmQgbmVl ZCBub3QgZG8gYW55IGV4dHJhIGFyaXRobWV0aWMgdG8gZ2V0IHRoZQogICAgIGNvcnJlY3QgbGFu ZSBudW1iZXIuICAqLwogIGluMCA9IGQtPm9wMDsKICBsYW5lID0gR0VOX0lOVCAoZWx0KTsgLyog VGhlIHBhdHRlcm4gY29ycmVjdHMgZm9yIGJpZy1lbmRpYW4uICAqLwoKICBydHggcGFyYWxsZWwg PSBnZW5fcnR4X1BBUkFMTEVMICh2bW9kZSwgZ2VuX3J0dmVjICgxLCBsYW5lKSk7CiAgcnR4IHNl bGVjdCA9IGdlbl9ydHhfVkVDX1NFTEVDVCAoR0VUX01PREVfSU5ORVIgKHZtb2RlKSwgaW4wLCBw YXJhbGxlbCk7CiAgZW1pdF9zZXRfaW5zbiAob3V0LCBnZW5fcnR4X1ZFQ19EVVBMSUNBVEUgKHZt b2RlLCBzZWxlY3QpKTsKICByZXR1cm4gdHJ1ZTsKfQoKc3RhdGljIGJvb2wKYWFyY2g2NF9ldnBj X3RibCAoc3RydWN0IGV4cGFuZF92ZWNfcGVybV9kICpkKQp7CiAgcnR4IHJwZXJtW01BWF9DT01Q SUxFX1RJTUVfVkVDX0JZVEVTXSwgc2VsOwogIG1hY2hpbmVfbW9kZSB2bW9kZSA9IGQtPnZtb2Rl OwoKICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgaW5kaWNlcyBhcmUgY29uc3RhbnQuICAqLwogIHVu c2lnbmVkIGludCBlbmNvZGVkX25lbHRzID0gZC0+cGVybS5lbmNvZGluZyAoKS5lbmNvZGVkX25l bHRzICgpOwogIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZW5jb2RlZF9uZWx0czsgKytp KQogICAgaWYgKCFkLT5wZXJtW2ldLmlzX2NvbnN0YW50ICgpKQogICAgICByZXR1cm4gZmFsc2U7 CgogIGlmIChkLT50ZXN0aW5nX3ApCiAgICByZXR1cm4gdHJ1ZTsKCiAgLyogR2VuZXJpYyBjb2Rl IHdpbGwgdHJ5IGNvbnN0YW50IHBlcm11dGF0aW9uIHR3aWNlLiAgT25jZSB3aXRoIHRoZQogICAg IG9yaWdpbmFsIG1vZGUgYW5kIGFnYWluIHdpdGggdGhlIGVsZW1lbnRzIGxvd2VyZWQgdG8gUUlt b2RlLgogICAgIFNvIHdhaXQgYW5kIGRvbid0IGRvIHRoZSBzZWxlY3RvciBleHBhbnNpb24gb3Vy c2VsdmVzLiAgKi8KICBpZiAodm1vZGUgIT0gVjhRSW1vZGUgJiYgdm1vZGUgIT0gVjE2UUltb2Rl KQogICAgcmV0dXJuIGZhbHNlOwoKICAvKiB0b19jb25zdGFudCBpcyBzYWZlIHNpbmNlIHRoaXMg cm91dGluZSBpcyBzcGVjaWZpYyB0byBBZHZhbmNlZCBTSU1ECiAgICAgdmVjdG9ycy4gICovCiAg dW5zaWduZWQgaW50IG5lbHQgPSBkLT5wZXJtLmxlbmd0aCAoKS50b19jb25zdGFudCAoKTsKICBm b3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5lbHQ7ICsraSkKICAgIC8qIElmIGJpZy1lbmRp YW4gYW5kIHR3byB2ZWN0b3JzIHdlIGVuZCB1cCB3aXRoIGEgd2VpcmQgbWl4ZWQtZW5kaWFuCiAg ICAgICBtb2RlIG9uIE5FT04uICBSZXZlcnNlIHRoZSBpbmRleCB3aXRoaW4gZWFjaCB3b3JkIGJ1 dCBub3QgdGhlIHdvcmQKICAgICAgIGl0c2VsZi4gIHRvX2NvbnN0YW50IGlzIHNhZmUgYmVjYXVz ZSB3ZSBjaGVja2VkIGlzX2NvbnN0YW50IGFib3ZlLiAgKi8KICAgIHJwZXJtW2ldID0gR0VOX0lO VCAoQllURVNfQklHX0VORElBTgoJCQk/IGQtPnBlcm1baV0udG9fY29uc3RhbnQgKCkgXiAobmVs dCAtIDEpCgkJCTogZC0+cGVybVtpXS50b19jb25zdGFudCAoKSk7CgogIHNlbCA9IGdlbl9ydHhf Q09OU1RfVkVDVE9SICh2bW9kZSwgZ2VuX3J0dmVjX3YgKG5lbHQsIHJwZXJtKSk7CiAgc2VsID0g Zm9yY2VfcmVnICh2bW9kZSwgc2VsKTsKCiAgYWFyY2g2NF9leHBhbmRfdmVjX3Blcm1fMSAoZC0+ dGFyZ2V0LCBkLT5vcDAsIGQtPm9wMSwgc2VsKTsKICByZXR1cm4gdHJ1ZTsKfQoKLyogVHJ5IHRv IGltcGxlbWVudCBEIHVzaW5nIGFuIFNWRSBUQkwgaW5zdHJ1Y3Rpb24uICAqLwoKc3RhdGljIGJv b2wKYWFyY2g2NF9ldnBjX3N2ZV90YmwgKHN0cnVjdCBleHBhbmRfdmVjX3Blcm1fZCAqZCkKewog IHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbmVsdDsKCiAgLyogUGVybXV0aW5nIHR3byB2YXJpYWJs ZS1sZW5ndGggdmVjdG9ycyBjb3VsZCBvdmVyZmxvdyB0aGUKICAgICBpbmRleCByYW5nZS4gICov CiAgaWYgKCFkLT5vbmVfdmVjdG9yX3AgJiYgIWQtPnBlcm0ubGVuZ3RoICgpLmlzX2NvbnN0YW50 ICgmbmVsdCkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChkLT50ZXN0aW5nX3ApCiAgICByZXR1 cm4gdHJ1ZTsKCiAgbWFjaGluZV9tb2RlIHNlbF9tb2RlID0gcmVsYXRlZF9pbnRfdmVjdG9yX21v ZGUgKGQtPnZtb2RlKS5yZXF1aXJlICgpOwogIHJ0eCBzZWwgPSB2ZWNfcGVybV9pbmRpY2VzX3Rv X3J0eCAoc2VsX21vZGUsIGQtPnBlcm0pOwogIGlmIChkLT5vbmVfdmVjdG9yX3ApCiAgICBlbWl0 X3Vuc3BlYzIgKGQtPnRhcmdldCwgVU5TUEVDX1RCTCwgZC0+b3AwLCBmb3JjZV9yZWcgKHNlbF9t b2RlLCBzZWwpKTsKICBlbHNlCiAgICBhYXJjaDY0X2V4cGFuZF9zdmVfdmVjX3Blcm0gKGQtPnRh cmdldCwgZC0+b3AwLCBkLT5vcDEsIHNlbCk7CiAgcmV0dXJuIHRydWU7Cn0KCi8qIFRyeSB0byBp bXBsZW1lbnQgRCB1c2luZyBTVkUgZHVwIGluc3RydWN0aW9uLiAgKi8KCnN0YXRpYyBib29sCmFh cmNoNjRfZXZwY19zdmVfZHVwIChzdHJ1Y3QgZXhwYW5kX3ZlY19wZXJtX2QgKmQpCnsKICBpZiAo QllURVNfQklHX0VORElBTgogICAgICB8fCAhZC0+b25lX3ZlY3Rvcl9wCiAgICAgIHx8IGQtPnZl Y19mbGFncyAhPSBWRUNfU1ZFX0RBVEEKICAgICAgfHwgZC0+b3BfdmVjX2ZsYWdzICE9IFZFQ19B RFZTSU1ECiAgICAgIHx8IGQtPnBlcm0uZW5jb2RpbmcgKCkubmVsdHNfcGVyX3BhdHRlcm4gKCkg IT0gMQogICAgICB8fCAha25vd25fZXEgKGQtPnBlcm0uZW5jb2RpbmcgKCkubnBhdHRlcm5zICgp LAoJCSAgICBHRVRfTU9ERV9OVU5JVFMgKGQtPm9wX21vZGUpKQogICAgICB8fCAha25vd25fZXEg KEdFVF9NT0RFX0JJVFNJWkUgKGQtPm9wX21vZGUpLCAxMjgpKQogICAgcmV0dXJuIGZhbHNlOwoK ICBpbnQgbnBhdHRlcm5zID0gZC0+cGVybS5lbmNvZGluZyAoKS5ucGF0dGVybnMgKCk7CiAgZm9y IChpbnQgaSA9IDA7IGkgPCBucGF0dGVybnM7IGkrKykKICAgIGlmICgha25vd25fZXEgKGQtPnBl cm1baV0sIGkpKQogICAgICByZXR1cm4gZmFsc2U7CgogIGlmIChkLT50ZXN0aW5nX3ApCiAgICBy ZXR1cm4gdHJ1ZTsKCiAgYWFyY2g2NF9leHBhbmRfc3ZlX2R1cHEgKGQtPnRhcmdldCwgR0VUX01P REUgKGQtPnRhcmdldCksIGQtPm9wMCk7CiAgcmV0dXJuIHRydWU7Cn0KCi8qIFRyeSB0byBpbXBs ZW1lbnQgRCB1c2luZyBTVkUgU0VMIGluc3RydWN0aW9uLiAgKi8KCnN0YXRpYyBib29sCmFhcmNo NjRfZXZwY19zZWwgKHN0cnVjdCBleHBhbmRfdmVjX3Blcm1fZCAqZCkKewogIG1hY2hpbmVfbW9k ZSB2bW9kZSA9IGQtPnZtb2RlOwogIGludCB1bml0X3NpemUgPSBHRVRfTU9ERV9VTklUX1NJWkUg KHZtb2RlKTsKCiAgaWYgKGQtPnZlY19mbGFncyAhPSBWRUNfU1ZFX0RBVEEKICAgICAgfHwgdW5p dF9zaXplID4gOCkKICAgIHJldHVybiBmYWxzZTsKCiAgaW50IG5fcGF0dGVybnMgPSBkLT5wZXJt LmVuY29kaW5nICgpLm5wYXR0ZXJucyAoKTsKICBwb2x5X2ludDY0IHZlY19sZW4gPSBkLT5wZXJt Lmxlbmd0aCAoKTsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuX3BhdHRlcm5zOyArK2kpCiAgICBp ZiAoIWtub3duX2VxIChkLT5wZXJtW2ldLCBpKQoJJiYgIWtub3duX2VxIChkLT5wZXJtW2ldLCB2 ZWNfbGVuICsgaSkpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgZm9yIChpbnQgaSA9IG5fcGF0dGVy bnM7IGkgPCBuX3BhdHRlcm5zICogMjsgaSsrKQogICAgaWYgKCFkLT5wZXJtLnNlcmllc19wIChp LCBuX3BhdHRlcm5zLCBpLCBuX3BhdHRlcm5zKQoJJiYgIWQtPnBlcm0uc2VyaWVzX3AgKGksIG5f cGF0dGVybnMsIHZlY19sZW4gKyBpLCBuX3BhdHRlcm5zKSkKICAgICAgcmV0dXJuIGZhbHNlOwoK ICBpZiAoZC0+dGVzdGluZ19wKQogICAgcmV0dXJuIHRydWU7CgogIG1hY2hpbmVfbW9kZSBwcmVk X21vZGUgPSBhYXJjaDY0X3N2ZV9wcmVkX21vZGUgKHZtb2RlKTsKCiAgLyogQnVpbGQgYSBwcmVk aWNhdGUgdGhhdCBpcyB0cnVlIHdoZW4gb3AwIGVsZW1lbnRzIHNob3VsZCBiZSB1c2VkLiAgKi8K ICBydHhfdmVjdG9yX2J1aWxkZXIgYnVpbGRlciAocHJlZF9tb2RlLCBuX3BhdHRlcm5zLCAyKTsK ICBmb3IgKGludCBpID0gMDsgaSA8IG5fcGF0dGVybnMgKiAyOyBpKyspCiAgICB7CiAgICAgIHJ0 eCBlbGVtID0ga25vd25fZXEgKGQtPnBlcm1baV0sIGkpID8gQ09OU1QxX1JUWCAoQkltb2RlKQoJ CQkJCSAgOiBDT05TVDBfUlRYIChCSW1vZGUpOwogICAgICBidWlsZGVyLnF1aWNrX3B1c2ggKGVs ZW0pOwogICAgfQoKICBydHggY29uc3RfdmVjID0gYnVpbGRlci5idWlsZCAoKTsKICBydHggcHJl ZCA9IGZvcmNlX3JlZyAocHJlZF9tb2RlLCBjb25zdF92ZWMpOwogIC8qIFRBUkdFVCA9IFBSRUQg PyBPUDAgOiBPUDEuICAqLwogIGVtaXRfaW5zbiAoZ2VuX3Zjb25kX21hc2sgKHZtb2RlLCB2bW9k ZSwgZC0+dGFyZ2V0LCBkLT5vcDAsIGQtPm9wMSwgcHJlZCkpOwogIHJldHVybiB0cnVlOwp9Cgov KiBSZWNvZ25pemUgcGF0dGVybnMgc3VpdGFibGUgZm9yIHRoZSBJTlMgaW5zdHJ1Y3Rpb25zLiAg Ki8Kc3RhdGljIGJvb2wKYWFyY2g2NF9ldnBjX2lucyAoc3RydWN0IGV4cGFuZF92ZWNfcGVybV9k ICpkKQp7CiAgbWFjaGluZV9tb2RlIG1vZGUgPSBkLT52bW9kZTsKICB1bnNpZ25lZCBIT1NUX1dJ REVfSU5UIG5lbHQ7CgogIGlmIChkLT52ZWNfZmxhZ3MgIT0gVkVDX0FEVlNJTUQpCiAgICByZXR1 cm4gZmFsc2U7CgogIC8qIHRvX2NvbnN0YW50IGlzIHNhZmUgc2luY2UgdGhpcyByb3V0aW5lIGlz IHNwZWNpZmljIHRvIEFkdmFuY2VkIFNJTUQKICAgICB2ZWN0b3JzLiAgKi8KICBuZWx0ID0gZC0+ cGVybS5sZW5ndGggKCkudG9fY29uc3RhbnQgKCk7CiAgcnR4IGluc3YgPSBkLT5vcDA7CgogIEhP U1RfV0lERV9JTlQgaWR4ID0gLTE7CgogIGZvciAodW5zaWduZWQgSE9TVF9XSURFX0lOVCBpID0g MDsgaSA8IG5lbHQ7IGkrKykKICAgIHsKICAgICAgSE9TVF9XSURFX0lOVCBlbHQ7CiAgICAgIGlm ICghZC0+cGVybVtpXS5pc19jb25zdGFudCAoJmVsdCkpCglyZXR1cm4gZmFsc2U7CiAgICAgIGlm IChlbHQgPT0gKEhPU1RfV0lERV9JTlQpIGkpCgljb250aW51ZTsKICAgICAgaWYgKGlkeCAhPSAt MSkKCXsKCSAgaWR4ID0gLTE7CgkgIGJyZWFrOwoJfQogICAgICBpZHggPSBpOwogICAgfQoKICBp ZiAoaWR4ID09IC0xKQogICAgewogICAgICBpbnN2ID0gZC0+b3AxOwogICAgICBmb3IgKHVuc2ln bmVkIEhPU1RfV0lERV9JTlQgaSA9IDA7IGkgPCBuZWx0OyBpKyspCgl7CgkgIGlmIChkLT5wZXJt W2ldLnRvX2NvbnN0YW50ICgpID09IChIT1NUX1dJREVfSU5UKSAoaSArIG5lbHQpKQoJICAgIGNv bnRpbnVlOwoJICBpZiAoaWR4ICE9IC0xKQoJICAgIHJldHVybiBmYWxzZTsKCSAgaWR4ID0gaTsK CX0KCiAgICAgIGlmIChpZHggPT0gLTEpCglyZXR1cm4gZmFsc2U7CiAgICB9CgogIGlmIChkLT50 ZXN0aW5nX3ApCiAgICByZXR1cm4gdHJ1ZTsKCiAgZ2NjX2Fzc2VydCAoaWR4ICE9IC0xKTsKCiAg dW5zaWduZWQgZXh0cmFjdGluZGV4ID0gZC0+cGVybVtpZHhdLnRvX2NvbnN0YW50ICgpOwogIHJ0 eCBleHRyYWN0diA9IGQtPm9wMDsKICBpZiAoZXh0cmFjdGluZGV4ID49IG5lbHQpCiAgICB7CiAg ICAgIGV4dHJhY3R2ID0gZC0+b3AxOwogICAgICBleHRyYWN0aW5kZXggLT0gbmVsdDsKICAgIH0K ICBnY2NfYXNzZXJ0IChleHRyYWN0aW5kZXggPCBuZWx0KTsKCiAgaW5zbl9jb2RlIGljb2RlID0g Y29kZV9mb3JfYWFyY2g2NF9zaW1kX3ZlY19jb3B5X2xhbmUgKG1vZGUpOwogIGV4cGFuZF9vcGVy YW5kIG9wc1s1XTsKICBjcmVhdGVfb3V0cHV0X29wZXJhbmQgKCZvcHNbMF0sIGQtPnRhcmdldCwg bW9kZSk7CiAgY3JlYXRlX2lucHV0X29wZXJhbmQgKCZvcHNbMV0sIGluc3YsIG1vZGUpOwogIGNy ZWF0ZV9pbnRlZ2VyX29wZXJhbmQgKCZvcHNbMl0sIDEgPDwgaWR4KTsKICBjcmVhdGVfaW5wdXRf b3BlcmFuZCAoJm9wc1szXSwgZXh0cmFjdHYsIG1vZGUpOwogIGNyZWF0ZV9pbnRlZ2VyX29wZXJh bmQgKCZvcHNbNF0sIGV4dHJhY3RpbmRleCk7CiAgZXhwYW5kX2luc24gKGljb2RlLCA1LCBvcHMp OwoKICByZXR1cm4gdHJ1ZTsKfQoKc3RhdGljIGJvb2wKYWFyY2g2NF9leHBhbmRfdmVjX3Blcm1f Y29uc3RfMSAoc3RydWN0IGV4cGFuZF92ZWNfcGVybV9kICpkKQp7CiAgZ2NjX2Fzc2VydCAoZC0+ b3BfbW9kZSAhPSBFX1ZPSURtb2RlKTsKCiAgLyogVGhlIHBhdHRlcm4gbWF0Y2hpbmcgZnVuY3Rp b25zIGFib3ZlIGFyZSB3cml0dGVuIHRvIGxvb2sgZm9yIGEgc21hbGwKICAgICBudW1iZXIgdG8g YmVnaW4gdGhlIHNlcXVlbmNlICgwLCAxLCBOLzIpLiAgSWYgd2UgYmVnaW4gd2l0aCBhbiBpbmRl eAogICAgIGZyb20gdGhlIHNlY29uZCBvcGVyYW5kLCB3ZSBjYW4gc3dhcCB0aGUgb3BlcmFuZHMu ICAqLwogIHBvbHlfaW50NjQgbmVsdCA9IGQtPnBlcm0ubGVuZ3RoICgpOwogIGlmIChrbm93bl9n ZSAoZC0+cGVybVswXSwgbmVsdCkpCiAgICB7CiAgICAgIGQtPnBlcm0ucm90YXRlX2lucHV0cyAo MSk7CiAgICAgIHN0ZDo6c3dhcCAoZC0+b3AwLCBkLT5vcDEpOwogICAgfQoKICBpZiAoKChkLT52 ZWNfZmxhZ3MgPT0gVkVDX0FEVlNJTUQgJiYgVEFSR0VUX1NJTUQpCiAgICAgICB8fCBkLT52ZWNf ZmxhZ3MgPT0gVkVDX1NWRV9EQVRBCiAgICAgICB8fCBkLT52ZWNfZmxhZ3MgPT0gKFZFQ19TVkVf REFUQSB8IFZFQ19QQVJUSUFMKQogICAgICAgfHwgZC0+dmVjX2ZsYWdzID09IFZFQ19TVkVfUFJF RCkKICAgICAgJiYga25vd25fZ3QgKG5lbHQsIDEpKQogICAgewogICAgICBpZiAoZC0+dm1vZGUg PT0gZC0+b3BfbW9kZSkKCXsKCSAgaWYgKGFhcmNoNjRfZXZwY19yZXZfbG9jYWwgKGQpKQoJICAg IHJldHVybiB0cnVlOwoJICBlbHNlIGlmIChhYXJjaDY0X2V2cGNfcmV2X2dsb2JhbCAoZCkpCgkg ICAgcmV0dXJuIHRydWU7CgkgIGVsc2UgaWYgKGFhcmNoNjRfZXZwY19leHQgKGQpKQoJICAgIHJl dHVybiB0cnVlOwoJICBlbHNlIGlmIChhYXJjaDY0X2V2cGNfZHVwIChkKSkKCSAgICByZXR1cm4g dHJ1ZTsKCSAgZWxzZSBpZiAoYWFyY2g2NF9ldnBjX3ppcCAoZCkpCgkgICAgcmV0dXJuIHRydWU7 CgkgIGVsc2UgaWYgKGFhcmNoNjRfZXZwY191enAgKGQpKQoJICAgIHJldHVybiB0cnVlOwoJICBl bHNlIGlmIChhYXJjaDY0X2V2cGNfdHJuIChkKSkKCSAgICByZXR1cm4gdHJ1ZTsKCSAgZWxzZSBp ZiAoYWFyY2g2NF9ldnBjX3NlbCAoZCkpCgkgICAgcmV0dXJuIHRydWU7CgkgIGVsc2UgaWYgKGFh cmNoNjRfZXZwY19pbnMgKGQpKQoJICAgIHJldHVybiB0cnVlOwoJICBlbHNlIGlmIChhYXJjaDY0 X2V2cGNfcmVlbmNvZGUgKGQpKQoJICAgIHJldHVybiB0cnVlOwoKCSAgaWYgKGQtPnZlY19mbGFn cyA9PSBWRUNfU1ZFX0RBVEEpCgkgICAgcmV0dXJuIGFhcmNoNjRfZXZwY19zdmVfdGJsIChkKTsK CSAgZWxzZSBpZiAoZC0+dmVjX2ZsYWdzID09IFZFQ19BRFZTSU1EKQoJICAgIHJldHVybiBhYXJj aDY0X2V2cGNfdGJsIChkKTsKCX0KICAgICAgZWxzZQoJewoJICBpZiAoYWFyY2g2NF9ldnBjX3N2 ZV9kdXAgKGQpKQoJICAgIHJldHVybiB0cnVlOwoJfQogICAgfQogIHJldHVybiBmYWxzZTsKfQoK LyogSW1wbGVtZW50IFRBUkdFVF9WRUNUT1JJWkVfVkVDX1BFUk1fQ09OU1QuICAqLwoKc3RhdGlj IGJvb2wKYWFyY2g2NF92ZWN0b3JpemVfdmVjX3Blcm1fY29uc3QgKG1hY2hpbmVfbW9kZSB2bW9k ZSwgbWFjaGluZV9tb2RlIG9wX21vZGUsCgkJCQkgIHJ0eCB0YXJnZXQsIHJ0eCBvcDAsIHJ0eCBv cDEsCgkJCQkgIGNvbnN0IHZlY19wZXJtX2luZGljZXMgJnNlbCkKewogIHN0cnVjdCBleHBhbmRf dmVjX3Blcm1fZCBkOwoKICAvKiBDaGVjayB3aGV0aGVyIHRoZSBtYXNrIGNhbiBiZSBhcHBsaWVk IHRvIGEgc2luZ2xlIHZlY3Rvci4gICovCiAgaWYgKHNlbC5uaW5wdXRzICgpID09IDEKICAgICAg fHwgKG9wMCAmJiBydHhfZXF1YWxfcCAob3AwLCBvcDEpKSkKICAgIGQub25lX3ZlY3Rvcl9wID0g dHJ1ZTsKICBlbHNlIGlmIChzZWwuYWxsX2Zyb21faW5wdXRfcCAoMCkpCiAgICB7CiAgICAgIGQu b25lX3ZlY3Rvcl9wID0gdHJ1ZTsKICAgICAgb3AxID0gb3AwOwogICAgfQogIGVsc2UgaWYgKHNl bC5hbGxfZnJvbV9pbnB1dF9wICgxKSkKICAgIHsKICAgICAgZC5vbmVfdmVjdG9yX3AgPSB0cnVl OwogICAgICBvcDAgPSBvcDE7CiAgICB9CiAgZWxzZQogICAgZC5vbmVfdmVjdG9yX3AgPSBmYWxz ZTsKCiAgZC5wZXJtLm5ld192ZWN0b3IgKHNlbC5lbmNvZGluZyAoKSwgZC5vbmVfdmVjdG9yX3Ag PyAxIDogMiwKCQkgICAgIHNlbC5uZWx0c19wZXJfaW5wdXQgKCkpOwogIGQudm1vZGUgPSB2bW9k ZTsKICBkLnZlY19mbGFncyA9IGFhcmNoNjRfY2xhc3NpZnlfdmVjdG9yX21vZGUgKGQudm1vZGUp OwogIGQub3BfbW9kZSA9IG9wX21vZGU7CiAgZC5vcF92ZWNfZmxhZ3MgPSBhYXJjaDY0X2NsYXNz aWZ5X3ZlY3Rvcl9tb2RlIChkLm9wX21vZGUpOwogIGQudGFyZ2V0ID0gdGFyZ2V0OwogIGQub3Aw ID0gb3AwID8gZm9yY2VfcmVnIChvcF9tb2RlLCBvcDApIDogTlVMTF9SVFg7CiAgaWYgKG9wMCA9 PSBvcDEpCiAgICBkLm9wMSA9IGQub3AwOwogIGVsc2UKICAgIGQub3AxID0gb3AxID8gZm9yY2Vf cmVnIChvcF9tb2RlLCBvcDEpIDogTlVMTF9SVFg7CiAgZC50ZXN0aW5nX3AgPSAhdGFyZ2V0OwoK ICBpZiAoIWQudGVzdGluZ19wKQogICAgcmV0dXJuIGFhcmNoNjRfZXhwYW5kX3ZlY19wZXJtX2Nv bnN0XzEgKCZkKTsKCiAgcnR4X2luc24gKmxhc3QgPSBnZXRfbGFzdF9pbnNuICgpOwogIGJvb2wg cmV0ID0gYWFyY2g2NF9leHBhbmRfdmVjX3Blcm1fY29uc3RfMSAoJmQpOwogIGdjY19hc3NlcnQg KGxhc3QgPT0gZ2V0X2xhc3RfaW5zbiAoKSk7CgogIHJldHVybiByZXQ7Cn0KLyogR2VuZXJhdGUg YSBieXRlIHBlcm11dGUgbWFzayBmb3IgYSByZWdpc3RlciBvZiBtb2RlIE1PREUsCiAgIHdoaWNo IGhhcyBOVU5JVFMgdW5pdHMuICAqLwoKcnR4CmFhcmNoNjRfcmV2ZXJzZV9tYXNrIChtYWNoaW5l X21vZGUgbW9kZSwgdW5zaWduZWQgaW50IG51bml0cykKewogIC8qIFdlIGhhdmUgdG8gcmV2ZXJz ZSBlYWNoIHZlY3RvciBiZWNhdXNlIHdlIGRvbnQgaGF2ZQogICAgIGEgcGVybXV0ZWQgbG9hZCB0 aGF0IGNhbiByZXZlcnNlLWxvYWQgYWNjb3JkaW5nIHRvIEFCSSBydWxlcy4gICovCiAgcnR4IG1h c2s7CiAgcnR2ZWMgdiA9IHJ0dmVjX2FsbG9jICgxNik7CiAgdW5zaWduZWQgaW50IGksIGo7CiAg dW5zaWduZWQgaW50IHVzaXplID0gR0VUX01PREVfVU5JVF9TSVpFIChtb2RlKTsKCiAgZ2NjX2Fz c2VydCAoQllURVNfQklHX0VORElBTik7CiAgZ2NjX2Fzc2VydCAoQUFSQ0g2NF9WQUxJRF9TSU1E X1FSRUdfTU9ERSAobW9kZSkpOwoKICBmb3IgKGkgPSAwOyBpIDwgbnVuaXRzOyBpKyspCiAgICBm b3IgKGogPSAwOyBqIDwgdXNpemU7IGorKykKICAgICAgUlRWRUNfRUxUICh2LCBpICogdXNpemUg KyBqKSA9IEdFTl9JTlQgKChpICsgMSkgKiB1c2l6ZSAtIDEgLSBqKTsKICBtYXNrID0gZ2VuX3J0 eF9DT05TVF9WRUNUT1IgKFYxNlFJbW9kZSwgdik7CiAgcmV0dXJuIGZvcmNlX3JlZyAoVjE2UUlt b2RlLCBtYXNrKTsKfQoKLyogRXhwYW5kIGFuIFNWRSBpbnRlZ2VyIGNvbXBhcmlzb24gdXNpbmcg dGhlIFNWRSBlcXVpdmFsZW50IG9mOgoKICAgICAoc2V0IFRBUkdFVCAoQ09ERSBPUDAgT1AxKSku ICAqLwoKdm9pZAphYXJjaDY0X2V4cGFuZF9zdmVfdmVjX2NtcF9pbnQgKHJ0eCB0YXJnZXQsIHJ0 eF9jb2RlIGNvZGUsIHJ0eCBvcDAsIHJ0eCBvcDEpCnsKICBtYWNoaW5lX21vZGUgcHJlZF9tb2Rl ID0gR0VUX01PREUgKHRhcmdldCk7CiAgbWFjaGluZV9tb2RlIGRhdGFfbW9kZSA9IEdFVF9NT0RF IChvcDApOwogIHJ0eCByZXMgPSBhYXJjaDY0X3N2ZV9lbWl0X2ludF9jbXAgKHRhcmdldCwgcHJl ZF9tb2RlLCBjb2RlLCBkYXRhX21vZGUsCgkJCQkgICAgICBvcDAsIG9wMSk7CiAgaWYgKCFydHhf ZXF1YWxfcCAodGFyZ2V0LCByZXMpKQogICAgZW1pdF9tb3ZlX2luc24gKHRhcmdldCwgcmVzKTsK fQoKLyogUmV0dXJuIHRoZSBVTlNQRUNfQ09ORF8qIGNvZGUgZm9yIGNvbXBhcmlzb24gQ09ERS4g ICovCgpzdGF0aWMgdW5zaWduZWQgaW50CmFhcmNoNjRfdW5zcGVjX2NvbmRfY29kZSAocnR4X2Nv ZGUgY29kZSkKewogIHN3aXRjaCAoY29kZSkKICAgIHsKICAgIGNhc2UgTkU6CiAgICAgIHJldHVy biBVTlNQRUNfQ09ORF9GQ01ORTsKICAgIGNhc2UgRVE6CiAgICAgIHJldHVybiBVTlNQRUNfQ09O RF9GQ01FUTsKICAgIGNhc2UgTFQ6CiAgICAgIHJldHVybiBVTlNQRUNfQ09ORF9GQ01MVDsKICAg IGNhc2UgR1Q6CiAgICAgIHJldHVybiBVTlNQRUNfQ09ORF9GQ01HVDsKICAgIGNhc2UgTEU6CiAg ICAgIHJldHVybiBVTlNQRUNfQ09ORF9GQ01MRTsKICAgIGNhc2UgR0U6CiAgICAgIHJldHVybiBV TlNQRUNfQ09ORF9GQ01HRTsKICAgIGNhc2UgVU5PUkRFUkVEOgogICAgICByZXR1cm4gVU5TUEVD X0NPTkRfRkNNVU87CiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CiAgICB9 Cn0KCi8qIEVtaXQ6CgogICAgICAoc2V0IFRBUkdFVCAodW5zcGVjIFtQUkVEIEtOT1dOX1BUUlVF X1AgT1AwIE9QMV0gVU5TUEVDX0NPTkRfPFg+KSkKCiAgIHdoZXJlIDxYPiBpcyB0aGUgb3BlcmF0 aW9uIGFzc29jaWF0ZWQgd2l0aCBjb21wYXJpc29uIENPREUuCiAgIEtOT1dOX1BUUlVFX1AgaXMg dHJ1ZSBpZiBQUkVEIGlzIGtub3duIHRvIGJlIGEgUFRSVUUuICAqLwoKc3RhdGljIHZvaWQKYWFy Y2g2NF9lbWl0X3N2ZV9mcF9jb25kIChydHggdGFyZ2V0LCBydHhfY29kZSBjb2RlLCBydHggcHJl ZCwKCQkJICBib29sIGtub3duX3B0cnVlX3AsIHJ0eCBvcDAsIHJ0eCBvcDEpCnsKICBydHggZmxh ZyA9IGdlbl9pbnRfbW9kZSAoa25vd25fcHRydWVfcCwgU0ltb2RlKTsKICBydHggdW5zcGVjID0g Z2VuX3J0eF9VTlNQRUMgKEdFVF9NT0RFIChwcmVkKSwKCQkJICAgICAgIGdlbl9ydHZlYyAoNCwg cHJlZCwgZmxhZywgb3AwLCBvcDEpLAoJCQkgICAgICAgYWFyY2g2NF91bnNwZWNfY29uZF9jb2Rl IChjb2RlKSk7CiAgZW1pdF9zZXRfaW5zbiAodGFyZ2V0LCB1bnNwZWMpOwp9CgovKiBFbWl0IHRo ZSBTVkUgZXF1aXZhbGVudCBvZjoKCiAgICAgIChzZXQgVE1QMSAodW5zcGVjIFtQUkVEIEtOT1dO X1BUUlVFX1AgT1AwIE9QMV0gVU5TUEVDX0NPTkRfPFgxPikpCiAgICAgIChzZXQgVE1QMiAodW5z cGVjIFtQUkVEIEtOT1dOX1BUUlVFX1AgT1AwIE9QMV0gVU5TUEVDX0NPTkRfPFgyPikpCiAgICAg IChzZXQgVEFSR0VUIChpb3I6UFJFRF9NT0RFIFRNUDEgVE1QMikpCgogICB3aGVyZSA8WGk+IGlz IHRoZSBvcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIGNvbXBhcmlzb24gQ09ERWkuCiAgIEtOT1dO X1BUUlVFX1AgaXMgdHJ1ZSBpZiBQUkVEIGlzIGtub3duIHRvIGJlIGEgUFRSVUUuICAqLwoKc3Rh dGljIHZvaWQKYWFyY2g2NF9lbWl0X3N2ZV9vcl9mcF9jb25kcyAocnR4IHRhcmdldCwgcnR4X2Nv ZGUgY29kZTEsIHJ0eF9jb2RlIGNvZGUyLAoJCQkgICAgICBydHggcHJlZCwgYm9vbCBrbm93bl9w dHJ1ZV9wLCBydHggb3AwLCBydHggb3AxKQp7CiAgbWFjaGluZV9tb2RlIHByZWRfbW9kZSA9IEdF VF9NT0RFIChwcmVkKTsKICBydHggdG1wMSA9IGdlbl9yZWdfcnR4IChwcmVkX21vZGUpOwogIGFh cmNoNjRfZW1pdF9zdmVfZnBfY29uZCAodG1wMSwgY29kZTEsIHByZWQsIGtub3duX3B0cnVlX3As IG9wMCwgb3AxKTsKICBydHggdG1wMiA9IGdlbl9yZWdfcnR4IChwcmVkX21vZGUpOwogIGFhcmNo NjRfZW1pdF9zdmVfZnBfY29uZCAodG1wMiwgY29kZTIsIHByZWQsIGtub3duX3B0cnVlX3AsIG9w MCwgb3AxKTsKICBhYXJjaDY0X2VtaXRfYmlub3AgKHRhcmdldCwgaW9yX29wdGFiLCB0bXAxLCB0 bXAyKTsKfQoKLyogRW1pdCB0aGUgU1ZFIGVxdWl2YWxlbnQgb2Y6CgogICAgICAoc2V0IFRNUCAo dW5zcGVjIFtQUkVEIEtOT1dOX1BUUlVFX1AgT1AwIE9QMV0gVU5TUEVDX0NPTkRfPFg+KSkKICAg ICAgKHNldCBUQVJHRVQgKG5vdCBUTVApKQoKICAgd2hlcmUgPFg+IGlzIHRoZSBvcGVyYXRpb24g YXNzb2NpYXRlZCB3aXRoIGNvbXBhcmlzb24gQ09ERS4KICAgS05PV05fUFRSVUVfUCBpcyB0cnVl IGlmIFBSRUQgaXMga25vd24gdG8gYmUgYSBQVFJVRS4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0 X2VtaXRfc3ZlX2ludmVydF9mcF9jb25kIChydHggdGFyZ2V0LCBydHhfY29kZSBjb2RlLCBydHgg cHJlZCwKCQkJCSBib29sIGtub3duX3B0cnVlX3AsIHJ0eCBvcDAsIHJ0eCBvcDEpCnsKICBtYWNo aW5lX21vZGUgcHJlZF9tb2RlID0gR0VUX01PREUgKHByZWQpOwogIHJ0eCB0bXAgPSBnZW5fcmVn X3J0eCAocHJlZF9tb2RlKTsKICBhYXJjaDY0X2VtaXRfc3ZlX2ZwX2NvbmQgKHRtcCwgY29kZSwg cHJlZCwga25vd25fcHRydWVfcCwgb3AwLCBvcDEpOwogIGFhcmNoNjRfZW1pdF91bm9wICh0YXJn ZXQsIG9uZV9jbXBsX29wdGFiLCB0bXApOwp9CgovKiBFeHBhbmQgYW4gU1ZFIGZsb2F0aW5nLXBv aW50IGNvbXBhcmlzb24gdXNpbmcgdGhlIFNWRSBlcXVpdmFsZW50IG9mOgoKICAgICAoc2V0IFRB UkdFVCAoQ09ERSBPUDAgT1AxKSkKCiAgIElmIENBTl9JTlZFUlRfUCBpcyB0cnVlLCB0aGUgY2Fs bGVyIGNhbiBhbHNvIGhhbmRsZSBpbnZlcnRlZCByZXN1bHRzOwogICByZXR1cm4gdHJ1ZSBpZiB0 aGUgcmVzdWx0IGlzIGluIGZhY3QgaW52ZXJ0ZWQuICAqLwoKYm9vbAphYXJjaDY0X2V4cGFuZF9z dmVfdmVjX2NtcF9mbG9hdCAocnR4IHRhcmdldCwgcnR4X2NvZGUgY29kZSwKCQkJCSAgcnR4IG9w MCwgcnR4IG9wMSwgYm9vbCBjYW5faW52ZXJ0X3ApCnsKICBtYWNoaW5lX21vZGUgcHJlZF9tb2Rl ID0gR0VUX01PREUgKHRhcmdldCk7CiAgbWFjaGluZV9tb2RlIGRhdGFfbW9kZSA9IEdFVF9NT0RF IChvcDApOwoKICBydHggcHRydWUgPSBhYXJjaDY0X3B0cnVlX3JlZyAocHJlZF9tb2RlKTsKICBz d2l0Y2ggKGNvZGUpCiAgICB7CiAgICBjYXNlIFVOT1JERVJFRDoKICAgICAgLyogVU5PUkRFUkVE IGhhcyBubyBpbW1lZGlhdGUgZm9ybS4gICovCiAgICAgIG9wMSA9IGZvcmNlX3JlZyAoZGF0YV9t b2RlLCBvcDEpOwogICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgIGNhc2UgTFQ6CiAgICBjYXNl IExFOgogICAgY2FzZSBHVDoKICAgIGNhc2UgR0U6CiAgICBjYXNlIEVROgogICAgY2FzZSBORToK ICAgICAgewoJLyogVGhlcmUgaXMgbmF0aXZlIHN1cHBvcnQgZm9yIHRoZSBjb21wYXJpc29uLiAg Ki8KCWFhcmNoNjRfZW1pdF9zdmVfZnBfY29uZCAodGFyZ2V0LCBjb2RlLCBwdHJ1ZSwgdHJ1ZSwg b3AwLCBvcDEpOwoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgY2FzZSBMVEdUOgogICAgICAv KiBUaGlzIGlzIGEgdHJhcHBpbmcgb3BlcmF0aW9uIChMVCBvciBHVCkuICAqLwogICAgICBhYXJj aDY0X2VtaXRfc3ZlX29yX2ZwX2NvbmRzICh0YXJnZXQsIExULCBHVCwgcHRydWUsIHRydWUsIG9w MCwgb3AxKTsKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhc2UgVU5FUToKICAgICAgaWYgKCFm bGFnX3RyYXBwaW5nX21hdGgpCgl7CgkgIC8qIFRoaXMgd291bGQgdHJhcCBmb3Igc2lnbmFsaW5n IE5hTnMuICAqLwoJICBvcDEgPSBmb3JjZV9yZWcgKGRhdGFfbW9kZSwgb3AxKTsKCSAgYWFyY2g2 NF9lbWl0X3N2ZV9vcl9mcF9jb25kcyAodGFyZ2V0LCBVTk9SREVSRUQsIEVRLAoJCQkJCXB0cnVl LCB0cnVlLCBvcDAsIG9wMSk7CgkgIHJldHVybiBmYWxzZTsKCX0KICAgICAgLyogZmFsbCB0aHJv dWdoICovCiAgICBjYXNlIFVOTFQ6CiAgICBjYXNlIFVOTEU6CiAgICBjYXNlIFVOR1Q6CiAgICBj YXNlIFVOR0U6CiAgICAgIGlmIChmbGFnX3RyYXBwaW5nX21hdGgpCgl7CgkgIC8qIFdvcmsgb3V0 IHdoaWNoIGVsZW1lbnRzIGFyZSBvcmRlcmVkLiAgKi8KCSAgcnR4IG9yZGVyZWQgPSBnZW5fcmVn X3J0eCAocHJlZF9tb2RlKTsKCSAgb3AxID0gZm9yY2VfcmVnIChkYXRhX21vZGUsIG9wMSk7Cgkg IGFhcmNoNjRfZW1pdF9zdmVfaW52ZXJ0X2ZwX2NvbmQgKG9yZGVyZWQsIFVOT1JERVJFRCwKCQkJ CQkgICBwdHJ1ZSwgdHJ1ZSwgb3AwLCBvcDEpOwoKCSAgLyogVGVzdCB0aGUgb3Bwb3NpdGUgY29u ZGl0aW9uIGZvciB0aGUgb3JkZXJlZCBlbGVtZW50cywKCSAgICAgdGhlbiBpbnZlcnQgdGhlIHJl c3VsdC4gICovCgkgIGlmIChjb2RlID09IFVORVEpCgkgICAgY29kZSA9IE5FOwoJICBlbHNlCgkg ICAgY29kZSA9IHJldmVyc2VfY29uZGl0aW9uX21heWJlX3Vub3JkZXJlZCAoY29kZSk7CgkgIGlm IChjYW5faW52ZXJ0X3ApCgkgICAgewoJICAgICAgYWFyY2g2NF9lbWl0X3N2ZV9mcF9jb25kICh0 YXJnZXQsIGNvZGUsCgkJCQkJb3JkZXJlZCwgZmFsc2UsIG9wMCwgb3AxKTsKCSAgICAgIHJldHVy biB0cnVlOwoJICAgIH0KCSAgYWFyY2g2NF9lbWl0X3N2ZV9pbnZlcnRfZnBfY29uZCAodGFyZ2V0 LCBjb2RlLAoJCQkJCSAgIG9yZGVyZWQsIGZhbHNlLCBvcDAsIG9wMSk7CgkgIHJldHVybiBmYWxz ZTsKCX0KICAgICAgYnJlYWs7CgogICAgY2FzZSBPUkRFUkVEOgogICAgICAvKiBPUkRFUkVEIGhh cyBubyBpbW1lZGlhdGUgZm9ybS4gICovCiAgICAgIG9wMSA9IGZvcmNlX3JlZyAoZGF0YV9tb2Rl LCBvcDEpOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICBnY2NfdW5yZWFjaGFibGUg KCk7CiAgICB9CgogIC8qIFRoZXJlIGlzIG5hdGl2ZSBzdXBwb3J0IGZvciB0aGUgaW52ZXJzZSBj b21wYXJpc29uLiAgKi8KICBjb2RlID0gcmV2ZXJzZV9jb25kaXRpb25fbWF5YmVfdW5vcmRlcmVk IChjb2RlKTsKICBpZiAoY2FuX2ludmVydF9wKQogICAgewogICAgICBhYXJjaDY0X2VtaXRfc3Zl X2ZwX2NvbmQgKHRhcmdldCwgY29kZSwgcHRydWUsIHRydWUsIG9wMCwgb3AxKTsKICAgICAgcmV0 dXJuIHRydWU7CiAgICB9CiAgYWFyY2g2NF9lbWl0X3N2ZV9pbnZlcnRfZnBfY29uZCAodGFyZ2V0 LCBjb2RlLCBwdHJ1ZSwgdHJ1ZSwgb3AwLCBvcDEpOwogIHJldHVybiBmYWxzZTsKfQoKLyogRXhw YW5kIGFuIFNWRSB2Y29uZCBwYXR0ZXJuIHdpdGggb3BlcmFuZHMgT1BTLiAgREFUQV9NT0RFIGlz IHRoZSBtb2RlCiAgIG9mIHRoZSBkYXRhIGJlaW5nIHNlbGVjdGVkIGFuZCBDTVBfTU9ERSBpcyB0 aGUgbW9kZSBvZiB0aGUgdmFsdWVzIGJlaW5nCiAgIGNvbXBhcmVkLiAgKi8KCnZvaWQKYWFyY2g2 NF9leHBhbmRfc3ZlX3Zjb25kIChtYWNoaW5lX21vZGUgZGF0YV9tb2RlLCBtYWNoaW5lX21vZGUg Y21wX21vZGUsCgkJCSAgcnR4ICpvcHMpCnsKICBtYWNoaW5lX21vZGUgcHJlZF9tb2RlID0gYWFy Y2g2NF9nZXRfbWFza19tb2RlIChjbXBfbW9kZSkucmVxdWlyZSAoKTsKICBydHggcHJlZCA9IGdl bl9yZWdfcnR4IChwcmVkX21vZGUpOwogIGlmIChGTE9BVF9NT0RFX1AgKGNtcF9tb2RlKSkKICAg IHsKICAgICAgaWYgKGFhcmNoNjRfZXhwYW5kX3N2ZV92ZWNfY21wX2Zsb2F0IChwcmVkLCBHRVRf Q09ERSAob3BzWzNdKSwKCQkJCQkgICAgb3BzWzRdLCBvcHNbNV0sIHRydWUpKQoJc3RkOjpzd2Fw IChvcHNbMV0sIG9wc1syXSk7CiAgICB9CiAgZWxzZQogICAgYWFyY2g2NF9leHBhbmRfc3ZlX3Zl Y19jbXBfaW50IChwcmVkLCBHRVRfQ09ERSAob3BzWzNdKSwgb3BzWzRdLCBvcHNbNV0pOwoKICBp ZiAoIWFhcmNoNjRfc3ZlX3JlZ19vcl9kdXBfaW1tIChvcHNbMV0sIGRhdGFfbW9kZSkpCiAgICBv cHNbMV0gPSBmb3JjZV9yZWcgKGRhdGFfbW9kZSwgb3BzWzFdKTsKICAvKiBUaGUgImZhbHNlIiB2 YWx1ZSBjYW4gb25seSBiZSB6ZXJvIGlmIHRoZSAidHJ1ZSIgdmFsdWUgaXMgYSBjb25zdGFudC4g ICovCiAgaWYgKHJlZ2lzdGVyX29wZXJhbmQgKG9wc1sxXSwgZGF0YV9tb2RlKQogICAgICB8fCAh YWFyY2g2NF9zaW1kX3JlZ19vcl96ZXJvIChvcHNbMl0sIGRhdGFfbW9kZSkpCiAgICBvcHNbMl0g PSBmb3JjZV9yZWcgKGRhdGFfbW9kZSwgb3BzWzJdKTsKCiAgcnR2ZWMgdmVjID0gZ2VuX3J0dmVj ICgzLCBwcmVkLCBvcHNbMV0sIG9wc1syXSk7CiAgZW1pdF9zZXRfaW5zbiAob3BzWzBdLCBnZW5f cnR4X1VOU1BFQyAoZGF0YV9tb2RlLCB2ZWMsIFVOU1BFQ19TRUwpKTsKfQoKLyogSW1wbGVtZW50 IFRBUkdFVF9NT0RFU19USUVBQkxFX1AuICBJbiBwcmluY2lwbGUgd2Ugc2hvdWxkIGFsd2F5cyBy ZXR1cm4KICAgdHJ1ZS4gIEhvd2V2ZXIgZHVlIHRvIGlzc3VlcyB3aXRoIHJlZ2lzdGVyIGFsbG9j YXRpb24gaXQgaXMgcHJlZmVyYWJsZQogICB0byBhdm9pZCB0aWVpbmcgaW50ZWdlciBzY2FsYXIg YW5kIEZQIHNjYWxhciBtb2Rlcy4gIEV4ZWN1dGluZyBpbnRlZ2VyCiAgIG9wZXJhdGlvbnMgaW4g Z2VuZXJhbCByZWdpc3RlcnMgaXMgYmV0dGVyIHRoYW4gdHJlYXRpbmcgdGhlbSBhcyBzY2FsYXIK ICAgdmVjdG9yIG9wZXJhdGlvbnMuICBUaGlzIHJlZHVjZXMgbGF0ZW5jeSBhbmQgYXZvaWRzIHJl ZHVuZGFudCBpbnQ8LT5GUAogICBtb3Zlcy4gIFNvIHRpZSBtb2RlcyBpZiB0aGV5IGFyZSBlaXRo ZXIgdGhlIHNhbWUgY2xhc3MsIG9yIHZlY3RvciBtb2RlcwogICB3aXRoIG90aGVyIHZlY3RvciBt b2RlcywgdmVjdG9yIHN0cnVjdHMgb3IgYW55IHNjYWxhciBtb2RlLiAgKi8KCnN0YXRpYyBib29s CmFhcmNoNjRfbW9kZXNfdGllYWJsZV9wIChtYWNoaW5lX21vZGUgbW9kZTEsIG1hY2hpbmVfbW9k ZSBtb2RlMikKewogIGlmICgoYWFyY2g2NF9hZHZzaW1kX3BhcnRpYWxfc3RydWN0X21vZGVfcCAo bW9kZTEpCiAgICAgICAhPSBhYXJjaDY0X2FkdnNpbWRfcGFydGlhbF9zdHJ1Y3RfbW9kZV9wICht b2RlMikpCiAgICAgICYmIG1heWJlX2d0IChHRVRfTU9ERV9TSVpFIChtb2RlMSksIDgpCiAgICAg ICYmIG1heWJlX2d0IChHRVRfTU9ERV9TSVpFIChtb2RlMiksIDgpKQogICAgcmV0dXJuIGZhbHNl OwoKICBpZiAoR0VUX01PREVfQ0xBU1MgKG1vZGUxKSA9PSBHRVRfTU9ERV9DTEFTUyAobW9kZTIp KQogICAgcmV0dXJuIHRydWU7CgogIC8qIFdlIHNwZWNpZmljYWxseSB3YW50IHRvIGFsbG93IGVs ZW1lbnRzIG9mICJzdHJ1Y3R1cmUiIG1vZGVzIHRvCiAgICAgYmUgdGllYWJsZSB0byB0aGUgc3Ry dWN0dXJlLiAgVGhpcyBtb3JlIGdlbmVyYWwgY29uZGl0aW9uIGFsbG93cwogICAgIG90aGVyIHJh cmVyIHNpdHVhdGlvbnMgdG9vLiAgVGhlIHJlYXNvbiB3ZSBkb24ndCBleHRlbmQgdGhpcyB0bwog ICAgIHByZWRpY2F0ZSBtb2RlcyBpcyB0aGF0IHRoZXJlIGFyZSBubyBwcmVkaWNhdGUgc3RydWN0 dXJlIG1vZGVzCiAgICAgbm9yIGFueSBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgZm9yIGV4dHJhY3Rp bmcgcGFydCBvZiBhIHByZWRpY2F0ZQogICAgIHJlZ2lzdGVyLiAgKi8KICBpZiAoYWFyY2g2NF92 ZWN0b3JfZGF0YV9tb2RlX3AgKG1vZGUxKQogICAgICAmJiBhYXJjaDY0X3ZlY3Rvcl9kYXRhX21v ZGVfcCAobW9kZTIpKQogICAgcmV0dXJuIHRydWU7CgogIC8qIEFsc28gYWxsb3cgYW55IHNjYWxh ciBtb2RlcyB3aXRoIHZlY3RvcnMuICAqLwogIGlmIChhYXJjaDY0X3ZlY3Rvcl9tb2RlX3N1cHBv cnRlZF9wIChtb2RlMSkKICAgICAgfHwgYWFyY2g2NF92ZWN0b3JfbW9kZV9zdXBwb3J0ZWRfcCAo bW9kZTIpKQogICAgcmV0dXJuIHRydWU7CgogIHJldHVybiBmYWxzZTsKfQoKLyogUmV0dXJuIGEg bmV3IFJUWCBob2xkaW5nIHRoZSByZXN1bHQgb2YgbW92aW5nIFBPSU5URVIgZm9yd2FyZCBieQog ICBBTU9VTlQgYnl0ZXMuICAqLwoKc3RhdGljIHJ0eAphYXJjaDY0X21vdmVfcG9pbnRlciAocnR4 IHBvaW50ZXIsIHBvbHlfaW50NjQgYW1vdW50KQp7CiAgcnR4IG5leHQgPSBwbHVzX2NvbnN0YW50 IChQbW9kZSwgWEVYUCAocG9pbnRlciwgMCksIGFtb3VudCk7CgogIHJldHVybiBhZGp1c3RfYXV0 b21vZGlmeV9hZGRyZXNzIChwb2ludGVyLCBHRVRfTU9ERSAocG9pbnRlciksCgkJCQkgICAgbmV4 dCwgYW1vdW50KTsKfQoKLyogUmV0dXJuIGEgbmV3IFJUWCBob2xkaW5nIHRoZSByZXN1bHQgb2Yg bW92aW5nIFBPSU5URVIgZm9yd2FyZCBieSB0aGUKICAgc2l6ZSBvZiB0aGUgbW9kZSBpdCBwb2lu dHMgdG8uICAqLwoKc3RhdGljIHJ0eAphYXJjaDY0X3Byb2dyZXNzX3BvaW50ZXIgKHJ0eCBwb2lu dGVyKQp7CiAgcmV0dXJuIGFhcmNoNjRfbW92ZV9wb2ludGVyIChwb2ludGVyLCBHRVRfTU9ERV9T SVpFIChHRVRfTU9ERSAocG9pbnRlcikpKTsKfQoKLyogQ29weSBvbmUgTU9ERSBzaXplZCBibG9j ayBmcm9tIFNSQyB0byBEU1QsIHRoZW4gcHJvZ3Jlc3MgU1JDIGFuZCBEU1QgYnkKICAgTU9ERSBi eXRlcy4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X2NvcHlfb25lX2Jsb2NrX2FuZF9wcm9ncmVz c19wb2ludGVycyAocnR4ICpzcmMsIHJ0eCAqZHN0LAoJCQkJCSAgICAgIG1hY2hpbmVfbW9kZSBt b2RlKQp7CiAgLyogSGFuZGxlIDI1Ni1iaXQgbWVtY3B5IHNlcGFyYXRlbHkuICBXZSBkbyB0aGlz IGJ5IG1ha2luZyAyIGFkamFjZW50IG1lbW9yeQogICAgIGFkZHJlc3MgY29waWVzIHVzaW5nIFY0 U0ltb2RlIHNvIHRoYXQgd2UgY2FuIHVzZSBRIHJlZ2lzdGVycy4gICovCiAgaWYgKGtub3duX2Vx IChHRVRfTU9ERV9CSVRTSVpFIChtb2RlKSwgMjU2KSkKICAgIHsKICAgICAgbW9kZSA9IFY0U0lt b2RlOwogICAgICBydHggcmVnMSA9IGdlbl9yZWdfcnR4IChtb2RlKTsKICAgICAgcnR4IHJlZzIg PSBnZW5fcmVnX3J0eCAobW9kZSk7CiAgICAgIC8qICJDYXN0IiB0aGUgcG9pbnRlcnMgdG8gdGhl IGNvcnJlY3QgbW9kZS4gICovCiAgICAgICpzcmMgPSBhZGp1c3RfYWRkcmVzcyAoKnNyYywgbW9k ZSwgMCk7CiAgICAgICpkc3QgPSBhZGp1c3RfYWRkcmVzcyAoKmRzdCwgbW9kZSwgMCk7CiAgICAg IC8qIEVtaXQgdGhlIG1lbWNweS4gICovCiAgICAgIGVtaXRfaW5zbiAoYWFyY2g2NF9nZW5fbG9h ZF9wYWlyIChtb2RlLCByZWcxLCAqc3JjLCByZWcyLAoJCQkJCWFhcmNoNjRfcHJvZ3Jlc3NfcG9p bnRlciAoKnNyYykpKTsKICAgICAgZW1pdF9pbnNuIChhYXJjaDY0X2dlbl9zdG9yZV9wYWlyICht b2RlLCAqZHN0LCByZWcxLAoJCQkJCSBhYXJjaDY0X3Byb2dyZXNzX3BvaW50ZXIgKCpkc3QpLCBy ZWcyKSk7CiAgICAgIC8qIE1vdmUgdGhlIHBvaW50ZXJzIGZvcndhcmQuICAqLwogICAgICAqc3Jj ID0gYWFyY2g2NF9tb3ZlX3BvaW50ZXIgKCpzcmMsIDMyKTsKICAgICAgKmRzdCA9IGFhcmNoNjRf bW92ZV9wb2ludGVyICgqZHN0LCAzMik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgcnR4IHJlZyA9 IGdlbl9yZWdfcnR4IChtb2RlKTsKCiAgLyogIkNhc3QiIHRoZSBwb2ludGVycyB0byB0aGUgY29y cmVjdCBtb2RlLiAgKi8KICAqc3JjID0gYWRqdXN0X2FkZHJlc3MgKCpzcmMsIG1vZGUsIDApOwog ICpkc3QgPSBhZGp1c3RfYWRkcmVzcyAoKmRzdCwgbW9kZSwgMCk7CiAgLyogRW1pdCB0aGUgbWVt Y3B5LiAgKi8KICBlbWl0X21vdmVfaW5zbiAocmVnLCAqc3JjKTsKICBlbWl0X21vdmVfaW5zbiAo KmRzdCwgcmVnKTsKICAvKiBNb3ZlIHRoZSBwb2ludGVycyBmb3J3YXJkLiAgKi8KICAqc3JjID0g YWFyY2g2NF9wcm9ncmVzc19wb2ludGVyICgqc3JjKTsKICAqZHN0ID0gYWFyY2g2NF9wcm9ncmVz c19wb2ludGVyICgqZHN0KTsKfQoKLyogRXhwYW5kIGEgY3B5bWVtIHVzaW5nIHRoZSBNT1BTIGV4 dGVuc2lvbi4gIE9QRVJBTkRTIGFyZSB0YWtlbgogICBmcm9tIHRoZSBjcHltZW0gcGF0dGVybi4g IFJldHVybiB0cnVlIGlmZiB3ZSBzdWNjZWVkZWQuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X2V4 cGFuZF9jcHltZW1fbW9wcyAocnR4ICpvcGVyYW5kcykKewogIGlmICghVEFSR0VUX01PUFMpCiAg ICByZXR1cm4gZmFsc2U7CgogIC8qIEFsbCB0aHJlZSByZWdpc3RlcnMgYXJlIGNoYW5nZWQgYnkg dGhlIGluc3RydWN0aW9uLCBzbyBlYWNoIG9uZQogICAgIG11c3QgYmUgYSBmcmVzaCBwc2V1ZG8u ICAqLwogIHJ0eCBkc3RfYWRkciA9IGNvcHlfdG9fbW9kZV9yZWcgKFBtb2RlLCBYRVhQIChvcGVy YW5kc1swXSwgMCkpOwogIHJ0eCBzcmNfYWRkciA9IGNvcHlfdG9fbW9kZV9yZWcgKFBtb2RlLCBY RVhQIChvcGVyYW5kc1sxXSwgMCkpOwogIHJ0eCBkc3RfbWVtID0gcmVwbGFjZV9lcXVpdl9hZGRy ZXNzIChvcGVyYW5kc1swXSwgZHN0X2FkZHIpOwogIHJ0eCBzcmNfbWVtID0gcmVwbGFjZV9lcXVp dl9hZGRyZXNzIChvcGVyYW5kc1sxXSwgc3JjX2FkZHIpOwogIHJ0eCBzel9yZWcgPSBjb3B5X3Rv X21vZGVfcmVnIChESW1vZGUsIG9wZXJhbmRzWzJdKTsKICBlbWl0X2luc24gKGdlbl9hYXJjaDY0 X2NweW1lbWRpIChkc3RfbWVtLCBzcmNfbWVtLCBzel9yZWcpKTsKCiAgcmV0dXJuIHRydWU7Cn0K Ci8qIEV4cGFuZCBjcHltZW0sIGFzIGlmIGZyb20gYSBfX2J1aWx0aW5fbWVtY3B5LiAgUmV0dXJu IHRydWUgaWYKICAgd2Ugc3VjY2VlZCwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZSwgaW5kaWNhdGlu ZyB0aGF0IGEgbGliY2FsbCB0bwogICBtZW1jcHkgc2hvdWxkIGJlIGVtaXR0ZWQuICAqLwoKYm9v bAphYXJjaDY0X2V4cGFuZF9jcHltZW0gKHJ0eCAqb3BlcmFuZHMpCnsKICBpbnQgbW9kZV9iaXRz OwogIHJ0eCBkc3QgPSBvcGVyYW5kc1swXTsKICBydHggc3JjID0gb3BlcmFuZHNbMV07CiAgcnR4 IGJhc2U7CiAgbWFjaGluZV9tb2RlIGN1cl9tb2RlID0gQkxLbW9kZTsKCiAgLyogVmFyaWFibGUt c2l6ZWQgbWVtY3B5IGNhbiBnbyB0aHJvdWdoIHRoZSBNT1BTIGV4cGFuc2lvbiBpZiBhdmFpbGFi bGUuICAqLwogIGlmICghQ09OU1RfSU5UX1AgKG9wZXJhbmRzWzJdKSkKICAgIHJldHVybiBhYXJj aDY0X2V4cGFuZF9jcHltZW1fbW9wcyAob3BlcmFuZHMpOwoKICB1bnNpZ25lZCBIT1NUX1dJREVf SU5UIHNpemUgPSBJTlRWQUwgKG9wZXJhbmRzWzJdKTsKCiAgLyogVHJ5IHRvIGlubGluZSB1cCB0 byAyNTYgYnl0ZXMgb3IgdXNlIHRoZSBNT1BTIHRocmVzaG9sZCBpZiBhdmFpbGFibGUuICAqLwog IHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbWF4X2NvcHlfc2l6ZQogICAgPSBUQVJHRVRfTU9QUyA/ IGFhcmNoNjRfbW9wc19tZW1jcHlfc2l6ZV90aHJlc2hvbGQgOiAyNTY7CgogIGJvb2wgc2l6ZV9w ID0gb3B0aW1pemVfZnVuY3Rpb25fZm9yX3NpemVfcCAoY2Z1bik7CgogIC8qIExhcmdlIGNvbnN0 YW50LXNpemVkIGNweW1lbSBzaG91bGQgZ28gdGhyb3VnaCBNT1BTIHdoZW4gcG9zc2libGUuCiAg ICAgSXQgc2hvdWxkIGJlIGEgd2luIGV2ZW4gZm9yIHNpemUgb3B0aW1pemF0aW9uIGluIHRoZSBn ZW5lcmFsIGNhc2UuCiAgICAgRm9yIHNwZWVkIG9wdGltaXphdGlvbiB0aGUgY2hvaWNlIGJldHdl ZW4gTU9QUyBhbmQgdGhlIFNJTUQgc2VxdWVuY2UKICAgICBkZXBlbmRzIG9uIHRoZSBzaXplIG9m IHRoZSBjb3B5LCByYXRoZXIgdGhhbiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLAogICAgIGFsaWdu bWVudCBldGMuICAqLwogIGlmIChzaXplID4gbWF4X2NvcHlfc2l6ZSkKICAgIHJldHVybiBhYXJj aDY0X2V4cGFuZF9jcHltZW1fbW9wcyAob3BlcmFuZHMpOwoKICBpbnQgY29weV9iaXRzID0gMjU2 OwoKICAvKiBEZWZhdWx0IHRvIDI1Ni1iaXQgTERQL1NUUCBvbiBsYXJnZSBjb3BpZXMsIGhvd2V2 ZXIgc21hbGwgY29waWVzLCBubyBTSU1ECiAgICAgc3VwcG9ydCBvciBzbG93IDI1Ni1iaXQgTERQ L1NUUCBmYWxsIGJhY2sgdG8gMTI4LWJpdCBjaHVua3MuICAqLwogIGlmIChzaXplIDw9IDI0CiAg ICAgIHx8ICFUQVJHRVRfU0lNRAogICAgICB8fCAoYWFyY2g2NF90dW5lX3BhcmFtcy5leHRyYV90 dW5pbmdfZmxhZ3MKCSAgJiBBQVJDSDY0X0VYVFJBX1RVTkVfTk9fTERQX1NUUF9RUkVHUykpCiAg ICBjb3B5X2JpdHMgPSAxMjg7CgogIC8qIEVtaXQgYW4gaW5saW5lIGxvYWQrc3RvcmUgc2VxdWVu Y2UgYW5kIGNvdW50IHRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucwogICAgIGludm9sdmVkLiAgV2Ug dXNlIGEgc2ltcGxlIGNvdW50IG9mIGp1c3QgdGhlIGxvYWRzIGFuZCBzdG9yZXMgZW1pdHRlZAog ICAgIHJhdGhlciB0aGFuIHJ0eF9pbnNuIGNvdW50IGFzIGFsbCB0aGUgcG9pbnRlciBhZGp1c3Rt ZW50cyBhbmQgcmVnIGNvcHlpbmcKICAgICBpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ2V0IG9wdGlt aXplZCBhd2F5IGxhdGVyIGluIHRoZSBwaXBlbGluZS4gICovCiAgc3RhcnRfc2VxdWVuY2UgKCk7 CiAgdW5zaWduZWQgbm9wcyA9IDA7CgogIGJhc2UgPSBjb3B5X3RvX21vZGVfcmVnIChQbW9kZSwg WEVYUCAoZHN0LCAwKSk7CiAgZHN0ID0gYWRqdXN0X2F1dG9tb2RpZnlfYWRkcmVzcyAoZHN0LCBW T0lEbW9kZSwgYmFzZSwgMCk7CgogIGJhc2UgPSBjb3B5X3RvX21vZGVfcmVnIChQbW9kZSwgWEVY UCAoc3JjLCAwKSk7CiAgc3JjID0gYWRqdXN0X2F1dG9tb2RpZnlfYWRkcmVzcyAoc3JjLCBWT0lE bW9kZSwgYmFzZSwgMCk7CgogIC8qIENvbnZlcnQgc2l6ZSB0byBiaXRzIHRvIG1ha2UgdGhlIHJl c3Qgb2YgdGhlIGNvZGUgc2ltcGxlci4gICovCiAgaW50IG4gPSBzaXplICogQklUU19QRVJfVU5J VDsKCiAgd2hpbGUgKG4gPiAwKQogICAgewogICAgICAvKiBGaW5kIHRoZSBsYXJnZXN0IG1vZGUg aW4gd2hpY2ggdG8gZG8gdGhlIGNvcHkgaW4gd2l0aG91dCBvdmVyIHJlYWRpbmcKCSBvciB3cml0 aW5nLiAgKi8KICAgICAgb3B0X3NjYWxhcl9pbnRfbW9kZSBtb2RlX2l0ZXI7CiAgICAgIEZPUl9F QUNIX01PREVfSU5fQ0xBU1MgKG1vZGVfaXRlciwgTU9ERV9JTlQpCglpZiAoR0VUX01PREVfQklU U0laRSAobW9kZV9pdGVyLnJlcXVpcmUgKCkpIDw9IE1JTiAobiwgY29weV9iaXRzKSkKCSAgY3Vy X21vZGUgPSBtb2RlX2l0ZXIucmVxdWlyZSAoKTsKCiAgICAgIGdjY19hc3NlcnQgKGN1cl9tb2Rl ICE9IEJMS21vZGUpOwoKICAgICAgbW9kZV9iaXRzID0gR0VUX01PREVfQklUU0laRSAoY3VyX21v ZGUpLnRvX2NvbnN0YW50ICgpOwoKICAgICAgLyogUHJlZmVyIFEtcmVnaXN0ZXIgYWNjZXNzZXMg Zm9yIHRoZSBsYXN0IGJ5dGVzLiAgKi8KICAgICAgaWYgKG1vZGVfYml0cyA9PSAxMjggJiYgY29w eV9iaXRzID09IDI1NikKCWN1cl9tb2RlID0gVjRTSW1vZGU7CgogICAgICBhYXJjaDY0X2NvcHlf b25lX2Jsb2NrX2FuZF9wcm9ncmVzc19wb2ludGVycyAoJnNyYywgJmRzdCwgY3VyX21vZGUpOwog ICAgICAvKiBBIHNpbmdsZSBibG9jayBjb3B5IGlzIDEgbG9hZCArIDEgc3RvcmUuICAqLwogICAg ICBub3BzICs9IDI7CiAgICAgIG4gLT0gbW9kZV9iaXRzOwoKICAgICAgLyogRW1pdCB0cmFpbGlu ZyBjb3BpZXMgdXNpbmcgb3ZlcmxhcHBpbmcgdW5hbGlnbmVkIGFjY2Vzc2VzCgkod2hlbiAhU1RS SUNUX0FMSUdOTUVOVCkgLSB0aGlzIGlzIHNtYWxsZXIgYW5kIGZhc3Rlci4gICovCiAgICAgIGlm IChuID4gMCAmJiBuIDwgY29weV9iaXRzIC8gMiAmJiAhU1RSSUNUX0FMSUdOTUVOVCkKCXsKCSAg bWFjaGluZV9tb2RlIG5leHRfbW9kZSA9IHNtYWxsZXN0X21vZGVfZm9yX3NpemUgKG4sIE1PREVf SU5UKTsKCSAgaW50IG5fYml0cyA9IEdFVF9NT0RFX0JJVFNJWkUgKG5leHRfbW9kZSkudG9fY29u c3RhbnQgKCk7CgkgIGdjY19hc3NlcnQgKG5fYml0cyA8PSBtb2RlX2JpdHMpOwoJICBzcmMgPSBh YXJjaDY0X21vdmVfcG9pbnRlciAoc3JjLCAobiAtIG5fYml0cykgLyBCSVRTX1BFUl9VTklUKTsK CSAgZHN0ID0gYWFyY2g2NF9tb3ZlX3BvaW50ZXIgKGRzdCwgKG4gLSBuX2JpdHMpIC8gQklUU19Q RVJfVU5JVCk7CgkgIG4gPSBuX2JpdHM7Cgl9CiAgICB9CiAgcnR4X2luc24gKnNlcSA9IGdldF9p bnNucyAoKTsKICBlbmRfc2VxdWVuY2UgKCk7CiAgLyogTU9QUyBzZXF1ZW5jZSByZXF1aXJlcyAz IGluc3RydWN0aW9ucyBmb3IgdGhlIG1lbW9yeSBjb3B5aW5nICsgMSB0byBtb3ZlCiAgICAgdGhl IGNvbnN0YW50IHNpemUgaW50byBhIHJlZ2lzdGVyLiAgKi8KICB1bnNpZ25lZCBtb3BzX2Nvc3Qg PSAzICsgMTsKCiAgLyogSWYgTU9QUyBpcyBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCB3ZSBkb24n dCBjb25zaWRlciB0aGUgbGliY2FsbCBhcyBpdCdzCiAgICAgbm90IGEgd2luIGV2ZW4gb24gY29k ZSBzaXplLiAgQXQgdGhpcyBwb2ludCBvbmx5IGNvbnNpZGVyIE1PUFMgaWYKICAgICBvcHRpbWl6 aW5nIGZvciBzaXplLiAgRm9yIHNwZWVkIG9wdGltaXphdGlvbnMgd2Ugd2lsbCBoYXZlIGNob3Nl biBiZXR3ZWVuCiAgICAgdGhlIHR3byBiYXNlZCBvbiBjb3B5IHNpemUgYWxyZWFkeS4gICovCiAg aWYgKFRBUkdFVF9NT1BTKQogICAgewogICAgICBpZiAoc2l6ZV9wICYmIG1vcHNfY29zdCA8IG5v cHMpCglyZXR1cm4gYWFyY2g2NF9leHBhbmRfY3B5bWVtX21vcHMgKG9wZXJhbmRzKTsKICAgICAg ZW1pdF9pbnNuIChzZXEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgLyogQSBtZW1jcHkg bGliY2FsbCBpbiB0aGUgd29yc3QgY2FzZSB0YWtlcyAzIGluc3RydWN0aW9ucyB0byBwcmVwYXJl IHRoZQogICAgIGFyZ3VtZW50cyArIDEgZm9yIHRoZSBjYWxsLiAgV2hlbiBNT1BTIGlzIG5vdCBh dmFpbGFibGUgYW5kIHdlJ3JlCiAgICAgb3B0aW1pemluZyBmb3Igc2l6ZSBhIGxpYmNhbGwgbWF5 IGJlIHByZWZlcmFibGUuICAqLwogIHVuc2lnbmVkIGxpYmNhbGxfY29zdCA9IDQ7CiAgaWYgKHNp emVfcCAmJiBsaWJjYWxsX2Nvc3QgPCBub3BzKQogICAgcmV0dXJuIGZhbHNlOwoKICBlbWl0X2lu c24gKHNlcSk7CiAgcmV0dXJuIHRydWU7Cn0KCi8qIExpa2UgYWFyY2g2NF9jb3B5X29uZV9ibG9j a19hbmRfcHJvZ3Jlc3NfcG9pbnRlcnMsIGV4Y2VwdCBmb3IgbWVtc2V0IHdoZXJlCiAgIFNSQyBp cyBhIHJlZ2lzdGVyIHdlIGhhdmUgY3JlYXRlZCB3aXRoIHRoZSBkdXBsaWNhdGVkIHZhbHVlIHRv IGJlIHNldC4gICovCnN0YXRpYyB2b2lkCmFhcmNoNjRfc2V0X29uZV9ibG9ja19hbmRfcHJvZ3Jl c3NfcG9pbnRlciAocnR4IHNyYywgcnR4ICpkc3QsCgkJCQkJICAgIG1hY2hpbmVfbW9kZSBtb2Rl KQp7CiAgLyogSWYgd2UgYXJlIGNvcHlpbmcgMTI4Yml0cyBvciAyNTZiaXRzLCB3ZSBjYW4gZG8g dGhhdCBzdHJhaWdodCBmcm9tCiAgICAgdGhlIFNJTUQgcmVnaXN0ZXIgd2UgcHJlcGFyZWQuICAq LwogIGlmIChrbm93bl9lcSAoR0VUX01PREVfQklUU0laRSAobW9kZSksIDI1NikpCiAgICB7CiAg ICAgIG1vZGUgPSBHRVRfTU9ERSAoc3JjKTsKICAgICAgLyogIkNhc3QiIHRoZSAqZHN0IHRvIHRo ZSBjb3JyZWN0IG1vZGUuICAqLwogICAgICAqZHN0ID0gYWRqdXN0X2FkZHJlc3MgKCpkc3QsIG1v ZGUsIDApOwogICAgICAvKiBFbWl0IHRoZSBtZW1zZXQuICAqLwogICAgICBlbWl0X2luc24gKGFh cmNoNjRfZ2VuX3N0b3JlX3BhaXIgKG1vZGUsICpkc3QsIHNyYywKCQkJCQkgYWFyY2g2NF9wcm9n cmVzc19wb2ludGVyICgqZHN0KSwgc3JjKSk7CgogICAgICAvKiBNb3ZlIHRoZSBwb2ludGVycyBm b3J3YXJkLiAgKi8KICAgICAgKmRzdCA9IGFhcmNoNjRfbW92ZV9wb2ludGVyICgqZHN0LCAzMik7 CiAgICAgIHJldHVybjsKICAgIH0KICBpZiAoa25vd25fZXEgKEdFVF9NT0RFX0JJVFNJWkUgKG1v ZGUpLCAxMjgpKQogICAgewogICAgICAvKiAiQ2FzdCIgdGhlICpkc3QgdG8gdGhlIGNvcnJlY3Qg bW9kZS4gICovCiAgICAgICpkc3QgPSBhZGp1c3RfYWRkcmVzcyAoKmRzdCwgR0VUX01PREUgKHNy YyksIDApOwogICAgICAvKiBFbWl0IHRoZSBtZW1zZXQuICAqLwogICAgICBlbWl0X21vdmVfaW5z biAoKmRzdCwgc3JjKTsKICAgICAgLyogTW92ZSB0aGUgcG9pbnRlcnMgZm9yd2FyZC4gICovCiAg ICAgICpkc3QgPSBhYXJjaDY0X21vdmVfcG9pbnRlciAoKmRzdCwgMTYpOwogICAgICByZXR1cm47 CiAgICB9CiAgLyogRm9yIGNvcHlpbmcgbGVzcywgd2UgaGF2ZSB0byBleHRyYWN0IHRoZSByaWdo dCBhbW91bnQgZnJvbSBzcmMuICAqLwogIHJ0eCByZWcgPSBsb3dwYXJ0X3N1YnJlZyAobW9kZSwg c3JjLCBHRVRfTU9ERSAoc3JjKSk7CgogIC8qICJDYXN0IiB0aGUgKmRzdCB0byB0aGUgY29ycmVj dCBtb2RlLiAgKi8KICAqZHN0ID0gYWRqdXN0X2FkZHJlc3MgKCpkc3QsIG1vZGUsIDApOwogIC8q IEVtaXQgdGhlIG1lbXNldC4gICovCiAgZW1pdF9tb3ZlX2luc24gKCpkc3QsIHJlZyk7CiAgLyog TW92ZSB0aGUgcG9pbnRlciBmb3J3YXJkLiAgKi8KICAqZHN0ID0gYWFyY2g2NF9wcm9ncmVzc19w b2ludGVyICgqZHN0KTsKfQoKLyogRXhwYW5kIGEgc2V0bWVtIHVzaW5nIHRoZSBNT1BTIGluc3Ry dWN0aW9ucy4gIE9QRVJBTkRTIGFyZSB0aGUgc2FtZQogICBhcyBmb3IgdGhlIHNldG1lbSBwYXR0 ZXJuLiAgUmV0dXJuIHRydWUgaWZmIHdlIHN1Y2NlZWQuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0 X2V4cGFuZF9zZXRtZW1fbW9wcyAocnR4ICpvcGVyYW5kcykKewogIGlmICghVEFSR0VUX01PUFMp CiAgICByZXR1cm4gZmFsc2U7CgogIC8qIFRoZSBmaXJzdCB0d28gcmVnaXN0ZXJzIGFyZSBjaGFu Z2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiwgc28gYm90aAogICAgIG9mIHRoZW0gbXVzdCBiZSBhIGZy ZXNoIHBzZXVkby4gICovCiAgcnR4IGRzdF9hZGRyID0gY29weV90b19tb2RlX3JlZyAoUG1vZGUs IFhFWFAgKG9wZXJhbmRzWzBdLCAwKSk7CiAgcnR4IGRzdF9tZW0gPSByZXBsYWNlX2VxdWl2X2Fk ZHJlc3MgKG9wZXJhbmRzWzBdLCBkc3RfYWRkcik7CiAgcnR4IHN6X3JlZyA9IGNvcHlfdG9fbW9k ZV9yZWcgKERJbW9kZSwgb3BlcmFuZHNbMV0pOwogIHJ0eCB2YWwgPSBvcGVyYW5kc1syXTsKICBp ZiAodmFsICE9IENPTlNUMF9SVFggKFFJbW9kZSkpCiAgICB2YWwgPSBmb3JjZV9yZWcgKFFJbW9k ZSwgdmFsKTsKICBlbWl0X2luc24gKGdlbl9hYXJjaDY0X3NldG1lbWRpIChkc3RfbWVtLCB2YWws IHN6X3JlZykpOwogIHJldHVybiB0cnVlOwp9CgovKiBFeHBhbmQgc2V0bWVtLCBhcyBpZiBmcm9t IGEgX19idWlsdGluX21lbXNldC4gIFJldHVybiB0cnVlIGlmCiAgIHdlIHN1Y2NlZWQsIG90aGVy d2lzZSByZXR1cm4gZmFsc2UuICAqLwoKYm9vbAphYXJjaDY0X2V4cGFuZF9zZXRtZW0gKHJ0eCAq b3BlcmFuZHMpCnsKICBpbnQgbiwgbW9kZV9iaXRzOwogIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQg bGVuOwogIHJ0eCBkc3QgPSBvcGVyYW5kc1swXTsKICBydHggdmFsID0gb3BlcmFuZHNbMl0sIHNy YzsKICBydHggYmFzZTsKICBtYWNoaW5lX21vZGUgY3VyX21vZGUgPSBCTEttb2RlLCBuZXh0X21v ZGU7CgogIC8qIElmIHdlIGRvbid0IGhhdmUgU0lNRCByZWdpc3RlcnMgb3IgdGhlIHNpemUgaXMg dmFyaWFibGUgdXNlIHRoZSBNT1BTCiAgICAgaW5saW5lZCBzZXF1ZW5jZSBpZiBwb3NzaWJsZS4g ICovCiAgaWYgKCFDT05TVF9JTlRfUCAob3BlcmFuZHNbMV0pIHx8ICFUQVJHRVRfU0lNRCkKICAg IHJldHVybiBhYXJjaDY0X2V4cGFuZF9zZXRtZW1fbW9wcyAob3BlcmFuZHMpOwoKICBib29sIHNp emVfcCA9IG9wdGltaXplX2Z1bmN0aW9uX2Zvcl9zaXplX3AgKGNmdW4pOwoKICAvKiBEZWZhdWx0 IHRoZSBtYXhpbXVtIHRvIDI1Ni1ieXRlcyB3aGVuIGNvbnNpZGVyaW5nIG9ubHkgbGliY2FsbCB2 cwogICAgIFNJTUQgYnJvYWRjYXN0IHNlcXVlbmNlLiAgKi8KICB1bnNpZ25lZCBtYXhfc2V0X3Np emUgPSAyNTY7CgogIGxlbiA9IElOVFZBTCAob3BlcmFuZHNbMV0pOwogIGlmIChsZW4gPiBtYXhf c2V0X3NpemUgJiYgIVRBUkdFVF9NT1BTKQogICAgcmV0dXJuIGZhbHNlOwoKICBpbnQgY3N0X3Zh bCA9ICEhKENPTlNUX0lOVF9QICh2YWwpICYmIChJTlRWQUwgKHZhbCkgIT0gMCkpOwogIC8qIFRo ZSBNT1BTIHNlcXVlbmNlIHRha2VzOgogICAgIDMgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgbWVtb3J5 IHN0b3JpbmcKICAgICArIDEgdG8gbW92ZSB0aGUgY29uc3RhbnQgc2l6ZSBpbnRvIGEgcmVnCiAg ICAgKyAxIGlmIFZBTCBpcyBhIG5vbi16ZXJvIGNvbnN0YW50IHRvIG1vdmUgaW50byBhIHJlZwog ICAgKHplcm8gY29uc3RhbnRzIGNhbiB1c2UgWFpSIGRpcmVjdGx5KS4gICovCiAgdW5zaWduZWQg bW9wc19jb3N0ID0gMyArIDEgKyBjc3RfdmFsOwogIC8qIEEgbGliY2FsbCB0byBtZW1zZXQgaW4g dGhlIHdvcnN0IGNhc2UgdGFrZXMgMyBpbnN0cnVjdGlvbnMgdG8gcHJlcGFyZQogICAgIHRoZSBh cmd1bWVudHMgKyAxIGZvciB0aGUgY2FsbC4gICovCiAgdW5zaWduZWQgbGliY2FsbF9jb3N0ID0g NDsKCiAgLyogVXBwZXIgYm91bmQgY2hlY2suICBGb3IgbGFyZ2UgY29uc3RhbnQtc2l6ZWQgc2V0 bWVtIHVzZSB0aGUgTU9QUyBzZXF1ZW5jZQogICAgIHdoZW4gYXZhaWxhYmxlLiAgKi8KICBpZiAo VEFSR0VUX01PUFMKICAgICAgJiYgbGVuID49ICh1bnNpZ25lZCBIT1NUX1dJREVfSU5UKSBhYXJj aDY0X21vcHNfbWVtc2V0X3NpemVfdGhyZXNob2xkKQogICAgcmV0dXJuIGFhcmNoNjRfZXhwYW5k X3NldG1lbV9tb3BzIChvcGVyYW5kcyk7CgogIC8qIEF0dGVtcHQgYSBzZXF1ZW5jZSB3aXRoIGEg dmVjdG9yIGJyb2FkY2FzdCBmb2xsb3dlZCBieSBzdG9yZXMuCiAgICAgQ291bnQgdGhlIG51bWJl ciBvZiBvcGVyYXRpb25zIGludm9sdmVkIHRvIHNlZSBpZiBpdCdzIHdvcnRoIGl0CiAgICAgYWdh aW5zdCB0aGUgYWx0ZXJuYXRpdmVzLiAgQSBzaW1wbGUgY291bnRlciBzaW1kX29wcyBvbiB0aGUK ICAgICBhbGdvcml0aG1pY2FsbHktcmVsZXZhbnQgb3BlcmF0aW9ucyBpcyB1c2VkIHJhdGhlciB0 aGFuIGFuIHJ0eF9pbnNuIGNvdW50CiAgICAgYXMgYWxsIHRoZSBwb2ludGVyIGFkanVzbXRlbnRz IGFuZCBtb2RlIHJlaW50ZXJwcmV0cyB3aWxsIGJlIG9wdGltaXplZAogICAgIGF3YXkgbGF0ZXIu ICAqLwogIHN0YXJ0X3NlcXVlbmNlICgpOwogIHVuc2lnbmVkIHNpbWRfb3BzID0gMDsKCiAgYmFz ZSA9IGNvcHlfdG9fbW9kZV9yZWcgKFBtb2RlLCBYRVhQIChkc3QsIDApKTsKICBkc3QgPSBhZGp1 c3RfYXV0b21vZGlmeV9hZGRyZXNzIChkc3QsIFZPSURtb2RlLCBiYXNlLCAwKTsKCiAgLyogUHJl cGFyZSB0aGUgdmFsIHVzaW5nIGEgRFVQL01PVkkgdjAuMTZCLCB2YWwuICAqLwogIHNyYyA9IGV4 cGFuZF92ZWN0b3JfYnJvYWRjYXN0IChWMTZRSW1vZGUsIHZhbCk7CiAgc3JjID0gZm9yY2VfcmVn IChWMTZRSW1vZGUsIHNyYyk7CiAgc2ltZF9vcHMrKzsKICAvKiBDb252ZXJ0IGxlbiB0byBiaXRz IHRvIG1ha2UgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgc2ltcGxlci4gICovCiAgbiA9IGxlbiAqIEJJ VFNfUEVSX1VOSVQ7CgogIC8qIE1heGltdW0gYW1vdW50IHRvIGNvcHkgaW4gb25lIGdvLiAgV2Ug YWxsb3cgMjU2LWJpdCBjaHVua3MgYmFzZWQgb24gdGhlCiAgICAgQUFSQ0g2NF9FWFRSQV9UVU5F X05PX0xEUF9TVFBfUVJFR1MgdHVuaW5nIHBhcmFtZXRlci4gICovCiAgY29uc3QgaW50IGNvcHlf bGltaXQgPSAoYWFyY2g2NF90dW5lX3BhcmFtcy5leHRyYV90dW5pbmdfZmxhZ3MKCQkJICAmIEFB UkNINjRfRVhUUkFfVFVORV9OT19MRFBfU1RQX1FSRUdTKQoJCQkgID8gR0VUX01PREVfQklUU0la RSAoVEltb2RlKSA6IDI1NjsKCiAgd2hpbGUgKG4gPiAwKQogICAgewogICAgICAvKiBGaW5kIHRo ZSBsYXJnZXN0IG1vZGUgaW4gd2hpY2ggdG8gZG8gdGhlIGNvcHkgd2l0aG91dAoJIG92ZXIgd3Jp dGluZy4gICovCiAgICAgIG9wdF9zY2FsYXJfaW50X21vZGUgbW9kZV9pdGVyOwogICAgICBGT1Jf RUFDSF9NT0RFX0lOX0NMQVNTIChtb2RlX2l0ZXIsIE1PREVfSU5UKQoJaWYgKEdFVF9NT0RFX0JJ VFNJWkUgKG1vZGVfaXRlci5yZXF1aXJlICgpKSA8PSBNSU4gKG4sIGNvcHlfbGltaXQpKQoJICBj dXJfbW9kZSA9IG1vZGVfaXRlci5yZXF1aXJlICgpOwoKICAgICAgZ2NjX2Fzc2VydCAoY3VyX21v ZGUgIT0gQkxLbW9kZSk7CgogICAgICBtb2RlX2JpdHMgPSBHRVRfTU9ERV9CSVRTSVpFIChjdXJf bW9kZSkudG9fY29uc3RhbnQgKCk7CiAgICAgIGFhcmNoNjRfc2V0X29uZV9ibG9ja19hbmRfcHJv Z3Jlc3NfcG9pbnRlciAoc3JjLCAmZHN0LCBjdXJfbW9kZSk7CiAgICAgIHNpbWRfb3BzKys7CiAg ICAgIG4gLT0gbW9kZV9iaXRzOwoKICAgICAgLyogRG8gY2VydGFpbiB0cmFpbGluZyBjb3BpZXMg YXMgb3ZlcmxhcHBpbmcgaWYgaXQncyBnb2luZyB0byBiZQoJIGNoZWFwZXIuICBpLmUuIGxlc3Mg aW5zdHJ1Y3Rpb25zIHRvIGRvIHNvLiAgRm9yIGluc3RhbmNlIGRvaW5nIGEgMTUKCSBieXRlIGNv cHkgaXQncyBtb3JlIGVmZmljaWVudCB0byBkbyB0d28gb3ZlcmxhcHBpbmcgOCBieXRlIGNvcGll cyB0aGFuCgkgOCArIDQgKyAyICsgMS4gIE9ubHkgZG8gdGhpcyB3aGVuIC1tc3RyaWN0LWFsaWdu IGlzIG5vdCBzdXBwbGllZC4gICovCiAgICAgIGlmIChuID4gMCAmJiBuIDwgY29weV9saW1pdCAv IDIgJiYgIVNUUklDVF9BTElHTk1FTlQpCgl7CgkgIG5leHRfbW9kZSA9IHNtYWxsZXN0X21vZGVf Zm9yX3NpemUgKG4sIE1PREVfSU5UKTsKCSAgaW50IG5fYml0cyA9IEdFVF9NT0RFX0JJVFNJWkUg KG5leHRfbW9kZSkudG9fY29uc3RhbnQgKCk7CgkgIGdjY19hc3NlcnQgKG5fYml0cyA8PSBtb2Rl X2JpdHMpOwoJICBkc3QgPSBhYXJjaDY0X21vdmVfcG9pbnRlciAoZHN0LCAobiAtIG5fYml0cykg LyBCSVRTX1BFUl9VTklUKTsKCSAgbiA9IG5fYml0czsKCX0KICAgIH0KICBydHhfaW5zbiAqc2Vx ID0gZ2V0X2luc25zICgpOwogIGVuZF9zZXF1ZW5jZSAoKTsKCiAgaWYgKHNpemVfcCkKICAgIHsK ICAgICAgLyogV2hlbiBvcHRpbWl6aW5nIGZvciBzaXplIHdlIGhhdmUgMyBvcHRpb25zOiB0aGUg U0lNRCBicm9hZGNhc3Qgc2VxdWVuY2UsCgkgY2FsbCB0byBtZW1zZXQgb3IgdGhlIE1PUFMgZXhw YW5zaW9uLiAgKi8KICAgICAgaWYgKFRBUkdFVF9NT1BTCgkgICYmIG1vcHNfY29zdCA8PSBsaWJj YWxsX2Nvc3QKCSAgJiYgbW9wc19jb3N0IDw9IHNpbWRfb3BzKQoJcmV0dXJuIGFhcmNoNjRfZXhw YW5kX3NldG1lbV9tb3BzIChvcGVyYW5kcyk7CiAgICAgIC8qIElmIE1PUFMgaXMgbm90IGF2YWls YWJsZSBvciBub3Qgc2hvcnRlciBwaWNrIGEgbGliY2FsbCBpZiB0aGUgU0lNRAoJIHNlcXVlbmNl IGlzIHRvbyBsb25nLiAgKi8KICAgICAgZWxzZSBpZiAobGliY2FsbF9jb3N0IDwgc2ltZF9vcHMp CglyZXR1cm4gZmFsc2U7CiAgICAgIGVtaXRfaW5zbiAoc2VxKTsKICAgICAgcmV0dXJuIHRydWU7 CiAgICB9CgogIC8qIEF0IHRoaXMgcG9pbnQgdGhlIFNJTUQgYnJvYWRjYXN0IHNlcXVlbmNlIGlz IHRoZSBiZXN0IGNob2ljZSB3aGVuCiAgICAgb3B0aW1pemluZyBmb3Igc3BlZWQuICAqLwogIGVt aXRfaW5zbiAoc2VxKTsKICByZXR1cm4gdHJ1ZTsKfQoKCi8qIFNwbGl0IGEgREltb2RlIHN0b3Jl IG9mIGEgQ09OU1RfSU5UIFNSQyB0byBNRU0gRFNUIGFzIHR3bwogICBTSW1vZGUgc3RvcmVzLiAg SGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIGNvbnN0YW50IGhhcyBpZGVudGljYWwKICAgYm90dG9t IGFuZCB0b3AgaGFsdmVzLiAgVGhpcyBpcyBiZW5lZmljaWFsIHdoZW4gdGhlIHR3byBzdG9yZXMg Y2FuIGJlCiAgIG1lcmdlZCBpbnRvIGFuIFNUUCBhbmQgd2UgYXZvaWQgc3ludGhlc2lzaW5nIHBv dGVudGlhbGx5IGV4cGVuc2l2ZQogICBpbW1lZGlhdGVzIHR3aWNlLiAgUmV0dXJuIHRydWUgaWYg c3VjaCBhIHNwbGl0IGlzIHBvc3NpYmxlLiAgKi8KCmJvb2wKYWFyY2g2NF9zcGxpdF9kaW1vZGVf Y29uc3Rfc3RvcmUgKHJ0eCBkc3QsIHJ0eCBzcmMpCnsKICBydHggbG8gPSBnZW5fbG93cGFydCAo U0ltb2RlLCBzcmMpOwogIHJ0eCBoaSA9IGdlbl9oaWdocGFydF9tb2RlIChTSW1vZGUsIERJbW9k ZSwgc3JjKTsKCiAgYm9vbCBzaXplX3AgPSBvcHRpbWl6ZV9mdW5jdGlvbl9mb3Jfc2l6ZV9wIChj ZnVuKTsKCiAgaWYgKCFydHhfZXF1YWxfcCAobG8sIGhpKSkKICAgIHJldHVybiBmYWxzZTsKCiAg dW5zaWduZWQgaW50IG9yaWdfY29zdAogICAgPSBhYXJjaDY0X2ludGVybmFsX21vdl9pbW1lZGlh dGUgKE5VTExfUlRYLCBzcmMsIGZhbHNlLCBESW1vZGUpOwogIHVuc2lnbmVkIGludCBsb19jb3N0 CiAgICA9IGFhcmNoNjRfaW50ZXJuYWxfbW92X2ltbWVkaWF0ZSAoTlVMTF9SVFgsIGxvLCBmYWxz ZSwgU0ltb2RlKTsKCiAgLyogV2Ugd2FudCB0byB0cmFuc2Zvcm06CiAgICAgTU9WCXgxLCA0OTM3 MAogICAgIE1PVksJeDEsIDB4MTQwLCBsc2wgMTYKICAgICBNT1ZLCXgxLCAweGMwZGEsIGxzbCAz MgogICAgIE1PVksJeDEsIDB4MTQwLCBsc2wgNDgKICAgICBTVFIJeDEsIFt4MF0KICAgaW50bzoK ICAgICBNT1YJdzEsIDQ5MzcwCiAgICAgTU9WSwl3MSwgMHgxNDAsIGxzbCAxNgogICAgIFNUUAl3 MSwgdzEsIFt4MF0KICAgU28gd2Ugd2FudCB0byBwZXJmb3JtIHRoaXMgb25seSB3aGVuIHdlIHNh dmUgdHdvIGluc3RydWN0aW9ucwogICBvciBtb3JlLiAgV2hlbiBvcHRpbWl6aW5nIGZvciBzaXpl LCBob3dldmVyLCBhY2NlcHQgYW55IGNvZGUgc2l6ZQogICBzYXZpbmdzIHdlIGNhbi4gICovCiAg aWYgKHNpemVfcCAmJiBvcmlnX2Nvc3QgPD0gbG9fY29zdCkKICAgIHJldHVybiBmYWxzZTsKCiAg aWYgKCFzaXplX3AKICAgICAgJiYgKG9yaWdfY29zdCA8PSBsb19jb3N0ICsgMSkpCiAgICByZXR1 cm4gZmFsc2U7CgogIHJ0eCBtZW1fbG8gPSBhZGp1c3RfYWRkcmVzcyAoZHN0LCBTSW1vZGUsIDAp OwogIGlmICghYWFyY2g2NF9tZW1fcGFpcl9vcGVyYW5kIChtZW1fbG8sIFNJbW9kZSkpCiAgICBy ZXR1cm4gZmFsc2U7CgogIHJ0eCB0bXBfcmVnID0gZ2VuX3JlZ19ydHggKFNJbW9kZSk7CiAgYWFy Y2g2NF9leHBhbmRfbW92X2ltbWVkaWF0ZSAodG1wX3JlZywgbG8pOwogIHJ0eCBtZW1faGkgPSBh YXJjaDY0X21vdmVfcG9pbnRlciAobWVtX2xvLCBHRVRfTU9ERV9TSVpFIChTSW1vZGUpKTsKICAv KiBEb24ndCBlbWl0IGFuIGV4cGxpY2l0IHN0b3JlIHBhaXIgYXMgdGhpcyBtYXkgbm90IGJlIGFs d2F5cyBwcm9maXRhYmxlLgogICAgIExldCB0aGUgc2NoZWQtZnVzaW9uIGxvZ2ljIGRlY2lkZSB3 aGV0aGVyIHRvIG1lcmdlIHRoZW0uICAqLwogIGVtaXRfbW92ZV9pbnNuIChtZW1fbG8sIHRtcF9y ZWcpOwogIGVtaXRfbW92ZV9pbnNuIChtZW1faGksIHRtcF9yZWcpOwoKICByZXR1cm4gdHJ1ZTsK fQoKLyogR2VuZXJhdGUgUlRMIGZvciBhIGNvbmRpdGlvbmFsIGJyYW5jaCB3aXRoIHJ0eCBjb21w YXJpc29uIENPREUgaW4KICAgbW9kZSBDQ19NT0RFLiAgVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSB1 bmxpa2VseSBjb25kaXRpb25hbCBicmFuY2gKICAgaXMgTEFCRUxfUkVGLiAgKi8KCnZvaWQKYWFy Y2g2NF9nZW5fdW5saWtlbHlfY2JyYW5jaCAoZW51bSBydHhfY29kZSBjb2RlLCBtYWNoaW5lX21v ZGUgY2NfbW9kZSwKCQkJICAgICAgcnR4IGxhYmVsX3JlZikKewogIHJ0eCB4OwogIHggPSBnZW5f cnR4X2ZtdF9lZSAoY29kZSwgVk9JRG1vZGUsCgkJICAgICAgZ2VuX3J0eF9SRUcgKGNjX21vZGUs IENDX1JFR05VTSksCgkJICAgICAgY29uc3QwX3J0eCk7CgogIHggPSBnZW5fcnR4X0lGX1RIRU5f RUxTRSAoVk9JRG1vZGUsIHgsCgkJCSAgICBnZW5fcnR4X0xBQkVMX1JFRiAoVk9JRG1vZGUsIGxh YmVsX3JlZiksCgkJCSAgICBwY19ydHgpOwogIGFhcmNoNjRfZW1pdF91bmxpa2VseV9qdW1wIChn ZW5fcnR4X1NFVCAocGNfcnR4LCB4KSk7Cn0KCi8qIEdlbmVyYXRlIERJbW9kZSBzY3JhdGNoIHJl Z2lzdGVycyBmb3IgMTI4LWJpdCAoVEltb2RlKSBhZGRpdGlvbi4KCiAgIE9QMSByZXByZXNlbnRz IHRoZSBUSW1vZGUgZGVzdGluYXRpb24gb3BlcmFuZCAxCiAgIE9QMiByZXByZXNlbnRzIHRoZSBU SW1vZGUgZGVzdGluYXRpb24gb3BlcmFuZCAyCiAgIExPV19ERVNUIHJlcHJlc2VudHMgdGhlIGxv dyBoYWxmIChESW1vZGUpIG9mIFRJbW9kZSBvcGVyYW5kIDAKICAgTE9XX0lOMSByZXByZXNlbnRz IHRoZSBsb3cgaGFsZiAoREltb2RlKSBvZiBUSW1vZGUgb3BlcmFuZCAxCiAgIExPV19JTjIgcmVw cmVzZW50cyB0aGUgbG93IGhhbGYgKERJbW9kZSkgb2YgVEltb2RlIG9wZXJhbmQgMgogICBISUdI X0RFU1QgcmVwcmVzZW50cyB0aGUgaGlnaCBoYWxmIChESW1vZGUpIG9mIFRJbW9kZSBvcGVyYW5k IDAKICAgSElHSF9JTjEgcmVwcmVzZW50cyB0aGUgaGlnaCBoYWxmIChESW1vZGUpIG9mIFRJbW9k ZSBvcGVyYW5kIDEKICAgSElHSF9JTjIgcmVwcmVzZW50cyB0aGUgaGlnaCBoYWxmIChESW1vZGUp IG9mIFRJbW9kZSBvcGVyYW5kIDIuICAqLwoKdm9pZAphYXJjaDY0X2FkZHRpX3NjcmF0Y2hfcmVn cyAocnR4IG9wMSwgcnR4IG9wMiwgcnR4ICpsb3dfZGVzdCwKCQkJICAgIHJ0eCAqbG93X2luMSwg cnR4ICpsb3dfaW4yLAoJCQkgICAgcnR4ICpoaWdoX2Rlc3QsIHJ0eCAqaGlnaF9pbjEsCgkJCSAg ICBydHggKmhpZ2hfaW4yKQp7CiAgKmxvd19kZXN0ID0gZ2VuX3JlZ19ydHggKERJbW9kZSk7CiAg Kmxvd19pbjEgPSBnZW5fbG93cGFydCAoREltb2RlLCBvcDEpOwogICpsb3dfaW4yID0gc2ltcGxp ZnlfZ2VuX3N1YnJlZyAoREltb2RlLCBvcDIsIFRJbW9kZSwKCQkJCSAgc3VicmVnX2xvd3BhcnRf b2Zmc2V0IChESW1vZGUsIFRJbW9kZSkpOwogICpoaWdoX2Rlc3QgPSBnZW5fcmVnX3J0eCAoRElt b2RlKTsKICAqaGlnaF9pbjEgPSBnZW5faGlnaHBhcnQgKERJbW9kZSwgb3AxKTsKICAqaGlnaF9p bjIgPSBzaW1wbGlmeV9nZW5fc3VicmVnIChESW1vZGUsIG9wMiwgVEltb2RlLAoJCQkJICAgc3Vi cmVnX2hpZ2hwYXJ0X29mZnNldCAoREltb2RlLCBUSW1vZGUpKTsKfQoKLyogR2VuZXJhdGUgRElt b2RlIHNjcmF0Y2ggcmVnaXN0ZXJzIGZvciAxMjgtYml0IChUSW1vZGUpIHN1YnRyYWN0aW9uLgoK ICAgVGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gJ2FyY2g2NF9hZGR0aV9zY3JhdGNoX3JlZ3Mn IGluIHRoYXQKICAgT1AxIGNhbiBiZSBhbiBpbW1lZGlhdGUgY29uc3RhbnQgKHplcm8pLiBXZSBt dXN0IGNhbGwKICAgc3VicmVnX2hpZ2hwYXJ0X29mZnNldCB3aXRoIERJbW9kZSBhbmQgVEltb2Rl IGFyZ3VtZW50cywgb3RoZXJ3aXNlCiAgIFZPSURtb2RlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGNv bnN0X2ludCB3aGljaCBnZW5lcmF0ZXMgYW4gaW50ZXJuYWwKICAgZXJyb3IgZnJvbSBzdWJyZWdf c2l6ZV9oaWdocGFydF9vZmZzZXQgd2hpY2ggZG9lcyBub3QgZXhwZWN0IGEgc2l6ZSBvZiB6ZXJv LgoKICAgT1AxIHJlcHJlc2VudHMgdGhlIFRJbW9kZSBkZXN0aW5hdGlvbiBvcGVyYW5kIDEKICAg T1AyIHJlcHJlc2VudHMgdGhlIFRJbW9kZSBkZXN0aW5hdGlvbiBvcGVyYW5kIDIKICAgTE9XX0RF U1QgcmVwcmVzZW50cyB0aGUgbG93IGhhbGYgKERJbW9kZSkgb2YgVEltb2RlIG9wZXJhbmQgMAog ICBMT1dfSU4xIHJlcHJlc2VudHMgdGhlIGxvdyBoYWxmIChESW1vZGUpIG9mIFRJbW9kZSBvcGVy YW5kIDEKICAgTE9XX0lOMiByZXByZXNlbnRzIHRoZSBsb3cgaGFsZiAoREltb2RlKSBvZiBUSW1v ZGUgb3BlcmFuZCAyCiAgIEhJR0hfREVTVCByZXByZXNlbnRzIHRoZSBoaWdoIGhhbGYgKERJbW9k ZSkgb2YgVEltb2RlIG9wZXJhbmQgMAogICBISUdIX0lOMSByZXByZXNlbnRzIHRoZSBoaWdoIGhh bGYgKERJbW9kZSkgb2YgVEltb2RlIG9wZXJhbmQgMQogICBISUdIX0lOMiByZXByZXNlbnRzIHRo ZSBoaWdoIGhhbGYgKERJbW9kZSkgb2YgVEltb2RlIG9wZXJhbmQgMi4gICovCgoKdm9pZAphYXJj aDY0X3N1YnZ0aV9zY3JhdGNoX3JlZ3MgKHJ0eCBvcDEsIHJ0eCBvcDIsIHJ0eCAqbG93X2Rlc3Qs CgkJCSAgICAgcnR4ICpsb3dfaW4xLCBydHggKmxvd19pbjIsCgkJCSAgICAgcnR4ICpoaWdoX2Rl c3QsIHJ0eCAqaGlnaF9pbjEsCgkJCSAgICAgcnR4ICpoaWdoX2luMikKewogICpsb3dfZGVzdCA9 IGdlbl9yZWdfcnR4IChESW1vZGUpOwogICpsb3dfaW4xID0gc2ltcGxpZnlfZ2VuX3N1YnJlZyAo REltb2RlLCBvcDEsIFRJbW9kZSwKCQkJCSAgc3VicmVnX2xvd3BhcnRfb2Zmc2V0IChESW1vZGUs IFRJbW9kZSkpOwoKICAqbG93X2luMiA9IHNpbXBsaWZ5X2dlbl9zdWJyZWcgKERJbW9kZSwgb3Ay LCBUSW1vZGUsCgkJCQkgIHN1YnJlZ19sb3dwYXJ0X29mZnNldCAoREltb2RlLCBUSW1vZGUpKTsK ICAqaGlnaF9kZXN0ID0gZ2VuX3JlZ19ydHggKERJbW9kZSk7CgogICpoaWdoX2luMSA9IHNpbXBs aWZ5X2dlbl9zdWJyZWcgKERJbW9kZSwgb3AxLCBUSW1vZGUsCgkJCQkgICBzdWJyZWdfaGlnaHBh cnRfb2Zmc2V0IChESW1vZGUsIFRJbW9kZSkpOwogICpoaWdoX2luMiA9IHNpbXBsaWZ5X2dlbl9z dWJyZWcgKERJbW9kZSwgb3AyLCBUSW1vZGUsCgkJCQkgICBzdWJyZWdfaGlnaHBhcnRfb2Zmc2V0 IChESW1vZGUsIFRJbW9kZSkpOwp9CgovKiBHZW5lcmF0ZSBSVEwgZm9yIDEyOC1iaXQgKFRJbW9k ZSkgc3VidHJhY3Rpb24gd2l0aCBvdmVyZmxvdy4KCiAgIE9QMCByZXByZXNlbnRzIHRoZSBUSW1v ZGUgZGVzdGluYXRpb24gb3BlcmFuZCAwCiAgIExPV19ERVNUIHJlcHJlc2VudHMgdGhlIGxvdyBo YWxmIChESW1vZGUpIG9mIFRJbW9kZSBvcGVyYW5kIDAKICAgTE9XX0lOMSByZXByZXNlbnRzIHRo ZSBsb3cgaGFsZiAoREltb2RlKSBvZiBUSW1vZGUgb3BlcmFuZCAxCiAgIExPV19JTjIgcmVwcmVz ZW50cyB0aGUgbG93IGhhbGYgKERJbW9kZSkgb2YgVEltb2RlIG9wZXJhbmQgMgogICBISUdIX0RF U1QgcmVwcmVzZW50cyB0aGUgaGlnaCBoYWxmIChESW1vZGUpIG9mIFRJbW9kZSBvcGVyYW5kIDAK ICAgSElHSF9JTjEgcmVwcmVzZW50cyB0aGUgaGlnaCBoYWxmIChESW1vZGUpIG9mIFRJbW9kZSBv cGVyYW5kIDEKICAgSElHSF9JTjIgcmVwcmVzZW50cyB0aGUgaGlnaCBoYWxmIChESW1vZGUpIG9m IFRJbW9kZSBvcGVyYW5kIDIKICAgVU5TSUdORURfUCBpcyB0cnVlIGlmIHRoZSBvcGVyYXRpb24g aXMgYmVpbmcgcGVyZm9ybWVkIG9uIHVuc2lnbmVkCiAgIHZhbHVlcy4gICovCnZvaWQKYWFyY2g2 NF9leHBhbmRfc3VidnRpIChydHggb3AwLCBydHggbG93X2Rlc3QsIHJ0eCBsb3dfaW4xLAoJCSAg ICAgICBydHggbG93X2luMiwgcnR4IGhpZ2hfZGVzdCwgcnR4IGhpZ2hfaW4xLAoJCSAgICAgICBy dHggaGlnaF9pbjIsIGJvb2wgdW5zaWduZWRfcCkKewogIGlmIChsb3dfaW4yID09IGNvbnN0MF9y dHgpCiAgICB7CiAgICAgIGxvd19kZXN0ID0gbG93X2luMTsKICAgICAgaGlnaF9pbjIgPSBmb3Jj ZV9yZWcgKERJbW9kZSwgaGlnaF9pbjIpOwogICAgICBpZiAodW5zaWduZWRfcCkKCWVtaXRfaW5z biAoZ2VuX3N1YmRpM19jb21wYXJlMSAoaGlnaF9kZXN0LCBoaWdoX2luMSwgaGlnaF9pbjIpKTsK ICAgICAgZWxzZQoJZW1pdF9pbnNuIChnZW5fc3VidmRpX2luc24gKGhpZ2hfZGVzdCwgaGlnaF9p bjEsIGhpZ2hfaW4yKSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICBpZiAoYWFyY2g2NF9wbHVz X2ltbWVkaWF0ZSAobG93X2luMiwgREltb2RlKSkKCWVtaXRfaW5zbiAoZ2VuX3N1YmRpM19jb21w YXJlMV9pbW0gKGxvd19kZXN0LCBsb3dfaW4xLCBsb3dfaW4yLAoJCQkJCSAgICBHRU5fSU5UICgt VUlOVFZBTCAobG93X2luMikpKSk7CiAgICAgIGVsc2UKCXsKCSAgbG93X2luMiA9IGZvcmNlX3Jl ZyAoREltb2RlLCBsb3dfaW4yKTsKCSAgZW1pdF9pbnNuIChnZW5fc3ViZGkzX2NvbXBhcmUxIChs b3dfZGVzdCwgbG93X2luMSwgbG93X2luMikpOwoJfQogICAgICBoaWdoX2luMiA9IGZvcmNlX3Jl ZyAoREltb2RlLCBoaWdoX2luMik7CgogICAgICBpZiAodW5zaWduZWRfcCkKCWVtaXRfaW5zbiAo Z2VuX3VzdWJkaTNfY2FycnlpbkMgKGhpZ2hfZGVzdCwgaGlnaF9pbjEsIGhpZ2hfaW4yKSk7CiAg ICAgIGVsc2UKCWVtaXRfaW5zbiAoZ2VuX3N1YmRpM19jYXJyeWluViAoaGlnaF9kZXN0LCBoaWdo X2luMSwgaGlnaF9pbjIpKTsKICAgIH0KCiAgZW1pdF9tb3ZlX2luc24gKGdlbl9sb3dwYXJ0IChE SW1vZGUsIG9wMCksIGxvd19kZXN0KTsKICBlbWl0X21vdmVfaW5zbiAoZ2VuX2hpZ2hwYXJ0IChE SW1vZGUsIG9wMCksIGhpZ2hfZGVzdCk7Cgp9CgovKiBJbXBsZW1lbnQgdGhlIFRBUkdFVF9BU0FO X1NIQURPV19PRkZTRVQgaG9vay4gICovCgpzdGF0aWMgdW5zaWduZWQgSE9TVF9XSURFX0lOVAph YXJjaDY0X2FzYW5fc2hhZG93X29mZnNldCAodm9pZCkKewogIGlmIChUQVJHRVRfSUxQMzIpCiAg ICByZXR1cm4gKEhPU1RfV0lERV9JTlRfMSA8PCAyOSk7CiAgZWxzZQogICAgcmV0dXJuIChIT1NU X1dJREVfSU5UXzEgPDwgMzYpOwp9CgpzdGF0aWMgcnR4CmFhcmNoNjRfZ2VuX2NjbXBfZmlyc3Qg KHJ0eF9pbnNuICoqcHJlcF9zZXEsIHJ0eF9pbnNuICoqZ2VuX3NlcSwKCQkJaW50IGNvZGUsIHRy ZWUgdHJlZW9wMCwgdHJlZSB0cmVlb3AxKQp7CiAgbWFjaGluZV9tb2RlIG9wX21vZGUsIGNtcF9t b2RlLCBjY19tb2RlID0gQ0Ntb2RlOwogIHJ0eCBvcDAsIG9wMTsKICBpbnQgdW5zaWduZWRwID0g VFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFICh0cmVlb3AwKSk7CiAgaW5zbl9jb2RlIGljb2RlOwog IHN0cnVjdCBleHBhbmRfb3BlcmFuZCBvcHNbNF07CgogIHN0YXJ0X3NlcXVlbmNlICgpOwogIGV4 cGFuZF9vcGVyYW5kcyAodHJlZW9wMCwgdHJlZW9wMSwgTlVMTF9SVFgsICZvcDAsICZvcDEsIEVY UEFORF9OT1JNQUwpOwoKICBvcF9tb2RlID0gR0VUX01PREUgKG9wMCk7CiAgaWYgKG9wX21vZGUg PT0gVk9JRG1vZGUpCiAgICBvcF9tb2RlID0gR0VUX01PREUgKG9wMSk7CgogIHN3aXRjaCAob3Bf bW9kZSkKICAgIHsKICAgIGNhc2UgRV9RSW1vZGU6CiAgICBjYXNlIEVfSEltb2RlOgogICAgY2Fz ZSBFX1NJbW9kZToKICAgICAgY21wX21vZGUgPSBTSW1vZGU7CiAgICAgIGljb2RlID0gQ09ERV9G T1JfY21wc2k7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgRV9ESW1vZGU6CiAgICAgIGNtcF9tb2Rl ID0gREltb2RlOwogICAgICBpY29kZSA9IENPREVfRk9SX2NtcGRpOwogICAgICBicmVhazsKCiAg ICBjYXNlIEVfU0Ztb2RlOgogICAgICBjbXBfbW9kZSA9IFNGbW9kZTsKICAgICAgY2NfbW9kZSA9 IGFhcmNoNjRfc2VsZWN0X2NjX21vZGUgKChydHhfY29kZSkgY29kZSwgb3AwLCBvcDEpOwogICAg ICBpY29kZSA9IGNjX21vZGUgPT0gQ0NGUEVtb2RlID8gQ09ERV9GT1JfZmNtcGVzZiA6IENPREVf Rk9SX2ZjbXBzZjsKICAgICAgYnJlYWs7CgogICAgY2FzZSBFX0RGbW9kZToKICAgICAgY21wX21v ZGUgPSBERm1vZGU7CiAgICAgIGNjX21vZGUgPSBhYXJjaDY0X3NlbGVjdF9jY19tb2RlICgocnR4 X2NvZGUpIGNvZGUsIG9wMCwgb3AxKTsKICAgICAgaWNvZGUgPSBjY19tb2RlID09IENDRlBFbW9k ZSA/IENPREVfRk9SX2ZjbXBlZGYgOiBDT0RFX0ZPUl9mY21wZGY7CiAgICAgIGJyZWFrOwoKICAg IGRlZmF1bHQ6CiAgICAgIGVuZF9zZXF1ZW5jZSAoKTsKICAgICAgcmV0dXJuIE5VTExfUlRYOwog ICAgfQoKICBvcDAgPSBwcmVwYXJlX29wZXJhbmQgKGljb2RlLCBvcDAsIDAsIG9wX21vZGUsIGNt cF9tb2RlLCB1bnNpZ25lZHApOwogIG9wMSA9IHByZXBhcmVfb3BlcmFuZCAoaWNvZGUsIG9wMSwg MSwgb3BfbW9kZSwgY21wX21vZGUsIHVuc2lnbmVkcCk7CiAgaWYgKCFvcDAgfHwgIW9wMSkKICAg IHsKICAgICAgZW5kX3NlcXVlbmNlICgpOwogICAgICByZXR1cm4gTlVMTF9SVFg7CiAgICB9CiAg KnByZXBfc2VxID0gZ2V0X2luc25zICgpOwogIGVuZF9zZXF1ZW5jZSAoKTsKCiAgY3JlYXRlX2Zp eGVkX29wZXJhbmQgKCZvcHNbMF0sIG9wMCk7CiAgY3JlYXRlX2ZpeGVkX29wZXJhbmQgKCZvcHNb MV0sIG9wMSk7CgogIHN0YXJ0X3NlcXVlbmNlICgpOwogIGlmICghbWF5YmVfZXhwYW5kX2luc24g KGljb2RlLCAyLCBvcHMpKQogICAgewogICAgICBlbmRfc2VxdWVuY2UgKCk7CiAgICAgIHJldHVy biBOVUxMX1JUWDsKICAgIH0KICAqZ2VuX3NlcSA9IGdldF9pbnNucyAoKTsKICBlbmRfc2VxdWVu Y2UgKCk7CgogIHJldHVybiBnZW5fcnR4X2ZtdF9lZSAoKHJ0eF9jb2RlKSBjb2RlLCBjY19tb2Rl LAoJCQkgZ2VuX3J0eF9SRUcgKGNjX21vZGUsIENDX1JFR05VTSksIGNvbnN0MF9ydHgpOwp9Cgpz dGF0aWMgcnR4CmFhcmNoNjRfZ2VuX2NjbXBfbmV4dCAocnR4X2luc24gKipwcmVwX3NlcSwgcnR4 X2luc24gKipnZW5fc2VxLCBydHggcHJldiwKCQkgICAgICAgaW50IGNtcF9jb2RlLCB0cmVlIHRy ZWVvcDAsIHRyZWUgdHJlZW9wMSwgaW50IGJpdF9jb2RlKQp7CiAgcnR4IG9wMCwgb3AxLCB0YXJn ZXQ7CiAgbWFjaGluZV9tb2RlIG9wX21vZGUsIGNtcF9tb2RlLCBjY19tb2RlID0gQ0Ntb2RlOwog IGludCB1bnNpZ25lZHAgPSBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKHRyZWVvcDApKTsKICBp bnNuX2NvZGUgaWNvZGU7CiAgc3RydWN0IGV4cGFuZF9vcGVyYW5kIG9wc1s2XTsKICBpbnQgYWFy Y2g2NF9jb25kOwoKICBwdXNoX3RvX3NlcXVlbmNlICgqcHJlcF9zZXEpOwogIGV4cGFuZF9vcGVy YW5kcyAodHJlZW9wMCwgdHJlZW9wMSwgTlVMTF9SVFgsICZvcDAsICZvcDEsIEVYUEFORF9OT1JN QUwpOwoKICBvcF9tb2RlID0gR0VUX01PREUgKG9wMCk7CiAgaWYgKG9wX21vZGUgPT0gVk9JRG1v ZGUpCiAgICBvcF9tb2RlID0gR0VUX01PREUgKG9wMSk7CgogIHN3aXRjaCAob3BfbW9kZSkKICAg IHsKICAgIGNhc2UgRV9RSW1vZGU6CiAgICBjYXNlIEVfSEltb2RlOgogICAgY2FzZSBFX1NJbW9k ZToKICAgICAgY21wX21vZGUgPSBTSW1vZGU7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgRV9ESW1v ZGU6CiAgICAgIGNtcF9tb2RlID0gREltb2RlOwogICAgICBicmVhazsKCiAgICBjYXNlIEVfU0Zt b2RlOgogICAgICBjbXBfbW9kZSA9IFNGbW9kZTsKICAgICAgY2NfbW9kZSA9IGFhcmNoNjRfc2Vs ZWN0X2NjX21vZGUgKChydHhfY29kZSkgY21wX2NvZGUsIG9wMCwgb3AxKTsKICAgICAgYnJlYWs7 CgogICAgY2FzZSBFX0RGbW9kZToKICAgICAgY21wX21vZGUgPSBERm1vZGU7CiAgICAgIGNjX21v ZGUgPSBhYXJjaDY0X3NlbGVjdF9jY19tb2RlICgocnR4X2NvZGUpIGNtcF9jb2RlLCBvcDAsIG9w MSk7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIGVuZF9zZXF1ZW5jZSAoKTsKICAg ICAgcmV0dXJuIE5VTExfUlRYOwogICAgfQoKICBpY29kZSA9IGNvZGVfZm9yX2NjbXAgKGNjX21v ZGUsIGNtcF9tb2RlKTsKCiAgb3AwID0gcHJlcGFyZV9vcGVyYW5kIChpY29kZSwgb3AwLCAyLCBv cF9tb2RlLCBjbXBfbW9kZSwgdW5zaWduZWRwKTsKICBvcDEgPSBwcmVwYXJlX29wZXJhbmQgKGlj b2RlLCBvcDEsIDMsIG9wX21vZGUsIGNtcF9tb2RlLCB1bnNpZ25lZHApOwogIGlmICghb3AwIHx8 ICFvcDEpCiAgICB7CiAgICAgIGVuZF9zZXF1ZW5jZSAoKTsKICAgICAgcmV0dXJuIE5VTExfUlRY OwogICAgfQogICpwcmVwX3NlcSA9IGdldF9pbnNucyAoKTsKICBlbmRfc2VxdWVuY2UgKCk7Cgog IHRhcmdldCA9IGdlbl9ydHhfUkVHIChjY19tb2RlLCBDQ19SRUdOVU0pOwogIGFhcmNoNjRfY29u ZCA9IGFhcmNoNjRfZ2V0X2NvbmRpdGlvbl9jb2RlXzEgKGNjX21vZGUsIChydHhfY29kZSkgY21w X2NvZGUpOwoKICBpZiAoYml0X2NvZGUgIT0gQU5EKQogICAgewogICAgICAvKiBUcmVhdCB0aGUg Y2NtcCBwYXR0ZXJucyBhcyBjYW5vbmljYWwgYW5kIHVzZSB0aGVtIHdoZXJlIHBvc3NpYmxlLAoJ IGJ1dCBmYWxsIGJhY2sgdG8gY2NtcF9yZXYgcGF0dGVybnMgaWYgdGhlcmUncyBubyBvdGhlciBv cHRpb24uICAqLwogICAgICBydHhfY29kZSBwcmV2X2NvZGUgPSBHRVRfQ09ERSAocHJldik7CiAg ICAgIG1hY2hpbmVfbW9kZSBwcmV2X21vZGUgPSBHRVRfTU9ERSAoWEVYUCAocHJldiwgMCkpOwog ICAgICBpZiAoKHByZXZfbW9kZSA9PSBDQ0ZQbW9kZSB8fCBwcmV2X21vZGUgPT0gQ0NGUEVtb2Rl KQoJICAmJiAhKHByZXZfY29kZSA9PSBFUQoJICAgICAgIHx8IHByZXZfY29kZSA9PSBORQoJICAg ICAgIHx8IHByZXZfY29kZSA9PSBPUkRFUkVECgkgICAgICAgfHwgcHJldl9jb2RlID09IFVOT1JE RVJFRCkpCglpY29kZSA9IGNvZGVfZm9yX2NjbXBfcmV2IChjY19tb2RlLCBjbXBfbW9kZSk7CiAg ICAgIGVsc2UKCXsKCSAgcnR4X2NvZGUgY29kZSA9IHJldmVyc2VfY29uZGl0aW9uIChwcmV2X2Nv ZGUpOwoJICBwcmV2ID0gZ2VuX3J0eF9mbXRfZWUgKGNvZGUsIFZPSURtb2RlLCBYRVhQIChwcmV2 LCAwKSwgY29uc3QwX3J0eCk7Cgl9CiAgICAgIGFhcmNoNjRfY29uZCA9IEFBUkNINjRfSU5WRVJT RV9DT05ESVRJT05fQ09ERSAoYWFyY2g2NF9jb25kKTsKICAgIH0KCiAgY3JlYXRlX2ZpeGVkX29w ZXJhbmQgKCZvcHNbMF0sIFhFWFAgKHByZXYsIDApKTsKICBjcmVhdGVfZml4ZWRfb3BlcmFuZCAo Jm9wc1sxXSwgdGFyZ2V0KTsKICBjcmVhdGVfZml4ZWRfb3BlcmFuZCAoJm9wc1syXSwgb3AwKTsK ICBjcmVhdGVfZml4ZWRfb3BlcmFuZCAoJm9wc1szXSwgb3AxKTsKICBjcmVhdGVfZml4ZWRfb3Bl cmFuZCAoJm9wc1s0XSwgcHJldik7CiAgY3JlYXRlX2ZpeGVkX29wZXJhbmQgKCZvcHNbNV0sIEdF Tl9JTlQgKGFhcmNoNjRfY29uZCkpOwoKICBwdXNoX3RvX3NlcXVlbmNlICgqZ2VuX3NlcSk7CiAg aWYgKCFtYXliZV9leHBhbmRfaW5zbiAoaWNvZGUsIDYsIG9wcykpCiAgICB7CiAgICAgIGVuZF9z ZXF1ZW5jZSAoKTsKICAgICAgcmV0dXJuIE5VTExfUlRYOwogICAgfQoKICAqZ2VuX3NlcSA9IGdl dF9pbnNucyAoKTsKICBlbmRfc2VxdWVuY2UgKCk7CgogIHJldHVybiBnZW5fcnR4X2ZtdF9lZSAo KHJ0eF9jb2RlKSBjbXBfY29kZSwgVk9JRG1vZGUsIHRhcmdldCwgY29uc3QwX3J0eCk7Cn0KCiN1 bmRlZiBUQVJHRVRfR0VOX0NDTVBfRklSU1QKI2RlZmluZSBUQVJHRVRfR0VOX0NDTVBfRklSU1Qg YWFyY2g2NF9nZW5fY2NtcF9maXJzdAoKI3VuZGVmIFRBUkdFVF9HRU5fQ0NNUF9ORVhUCiNkZWZp bmUgVEFSR0VUX0dFTl9DQ01QX05FWFQgYWFyY2g2NF9nZW5fY2NtcF9uZXh0CgovKiBJbXBsZW1l bnQgVEFSR0VUX1NDSEVEX01BQ1JPX0ZVU0lPTl9QLiAgUmV0dXJuIHRydWUgaWYgdGFyZ2V0IHN1 cHBvcnRzCiAgIGluc3RydWN0aW9uIGZ1c2lvbiBvZiBzb21lIHNvcnQuICAqLwoKc3RhdGljIGJv b2wKYWFyY2g2NF9tYWNyb19mdXNpb25fcCAodm9pZCkKewogIHJldHVybiBhYXJjaDY0X3R1bmVf cGFyYW1zLmZ1c2libGVfb3BzICE9IEFBUkNINjRfRlVTRV9OT1RISU5HOwp9CgoKLyogSW1wbGVt ZW50IFRBUkdFVF9TQ0hFRF9NQUNST19GVVNJT05fUEFJUl9QLiAgUmV0dXJuIHRydWUgaWYgUFJF ViBhbmQgQ1VSUgogICBzaG91bGQgYmUga2VwdCB0b2dldGhlciBkdXJpbmcgc2NoZWR1bGluZy4g ICovCgpzdGF0aWMgYm9vbAphYXJjaF9tYWNyb19mdXNpb25fcGFpcl9wIChydHhfaW5zbiAqcHJl diwgcnR4X2luc24gKmN1cnIpCnsKICBydHggc2V0X2Rlc3Q7CiAgcnR4IHByZXZfc2V0ID0gc2lu Z2xlX3NldCAocHJldik7CiAgcnR4IGN1cnJfc2V0ID0gc2luZ2xlX3NldCAoY3Vycik7CiAgLyog cHJldiBhbmQgY3VyciBhcmUgc2ltcGxlIFNFVCBpbnNucyBpLmUuIG5vIGZsYWcgc2V0dGluZyBv ciBicmFuY2hpbmcuICAqLwogIGJvb2wgc2ltcGxlX3NldHNfcCA9IHByZXZfc2V0ICYmIGN1cnJf c2V0ICYmICFhbnlfY29uZGp1bXBfcCAoY3Vycik7CgogIGlmICghYWFyY2g2NF9tYWNyb19mdXNp b25fcCAoKSkKICAgIHJldHVybiBmYWxzZTsKCiAgaWYgKHNpbXBsZV9zZXRzX3AgJiYgYWFyY2g2 NF9mdXNpb25fZW5hYmxlZF9wIChBQVJDSDY0X0ZVU0VfTU9WX01PVkspKQogICAgewogICAgICAv KiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoOgogICAgICAgICBwcmV2IChtb3YpICA9PSAoc2V0IChy ZWcgcjApIChjb25zdF9pbnQgaW1tMTYpKQogICAgICAgICBjdXJyIChtb3ZrKSA9PSAoc2V0ICh6 ZXJvX2V4dHJhY3QgKHJlZyByMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChjb25zdF9pbnQgMTYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoY29uc3RfaW50IDE2KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29u c3RfaW50IGltbTE2XzEpKSAgKi8KCiAgICAgIHNldF9kZXN0ID0gU0VUX0RFU1QgKGN1cnJfc2V0 KTsKCiAgICAgIGlmIChHRVRfQ09ERSAoc2V0X2Rlc3QpID09IFpFUk9fRVhUUkFDVAogICAgICAg ICAgJiYgQ09OU1RfSU5UX1AgKFNFVF9TUkMgKGN1cnJfc2V0KSkKICAgICAgICAgICYmIENPTlNU X0lOVF9QIChTRVRfU1JDIChwcmV2X3NldCkpCiAgICAgICAgICAmJiBDT05TVF9JTlRfUCAoWEVY UCAoc2V0X2Rlc3QsIDIpKQogICAgICAgICAgJiYgSU5UVkFMIChYRVhQIChzZXRfZGVzdCwgMikp ID09IDE2CiAgICAgICAgICAmJiBSRUdfUCAoWEVYUCAoc2V0X2Rlc3QsIDApKQogICAgICAgICAg JiYgUkVHX1AgKFNFVF9ERVNUIChwcmV2X3NldCkpCiAgICAgICAgICAmJiBSRUdOTyAoWEVYUCAo c2V0X2Rlc3QsIDApKSA9PSBSRUdOTyAoU0VUX0RFU1QgKHByZXZfc2V0KSkpCiAgICAgICAgewog ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICBpZiAoc2ltcGxlX3NldHNf cCAmJiBhYXJjaDY0X2Z1c2lvbl9lbmFibGVkX3AgKEFBUkNINjRfRlVTRV9BRFJQX0FERCkpCiAg ICB7CgogICAgICAvKiAgV2UncmUgdHJ5aW5nIHRvIG1hdGNoOgogICAgICAgICAgcHJldiAoYWRy cCkgPT0gKHNldCAocmVnIHIxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGlnaCAo c3ltYm9sX3JlZiAoIlNZTSIpKSkpCiAgICAgICAgICBjdXJyIChhZGQpID09IChzZXQgKHJlZyBy MCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9fc3VtIChyZWcgcjEpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3ltYm9sX3JlZiAoIlNZTSIpKSkpCiAgICAg ICAgICBOb3RlIHRoYXQgcjAgbmVlZCBub3QgbmVjZXNzYXJpbHkgYmUgdGhlIHNhbWUgYXMgcjEs IGVzcGVjaWFsbHkKICAgICAgICAgIGR1cmluZyBwcmUtcmVnYWxsb2Mgc2NoZWR1bGluZy4gICov CgogICAgICBpZiAoc2F0aXNmaWVzX2NvbnN0cmFpbnRfVXNoIChTRVRfU1JDIChwcmV2X3NldCkp CiAgICAgICAgICAmJiBSRUdfUCAoU0VUX0RFU1QgKHByZXZfc2V0KSkgJiYgUkVHX1AgKFNFVF9E RVNUIChjdXJyX3NldCkpKQogICAgICAgIHsKICAgICAgICAgIGlmIChHRVRfQ09ERSAoU0VUX1NS QyAoY3Vycl9zZXQpKSA9PSBMT19TVU0KICAgICAgICAgICAgICAmJiBSRUdfUCAoWEVYUCAoU0VU X1NSQyAoY3Vycl9zZXQpLCAwKSkKICAgICAgICAgICAgICAmJiBSRUdOTyAoWEVYUCAoU0VUX1NS QyAoY3Vycl9zZXQpLCAwKSkKICAgICAgICAgICAgICAgICA9PSBSRUdOTyAoU0VUX0RFU1QgKHBy ZXZfc2V0KSkKICAgICAgICAgICAgICAmJiBydHhfZXF1YWxfcCAoWEVYUCAoU0VUX1NSQyAocHJl dl9zZXQpLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVYUCAoU0VUX1NSQyAo Y3Vycl9zZXQpLCAxKSkpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0K CiAgaWYgKHNpbXBsZV9zZXRzX3AgJiYgYWFyY2g2NF9mdXNpb25fZW5hYmxlZF9wIChBQVJDSDY0 X0ZVU0VfTU9WS19NT1ZLKSkKICAgIHsKCiAgICAgIC8qIFdlJ3JlIHRyeWluZyB0byBtYXRjaDoK ICAgICAgICAgcHJldiAobW92aykgPT0gKHNldCAoemVyb19leHRyYWN0IChyZWcgcjApCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDE2KQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAzMikpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCBpbW0xNl8xKSkKICAgICAgICAg Y3VyciAobW92aykgPT0gKHNldCAoemVyb19leHRyYWN0IChyZWcgcjApCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDE2KQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA0OCkpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCBpbW0xNl8yKSkgICovCgogICAgICBpZiAoR0VU X0NPREUgKFNFVF9ERVNUIChwcmV2X3NldCkpID09IFpFUk9fRVhUUkFDVAogICAgICAgICAgJiYg R0VUX0NPREUgKFNFVF9ERVNUIChjdXJyX3NldCkpID09IFpFUk9fRVhUUkFDVAogICAgICAgICAg JiYgUkVHX1AgKFhFWFAgKFNFVF9ERVNUIChwcmV2X3NldCksIDApKQogICAgICAgICAgJiYgUkVH X1AgKFhFWFAgKFNFVF9ERVNUIChjdXJyX3NldCksIDApKQogICAgICAgICAgJiYgUkVHTk8gKFhF WFAgKFNFVF9ERVNUIChwcmV2X3NldCksIDApKQogICAgICAgICAgICAgPT0gUkVHTk8gKFhFWFAg KFNFVF9ERVNUIChjdXJyX3NldCksIDApKQogICAgICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAg KFNFVF9ERVNUIChwcmV2X3NldCksIDIpKQogICAgICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAg KFNFVF9ERVNUIChjdXJyX3NldCksIDIpKQogICAgICAgICAgJiYgSU5UVkFMIChYRVhQIChTRVRf REVTVCAocHJldl9zZXQpLCAyKSkgPT0gMzIKICAgICAgICAgICYmIElOVFZBTCAoWEVYUCAoU0VU X0RFU1QgKGN1cnJfc2V0KSwgMikpID09IDQ4CiAgICAgICAgICAmJiBDT05TVF9JTlRfUCAoU0VU X1NSQyAocHJldl9zZXQpKQogICAgICAgICAgJiYgQ09OU1RfSU5UX1AgKFNFVF9TUkMgKGN1cnJf c2V0KSkpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgfQogIGlmIChzaW1wbGVfc2V0c19wICYm IGFhcmNoNjRfZnVzaW9uX2VuYWJsZWRfcCAoQUFSQ0g2NF9GVVNFX0FEUlBfTERSKSkKICAgIHsK ICAgICAgLyogV2UncmUgdHJ5aW5nIHRvIG1hdGNoOgogICAgICAgICAgcHJldiAoYWRycCkgPT0g KHNldCAocmVnIHIwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGlnaCAoc3ltYm9s X3JlZiAoIlNZTSIpKSkpCiAgICAgICAgICBjdXJyIChsZHIpID09IChzZXQgKHJlZyByMSkKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtIChsb19zdW0gKHJlZyByMCkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbF9yZWYgKCJTWU0iKSkp KSkKICAgICAgICAgICAgICAgICBvcgogICAgICAgICAgY3VyciAobGRyKSA9PSAoc2V0IChyZWcg cjEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHplcm9fZXh0ZW5kIChtZW0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb19zdW0gKHJlZyByMCkKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbF9y ZWYgKCJTWU0iKSkpKSkpICAqLwogICAgICBpZiAoc2F0aXNmaWVzX2NvbnN0cmFpbnRfVXNoIChT RVRfU1JDIChwcmV2X3NldCkpCiAgICAgICAgICAmJiBSRUdfUCAoU0VUX0RFU1QgKHByZXZfc2V0 KSkgJiYgUkVHX1AgKFNFVF9ERVNUIChjdXJyX3NldCkpKQogICAgICAgIHsKICAgICAgICAgIHJ0 eCBjdXJyX3NyYyA9IFNFVF9TUkMgKGN1cnJfc2V0KTsKCiAgICAgICAgICBpZiAoR0VUX0NPREUg KGN1cnJfc3JjKSA9PSBaRVJPX0VYVEVORCkKICAgICAgICAgICAgY3Vycl9zcmMgPSBYRVhQIChj dXJyX3NyYywgMCk7CgogICAgICAgICAgaWYgKE1FTV9QIChjdXJyX3NyYykgJiYgR0VUX0NPREUg KFhFWFAgKGN1cnJfc3JjLCAwKSkgPT0gTE9fU1VNCiAgICAgICAgICAgICAgJiYgUkVHX1AgKFhF WFAgKFhFWFAgKGN1cnJfc3JjLCAwKSwgMCkpCiAgICAgICAgICAgICAgJiYgUkVHTk8gKFhFWFAg KFhFWFAgKGN1cnJfc3JjLCAwKSwgMCkpCiAgICAgICAgICAgICAgICAgPT0gUkVHTk8gKFNFVF9E RVNUIChwcmV2X3NldCkpCiAgICAgICAgICAgICAgJiYgcnR4X2VxdWFsX3AgKFhFWFAgKFhFWFAg KGN1cnJfc3JjLCAwKSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFWFAgKFNF VF9TUkMgKHByZXZfc2V0KSwgMCkpKQogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAg IH0KICAgIH0KCiAgLyogRnVzZSBjb21wYXJlIChDTVAvQ01OL1RTVC9CSUNTKSBhbmQgY29uZGl0 aW9uYWwgYnJhbmNoLiAgKi8KICBpZiAoYWFyY2g2NF9mdXNpb25fZW5hYmxlZF9wIChBQVJDSDY0 X0ZVU0VfQ01QX0JSQU5DSCkKICAgICAgJiYgcHJldl9zZXQgJiYgY3Vycl9zZXQgJiYgYW55X2Nv bmRqdW1wX3AgKGN1cnIpCiAgICAgICYmIEdFVF9DT0RFIChTRVRfU1JDIChwcmV2X3NldCkpID09 IENPTVBBUkUKICAgICAgJiYgU0NBTEFSX0lOVF9NT0RFX1AgKEdFVF9NT0RFIChYRVhQIChTRVRf U1JDIChwcmV2X3NldCksIDApKSkKICAgICAgJiYgcmVnX3JlZmVyZW5jZWRfcCAoU0VUX0RFU1Qg KHByZXZfc2V0KSwgUEFUVEVSTiAoY3VycikpKQogICAgcmV0dXJuIHRydWU7CgogIC8qIEZ1c2Ug ZmxhZy1zZXR0aW5nIEFMVSBpbnN0cnVjdGlvbnMgYW5kIGNvbmRpdGlvbmFsIGJyYW5jaC4gICov CiAgaWYgKGFhcmNoNjRfZnVzaW9uX2VuYWJsZWRfcCAoQUFSQ0g2NF9GVVNFX0FMVV9CUkFOQ0gp CiAgICAgICYmIGFueV9jb25kanVtcF9wIChjdXJyKSkKICAgIHsKICAgICAgdW5zaWduZWQgaW50 IGNvbmRyZWcxLCBjb25kcmVnMjsKICAgICAgcnR4IGNjX3JlZ18xOwogICAgICBhYXJjaDY0X2Zp eGVkX2NvbmRpdGlvbl9jb2RlX3JlZ3MgKCZjb25kcmVnMSwgJmNvbmRyZWcyKTsKICAgICAgY2Nf cmVnXzEgPSBnZW5fcnR4X1JFRyAoQ0Ntb2RlLCBjb25kcmVnMSk7CgogICAgICBpZiAocmVnX3Jl ZmVyZW5jZWRfcCAoY2NfcmVnXzEsIFBBVFRFUk4gKGN1cnIpKQoJICAmJiBwcmV2CgkgICYmIG1v ZGlmaWVkX2luX3AgKGNjX3JlZ18xLCBwcmV2KSkKCXsKCSAgZW51bSBhdHRyX3R5cGUgcHJldl90 eXBlID0gZ2V0X2F0dHJfdHlwZSAocHJldik7CgoJICAvKiBGSVhNRTogdGhpcyBtaXNzZXMgc29t ZSB3aGljaCBpcyBjb25zaWRlcmVkIHNpbXBsZSBhcnRoZW1hdGljCgkgICAgIGluc3RydWN0aW9u cyBmb3IgVGh1bmRlclguICBTaW1wbGUgc2hpZnRzIGFyZSBtaXNzZWQgaGVyZS4gICovCgkgIGlm IChwcmV2X3R5cGUgPT0gVFlQRV9BTFVTX1NSRUcKCSAgICAgIHx8IHByZXZfdHlwZSA9PSBUWVBF X0FMVVNfSU1NCgkgICAgICB8fCBwcmV2X3R5cGUgPT0gVFlQRV9MT0dJQ1NfUkVHCgkgICAgICB8 fCBwcmV2X3R5cGUgPT0gVFlQRV9MT0dJQ1NfSU1NKQoJICAgIHJldHVybiB0cnVlOwoJfQogICAg fQoKICAvKiBGdXNlIEFMVSBpbnN0cnVjdGlvbnMgYW5kIENCWi9DQk5aLiAgKi8KICBpZiAocHJl dl9zZXQKICAgICAgJiYgY3Vycl9zZXQKICAgICAgJiYgYWFyY2g2NF9mdXNpb25fZW5hYmxlZF9w IChBQVJDSDY0X0ZVU0VfQUxVX0NCWikKICAgICAgJiYgYW55X2NvbmRqdW1wX3AgKGN1cnIpKQog ICAgewogICAgICAvKiBXZSdyZSB0cnlpbmcgdG8gbWF0Y2g6CgkgIHByZXYgKGFsdV9pbnNuKSA9 PSAoc2V0IChyMCkgcGx1cyAoKHIwKSAocjEvaW1tKSkpCgkgIGN1cnIgKGNieikgPT0gIChzZXQg KHBjKSAoaWZfdGhlbl9lbHNlIChlcS9uZSkgKHIwKQoJCQkJCQkJIChjb25zdF9pbnQgMCkpCgkJ CQkJCSAobGFiZWxfcmVmICgiU1lNIikpCgkJCQkJCSAocGMpKSAgKi8KICAgICAgaWYgKFNFVF9E RVNUIChjdXJyX3NldCkgPT0gKHBjX3J0eCkKCSAgJiYgR0VUX0NPREUgKFNFVF9TUkMgKGN1cnJf c2V0KSkgPT0gSUZfVEhFTl9FTFNFCgkgICYmIFJFR19QIChYRVhQIChYRVhQIChTRVRfU1JDIChj dXJyX3NldCksIDApLCAwKSkKCSAgJiYgUkVHX1AgKFNFVF9ERVNUIChwcmV2X3NldCkpCgkgICYm IFJFR05PIChTRVRfREVTVCAocHJldl9zZXQpKQoJICAgICA9PSBSRUdOTyAoWEVYUCAoWEVYUCAo U0VUX1NSQyAoY3Vycl9zZXQpLCAwKSwgMCkpKQoJewoJICAvKiBGdXNlIEFMVSBvcGVyYXRpb25z IGZvbGxvd2VkIGJ5IGNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCgkgIHN3aXRj aCAoZ2V0X2F0dHJfdHlwZSAocHJldikpCgkgICAgewoJICAgIGNhc2UgVFlQRV9BTFVfSU1NOgoJ ICAgIGNhc2UgVFlQRV9BTFVfU1JFRzoKCSAgICBjYXNlIFRZUEVfQURDX1JFRzoKCSAgICBjYXNl IFRZUEVfQURDX0lNTToKCSAgICBjYXNlIFRZUEVfQURDU19SRUc6CgkgICAgY2FzZSBUWVBFX0FE Q1NfSU1NOgoJICAgIGNhc2UgVFlQRV9MT0dJQ19SRUc6CgkgICAgY2FzZSBUWVBFX0xPR0lDX0lN TToKCSAgICBjYXNlIFRZUEVfQ1NFTDoKCSAgICBjYXNlIFRZUEVfQURSOgoJICAgIGNhc2UgVFlQ RV9NT1ZfSU1NOgoJICAgIGNhc2UgVFlQRV9TSElGVF9SRUc6CgkgICAgY2FzZSBUWVBFX1NISUZU X0lNTToKCSAgICBjYXNlIFRZUEVfQkZNOgoJICAgIGNhc2UgVFlQRV9SQklUOgoJICAgIGNhc2Ug VFlQRV9SRVY6CgkgICAgY2FzZSBUWVBFX0VYVEVORDoKCSAgICAgIHJldHVybiB0cnVlOwoKCSAg ICBkZWZhdWx0OjsKCSAgICB9Cgl9CiAgICB9CgogIC8qIEZ1c2UgQStCKzEgYW5kIEEtQi0xICov CiAgaWYgKHNpbXBsZV9zZXRzX3AKICAgICAgJiYgYWFyY2g2NF9mdXNpb25fZW5hYmxlZF9wIChB QVJDSDY0X0ZVU0VfQUREU1VCXzJSRUdfQ09OU1QxKSkKICAgIHsKICAgICAgLyogV2UncmUgdHJ5 aW5nIHRvIG1hdGNoOgoJICBwcmV2ID09IChzZXQgKHIwKSAocGx1cyAocjApIChyMSkpKQoJICBj dXJyID09IChzZXQgKHIwKSAocGx1cyAocjApIChjb25zdF9pbnQgMSkpKQoJb3I6CgkgIHByZXYg PT0gKHNldCAocjApIChtaW51cyAocjApIChyMSkpKQoJICBjdXJyID09IChzZXQgKHIwKSAocGx1 cyAocjApIChjb25zdF9pbnQgLTEpKSkgKi8KCiAgICAgIHJ0eCBwcmV2X3NyYyA9IFNFVF9TUkMg KHByZXZfc2V0KTsKICAgICAgcnR4IGN1cnJfc3JjID0gU0VUX1NSQyAoY3Vycl9zZXQpOwoKICAg ICAgaW50IHBvbGFyaXR5ID0gMTsKICAgICAgaWYgKEdFVF9DT0RFIChwcmV2X3NyYykgPT0gTUlO VVMpCglwb2xhcml0eSA9IC0xOwoKICAgICAgaWYgKEdFVF9DT0RFIChjdXJyX3NyYykgPT0gUExV UwoJICAmJiAoR0VUX0NPREUgKHByZXZfc3JjKSA9PSBQTFVTIHx8IEdFVF9DT0RFIChwcmV2X3Ny YykgPT0gTUlOVVMpCgkgICYmIENPTlNUX0lOVF9QIChYRVhQIChjdXJyX3NyYywgMSkpCgkgICYm IElOVFZBTCAoWEVYUCAoY3Vycl9zcmMsIDEpKSA9PSBwb2xhcml0eQoJICAmJiBSRUdfUCAoWEVY UCAoY3Vycl9zcmMsIDApKQoJICAmJiBSRUdfUCAoU0VUX0RFU1QgKHByZXZfc2V0KSkKCSAgJiYg UkVHTk8gKFNFVF9ERVNUIChwcmV2X3NldCkpID09IFJFR05PIChYRVhQIChjdXJyX3NyYywgMCkp KQoJcmV0dXJuIHRydWU7CiAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKLyogUmV0dXJuIHRydWUg aWZmIHRoZSBpbnN0cnVjdGlvbiBmdXNpb24gZGVzY3JpYmVkIGJ5IE9QIGlzIGVuYWJsZWQuICAq LwoKYm9vbAphYXJjaDY0X2Z1c2lvbl9lbmFibGVkX3AgKGVudW0gYWFyY2g2NF9mdXNpb25fcGFp cnMgb3ApCnsKICByZXR1cm4gKGFhcmNoNjRfdHVuZV9wYXJhbXMuZnVzaWJsZV9vcHMgJiBvcCkg IT0gMDsKfQoKLyogSWYgTUVNIGlzIGluIHRoZSBmb3JtIG9mIFtiYXNlK29mZnNldF0sIGV4dHJh Y3QgdGhlIHR3byBwYXJ0cwogICBvZiBhZGRyZXNzIGFuZCBzZXQgdG8gQkFTRSBhbmQgT0ZGU0VU LCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlCiAgIGFmdGVyIGNsZWFyaW5nIEJBU0UgYW5kIE9GRlNF VC4gICovCgpib29sCmV4dHJhY3RfYmFzZV9vZmZzZXRfaW5fYWRkciAocnR4IG1lbSwgcnR4ICpi YXNlLCBydHggKm9mZnNldCkKewogIHJ0eCBhZGRyOwoKICBnY2NfYXNzZXJ0IChNRU1fUCAobWVt KSk7CgogIGFkZHIgPSBYRVhQIChtZW0sIDApOwoKICBpZiAoUkVHX1AgKGFkZHIpKQogICAgewog ICAgICAqYmFzZSA9IGFkZHI7CiAgICAgICpvZmZzZXQgPSBjb25zdDBfcnR4OwogICAgICByZXR1 cm4gdHJ1ZTsKICAgIH0KCiAgaWYgKEdFVF9DT0RFIChhZGRyKSA9PSBQTFVTCiAgICAgICYmIFJF R19QIChYRVhQIChhZGRyLCAwKSkgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKGFkZHIsIDEpKSkKICAg IHsKICAgICAgKmJhc2UgPSBYRVhQIChhZGRyLCAwKTsKICAgICAgKm9mZnNldCA9IFhFWFAgKGFk ZHIsIDEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgKmJhc2UgPSBOVUxMX1JUWDsKICAq b2Zmc2V0ID0gTlVMTF9SVFg7CgogIHJldHVybiBmYWxzZTsKfQoKLyogVHlwZXMgZm9yIHNjaGVk dWxpbmcgZnVzaW9uLiAgKi8KZW51bSBzY2hlZF9mdXNpb25fdHlwZQp7CiAgU0NIRURfRlVTSU9O X05PTkUgPSAwLAogIFNDSEVEX0ZVU0lPTl9MRF9TSUdOX0VYVEVORCwKICBTQ0hFRF9GVVNJT05f TERfWkVST19FWFRFTkQsCiAgU0NIRURfRlVTSU9OX0xELAogIFNDSEVEX0ZVU0lPTl9TVCwKICBT Q0hFRF9GVVNJT05fTlVNCn07CgovKiBJZiBJTlNOIGlzIGEgbG9hZCBvciBzdG9yZSBvZiBhZGRy ZXNzIGluIHRoZSBmb3JtIG9mIFtiYXNlK29mZnNldF0sCiAgIGV4dHJhY3QgdGhlIHR3byBwYXJ0 cyBhbmQgc2V0IHRvIEJBU0UgYW5kIE9GRlNFVC4gIFJldHVybiBzY2hlZHVsaW5nCiAgIGZ1c2lv biB0eXBlIHRoaXMgSU5TTiBpcy4gICovCgpzdGF0aWMgZW51bSBzY2hlZF9mdXNpb25fdHlwZQpm dXNpb25fbG9hZF9zdG9yZSAocnR4X2luc24gKmluc24sIHJ0eCAqYmFzZSwgcnR4ICpvZmZzZXQp CnsKICBydHggeCwgZGVzdCwgc3JjOwogIGVudW0gc2NoZWRfZnVzaW9uX3R5cGUgZnVzaW9uID0g U0NIRURfRlVTSU9OX0xEOwoKICBnY2NfYXNzZXJ0IChJTlNOX1AgKGluc24pKTsKICB4ID0gUEFU VEVSTiAoaW5zbik7CiAgaWYgKEdFVF9DT0RFICh4KSAhPSBTRVQpCiAgICByZXR1cm4gU0NIRURf RlVTSU9OX05PTkU7CgogIHNyYyA9IFNFVF9TUkMgKHgpOwogIGRlc3QgPSBTRVRfREVTVCAoeCk7 CgogIG1hY2hpbmVfbW9kZSBkZXN0X21vZGUgPSBHRVRfTU9ERSAoZGVzdCk7CgogIGlmICghYWFy Y2g2NF9tb2RlX3ZhbGlkX2Zvcl9zY2hlZF9mdXNpb25fcCAoZGVzdF9tb2RlKSkKICAgIHJldHVy biBTQ0hFRF9GVVNJT05fTk9ORTsKCiAgaWYgKEdFVF9DT0RFIChzcmMpID09IFNJR05fRVhURU5E KQogICAgewogICAgICBmdXNpb24gPSBTQ0hFRF9GVVNJT05fTERfU0lHTl9FWFRFTkQ7CiAgICAg IHNyYyA9IFhFWFAgKHNyYywgMCk7CiAgICAgIGlmICghTUVNX1AgKHNyYykgfHwgR0VUX01PREUg KHNyYykgIT0gU0ltb2RlKQoJcmV0dXJuIFNDSEVEX0ZVU0lPTl9OT05FOwogICAgfQogIGVsc2Ug aWYgKEdFVF9DT0RFIChzcmMpID09IFpFUk9fRVhURU5EKQogICAgewogICAgICBmdXNpb24gPSBT Q0hFRF9GVVNJT05fTERfWkVST19FWFRFTkQ7CiAgICAgIHNyYyA9IFhFWFAgKHNyYywgMCk7CiAg ICAgIGlmICghTUVNX1AgKHNyYykgfHwgR0VUX01PREUgKHNyYykgIT0gU0ltb2RlKQoJcmV0dXJu IFNDSEVEX0ZVU0lPTl9OT05FOwogICAgfQoKICBpZiAoTUVNX1AgKHNyYykgJiYgUkVHX1AgKGRl c3QpKQogICAgZXh0cmFjdF9iYXNlX29mZnNldF9pbl9hZGRyIChzcmMsIGJhc2UsIG9mZnNldCk7 CiAgZWxzZSBpZiAoTUVNX1AgKGRlc3QpICYmIChSRUdfUCAoc3JjKSB8fCBzcmMgPT0gY29uc3Qw X3J0eCkpCiAgICB7CiAgICAgIGZ1c2lvbiA9IFNDSEVEX0ZVU0lPTl9TVDsKICAgICAgZXh0cmFj dF9iYXNlX29mZnNldF9pbl9hZGRyIChkZXN0LCBiYXNlLCBvZmZzZXQpOwogICAgfQogIGVsc2UK ICAgIHJldHVybiBTQ0hFRF9GVVNJT05fTk9ORTsKCiAgaWYgKCpiYXNlID09IE5VTExfUlRYIHx8 ICpvZmZzZXQgPT0gTlVMTF9SVFgpCiAgICBmdXNpb24gPSBTQ0hFRF9GVVNJT05fTk9ORTsKCiAg cmV0dXJuIGZ1c2lvbjsKfQoKLyogSW1wbGVtZW50IHRoZSBUQVJHRVRfU0NIRURfRlVTSU9OX1BS SU9SSVRZIGhvb2suCgogICBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IHRvIGZ1c2UgbGRyIG9y IHN0ciBpbnN0cnVjdGlvbnMsIHNvIEZVU0lPTl9QUkkKICAgYW5kIFBSSSBhcmUgb25seSBjYWxj dWxhdGVkIGZvciB0aGVzZSBpbnN0cnVjdGlvbnMuICBGb3Igb3RoZXIgaW5zdHJ1Y3Rpb24sCiAg IEZVU0lPTl9QUkkgYW5kIFBSSSBhcmUgc2ltcGx5IHNldCB0byBNQVhfUFJJIC0gMS4gIEluIHRo ZSBmdXR1cmUsIG90aGVyCiAgIHR5cGUgaW5zdHJ1Y3Rpb24gZnVzaW9uIGNhbiBiZSBhZGRlZCBi eSByZXR1cm5pbmcgZGlmZmVyZW50IHByaW9yaXRpZXMuCgogICBJdCdzIGltcG9ydGFudCB0aGF0 IGlycmVsZXZhbnQgaW5zdHJ1Y3Rpb25zIGdldCB0aGUgbGFyZ2VzdCBGVVNJT05fUFJJLiAgKi8K CnN0YXRpYyB2b2lkCmFhcmNoNjRfc2NoZWRfZnVzaW9uX3ByaW9yaXR5IChydHhfaW5zbiAqaW5z biwgaW50IG1heF9wcmksCgkJCSAgICAgICBpbnQgKmZ1c2lvbl9wcmksIGludCAqcHJpKQp7CiAg aW50IHRtcCwgb2ZmX3ZhbDsKICBydHggYmFzZSwgb2Zmc2V0OwogIGVudW0gc2NoZWRfZnVzaW9u X3R5cGUgZnVzaW9uOwoKICBnY2NfYXNzZXJ0IChJTlNOX1AgKGluc24pKTsKCiAgdG1wID0gbWF4 X3ByaSAtIDE7CiAgZnVzaW9uID0gZnVzaW9uX2xvYWRfc3RvcmUgKGluc24sICZiYXNlLCAmb2Zm c2V0KTsKICBpZiAoZnVzaW9uID09IFNDSEVEX0ZVU0lPTl9OT05FKQogICAgewogICAgICAqcHJp ID0gdG1wOwogICAgICAqZnVzaW9uX3ByaSA9IHRtcDsKICAgICAgcmV0dXJuOwogICAgfQoKICAv KiBTZXQgRlVTSU9OX1BSSSBhY2NvcmRpbmcgdG8gZnVzaW9uIHR5cGUgYW5kIGJhc2UgcmVnaXN0 ZXIuICAqLwogICpmdXNpb25fcHJpID0gdG1wIC0gZnVzaW9uICogRklSU1RfUFNFVURPX1JFR0lT VEVSIC0gUkVHTk8gKGJhc2UpOwoKICAvKiBDYWxjdWxhdGUgUFJJLiAgKi8KICB0bXAgLz0gMjsK CiAgLyogSU5TTiB3aXRoIHNtYWxsZXIgb2Zmc2V0IGdvZXMgZmlyc3QuICAqLwogIG9mZl92YWwg PSAoaW50KShJTlRWQUwgKG9mZnNldCkpOwogIGlmIChvZmZfdmFsID49IDApCiAgICB0bXAgLT0g KG9mZl92YWwgJiAweGZmZmZmKTsKICBlbHNlCiAgICB0bXAgKz0gKCgtIG9mZl92YWwpICYgMHhm ZmZmZik7CgogICpwcmkgPSB0bXA7CiAgcmV0dXJuOwp9CgovKiBJbXBsZW1lbnQgdGhlIFRBUkdF VF9TQ0hFRF9BREpVU1RfUFJJT1JJVFkgaG9vay4KICAgQWRqdXN0IHByaW9yaXR5IG9mIHNoYTFo IGluc3RydWN0aW9ucyBzbyB0aGV5IGFyZSBzY2hlZHVsZWQgYmVmb3JlCiAgIG90aGVyIFNIQTEg aW5zdHJ1Y3Rpb25zLiAgKi8KCnN0YXRpYyBpbnQKYWFyY2g2NF9zY2hlZF9hZGp1c3RfcHJpb3Jp dHkgKHJ0eF9pbnNuICppbnNuLCBpbnQgcHJpb3JpdHkpCnsKICBydHggeCA9IFBBVFRFUk4gKGlu c24pOwoKICBpZiAoR0VUX0NPREUgKHgpID09IFNFVCkKICAgIHsKICAgICAgeCA9IFNFVF9TUkMg KHgpOwoKICAgICAgaWYgKEdFVF9DT0RFICh4KSA9PSBVTlNQRUMgJiYgWElOVCAoeCwgMSkgPT0g VU5TUEVDX1NIQTFIKQoJcmV0dXJuIHByaW9yaXR5ICsgMTA7CiAgICB9CgogIHJldHVybiBwcmlv cml0eTsKfQoKLyogSWYgUkVWRVJTRUQgaXMgbnVsbCwgcmV0dXJuIHRydWUgaWYgbWVtb3J5IHJl ZmVyZW5jZSAqTUVNMiBjb21lcwogICBpbW1lZGlhdGVseSBhZnRlciBtZW1vcnkgcmVmZXJlbmNl ICpNRU0xLiAgRG8gbm90IGNoYW5nZSB0aGUgcmVmZXJlbmNlcwogICBpbiB0aGlzIGNhc2UuCgog ICBPdGhlcndpc2UsIGNoZWNrIGlmICpNRU0xIGFuZCAqTUVNMiBhcmUgY29uc2VjdXRpdmUgbWVt b3J5IHJlZmVyZW5jZXMgYW5kLAogICBpZiB0aGV5IGFyZSwgdHJ5IHRvIG1ha2UgdGhlbSB1c2Ug Y29uc3RhbnQgb2Zmc2V0cyBmcm9tIHRoZSBzYW1lIGJhc2UKICAgcmVnaXN0ZXIuICBSZXR1cm4g dHJ1ZSBvbiBzdWNjZXNzLiAgV2hlbiByZXR1cm5pbmcgdHJ1ZSwgc2V0ICpSRVZFUlNFRAogICB0 byB0cnVlIGlmICpNRU0xIGNvbWVzIGFmdGVyICpNRU0yLCBmYWxzZSBpZiAqTUVNMSBjb21lcyBi ZWZvcmUgKk1FTTIuICAqLwpzdGF0aWMgYm9vbAphYXJjaDY0X2NoZWNrX2NvbnNlY3V0aXZlX21l bXMgKHJ0eCAqbWVtMSwgcnR4ICptZW0yLCBib29sICpyZXZlcnNlZCkKewogIGlmIChyZXZlcnNl ZCkKICAgICpyZXZlcnNlZCA9IGZhbHNlOwoKICBpZiAoR0VUX1JUWF9DTEFTUyAoR0VUX0NPREUg KFhFWFAgKCptZW0xLCAwKSkpID09IFJUWF9BVVRPSU5DCiAgICAgIHx8IEdFVF9SVFhfQ0xBU1Mg KEdFVF9DT0RFIChYRVhQICgqbWVtMiwgMCkpKSA9PSBSVFhfQVVUT0lOQykKICAgIHJldHVybiBm YWxzZTsKCiAgaWYgKCFNRU1fU0laRV9LTk9XTl9QICgqbWVtMSkgfHwgIU1FTV9TSVpFX0tOT1dO X1AgKCptZW0yKSkKICAgIHJldHVybiBmYWxzZTsKCiAgYXV0byBzaXplMSA9IE1FTV9TSVpFICgq bWVtMSk7CiAgYXV0byBzaXplMiA9IE1FTV9TSVpFICgqbWVtMik7CgogIHJ0eCBiYXNlMSwgYmFz ZTIsIG9mZnNldDEsIG9mZnNldDI7CiAgZXh0cmFjdF9iYXNlX29mZnNldF9pbl9hZGRyICgqbWVt MSwgJmJhc2UxLCAmb2Zmc2V0MSk7CiAgZXh0cmFjdF9iYXNlX29mZnNldF9pbl9hZGRyICgqbWVt MiwgJmJhc2UyLCAmb2Zmc2V0Mik7CgogIC8qIE1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgbWVtb3J5 IGlzIGluIGJhc2Urb2Zmc2V0IGZvcm0uICAqLwogIGlmICghKGJhc2UxICYmIG9mZnNldDEpICYm ICEoYmFzZTIgJiYgb2Zmc2V0MikpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIElmIGJvdGggbWVt cyBhbHJlYWR5IHVzZSB0aGUgc2FtZSBiYXNlIHJlZ2lzdGVyLCBqdXN0IGNoZWNrIHRoZQogICAg IG9mZnNldHMuICAqLwogIGlmIChiYXNlMSAmJiBiYXNlMiAmJiBydHhfZXF1YWxfcCAoYmFzZTEs IGJhc2UyKSkKICAgIHsKICAgICAgaWYgKCFvZmZzZXQxIHx8ICFvZmZzZXQyKQoJcmV0dXJuIGZh bHNlOwoKICAgICAgaWYgKGtub3duX2VxIChVSU5UVkFMIChvZmZzZXQxKSArIHNpemUxLCBVSU5U VkFMIChvZmZzZXQyKSkpCglyZXR1cm4gdHJ1ZTsKCiAgICAgIGlmIChrbm93bl9lcSAoVUlOVFZB TCAob2Zmc2V0MikgKyBzaXplMiwgVUlOVFZBTCAob2Zmc2V0MSkpICYmIHJldmVyc2VkKQoJewoJ ICAqcmV2ZXJzZWQgPSB0cnVlOwoJICByZXR1cm4gdHJ1ZTsKCX0KCiAgICAgIHJldHVybiBmYWxz ZTsKICAgIH0KCiAgLyogT3RoZXJ3aXNlLCBjaGVjayB3aGV0aGVyIHRoZSBNRU1fRVhQUnMgYW5k IE1FTV9PRkZTRVRzIHRvZ2V0aGVyCiAgICAgZ3VhcmFudGVlIHRoYXQgdGhlIHZhbHVlcyBhcmUg Y29uc2VjdXRpdmUuICAqLwogIGlmIChNRU1fRVhQUiAoKm1lbTEpCiAgICAgICYmIE1FTV9FWFBS ICgqbWVtMikKICAgICAgJiYgTUVNX09GRlNFVF9LTk9XTl9QICgqbWVtMSkKICAgICAgJiYgTUVN X09GRlNFVF9LTk9XTl9QICgqbWVtMikpCiAgICB7CiAgICAgIHBvbHlfaW50NjQgZXhwcl9vZmZz ZXQxOwogICAgICBwb2x5X2ludDY0IGV4cHJfb2Zmc2V0MjsKICAgICAgdHJlZSBleHByX2Jhc2Ux ID0gZ2V0X2FkZHJfYmFzZV9hbmRfdW5pdF9vZmZzZXQgKE1FTV9FWFBSICgqbWVtMSksCgkJCQkJ CSAgICAgICAmZXhwcl9vZmZzZXQxKTsKICAgICAgdHJlZSBleHByX2Jhc2UyID0gZ2V0X2FkZHJf YmFzZV9hbmRfdW5pdF9vZmZzZXQgKE1FTV9FWFBSICgqbWVtMiksCgkJCQkJCSAgICAgICAmZXhw cl9vZmZzZXQyKTsKICAgICAgaWYgKCFleHByX2Jhc2UxCgkgIHx8ICFleHByX2Jhc2UyCgkgIHx8 ICFERUNMX1AgKGV4cHJfYmFzZTEpCgkgIHx8ICFvcGVyYW5kX2VxdWFsX3AgKGV4cHJfYmFzZTEs IGV4cHJfYmFzZTIsIE9FUF9BRERSRVNTX09GKSkKCXJldHVybiBmYWxzZTsKCiAgICAgIGV4cHJf b2Zmc2V0MSArPSBNRU1fT0ZGU0VUICgqbWVtMSk7CiAgICAgIGV4cHJfb2Zmc2V0MiArPSBNRU1f T0ZGU0VUICgqbWVtMik7CgogICAgICBpZiAoa25vd25fZXEgKGV4cHJfb2Zmc2V0MSArIHNpemUx LCBleHByX29mZnNldDIpKQoJOwogICAgICBlbHNlIGlmIChrbm93bl9lcSAoZXhwcl9vZmZzZXQy ICsgc2l6ZTIsIGV4cHJfb2Zmc2V0MSkgJiYgcmV2ZXJzZWQpCgkqcmV2ZXJzZWQgPSB0cnVlOwog ICAgICBlbHNlCglyZXR1cm4gZmFsc2U7CgogICAgICBpZiAocmV2ZXJzZWQpCgl7CgkgIGlmIChi YXNlMikKCSAgICB7CgkgICAgICBydHggYWRkcjEgPSBwbHVzX2NvbnN0YW50IChQbW9kZSwgWEVY UCAoKm1lbTIsIDApLAoJCQkJCSBleHByX29mZnNldDEgLSBleHByX29mZnNldDIpOwoJICAgICAg Km1lbTEgPSByZXBsYWNlX2VxdWl2X2FkZHJlc3NfbnYgKCptZW0xLCBhZGRyMSk7CgkgICAgfQoJ ICBlbHNlCgkgICAgewoJICAgICAgcnR4IGFkZHIyID0gcGx1c19jb25zdGFudCAoUG1vZGUsIFhF WFAgKCptZW0xLCAwKSwKCQkJCQkgZXhwcl9vZmZzZXQyIC0gZXhwcl9vZmZzZXQxKTsKCSAgICAg ICptZW0yID0gcmVwbGFjZV9lcXVpdl9hZGRyZXNzX252ICgqbWVtMiwgYWRkcjIpOwoJICAgIH0K CX0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKLyogUmV0dXJu IHRydWUgaWYgTUVNMSBhbmQgTUVNMiBjYW4gYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBhY2Nl c3MKICAgb2YgbW9kZSBNT0RFLCB3aXRoIHRoZSBjb21iaW5lZCBhY2Nlc3MgaGF2aW5nIHRoZSBz YW1lIGFkZHJlc3MgYXMgTUVNMS4gICovCgpib29sCmFhcmNoNjRfbWVyZ2VhYmxlX2xvYWRfcGFp cl9wIChtYWNoaW5lX21vZGUgbW9kZSwgcnR4IG1lbTEsIHJ0eCBtZW0yKQp7CiAgaWYgKFNUUklD VF9BTElHTk1FTlQgJiYgTUVNX0FMSUdOIChtZW0xKSA8IEdFVF9NT0RFX0FMSUdOTUVOVCAobW9k ZSkpCiAgICByZXR1cm4gZmFsc2U7CiAgcmV0dXJuIGFhcmNoNjRfY2hlY2tfY29uc2VjdXRpdmVf bWVtcyAoJm1lbTEsICZtZW0yLCBudWxscHRyKTsKfQoKLyogR2l2ZW4gT1BFUkFORFMgb2YgY29u c2VjdXRpdmUgbG9hZC9zdG9yZSwgY2hlY2sgaWYgd2UgY2FuIG1lcmdlCiAgIHRoZW0gaW50byBs ZHAvc3RwLiAgTE9BRCBpcyB0cnVlIGlmIHRoZXkgYXJlIGxvYWQgaW5zdHJ1Y3Rpb25zLgogICBN T0RFIGlzIHRoZSBtb2RlIG9mIG1lbW9yeSBvcGVyYW5kcy4gICovCgpib29sCmFhcmNoNjRfb3Bl cmFuZHNfb2tfZm9yX2xkcHN0cCAocnR4ICpvcGVyYW5kcywgYm9vbCBsb2FkLAoJCQkJbWFjaGlu ZV9tb2RlIG1vZGUpCnsKICBlbnVtIHJlZ19jbGFzcyByY2xhc3NfMSwgcmNsYXNzXzI7CiAgcnR4 IG1lbV8xLCBtZW1fMiwgcmVnXzEsIHJlZ18yOwoKICAvKiBBbGxvdyB0aGUgdHVuaW5nIHN0cnVj dHVyZSB0byBkaXNhYmxlIExEUCBpbnN0cnVjdGlvbiBmb3JtYXRpb24KICAgICBmcm9tIGNvbWJp bmluZyBpbnN0cnVjdGlvbnMgKGUuZy4sIGluIHBlZXBob2xlMikuCiAgICAgVE9ETzogSW1wbGVt ZW50IGZpbmUtZ3JhaW5lZCB0dW5pbmcgY29udHJvbCBmb3IgTERQIGFuZCBTVFA6CgkgICAxLiBj b250cm9sIHBvbGljaWVzIGZvciBsb2FkIGFuZCBzdG9yZSBzZXBhcmF0ZWx5OwoJICAgMi4gc3Vw cG9ydCB0aGUgZm9sbG93aW5nIHBvbGljaWVzOgoJICAgICAgLSBkZWZhdWx0ICh1c2Ugd2hhdCBp cyBpbiB0aGUgdHVuaW5nIHN0cnVjdHVyZSkKCSAgICAgIC0gYWx3YXlzCgkgICAgICAtIG5ldmVy CgkgICAgICAtIGFsaWduZWQgKG9ubHkgaWYgdGhlIGNvbXBpbGVyIGNhbiBwcm92ZSB0aGF0IHRo ZQoJCWxvYWQgd2lsbCBiZSBhbGlnbmVkIHRvIDIgKiBlbGVtZW50X3NpemUpICAqLwogIGlmIChs b2FkICYmIChhYXJjaDY0X3R1bmVfcGFyYW1zLmV4dHJhX3R1bmluZ19mbGFncwoJICAgICAgICYg QUFSQ0g2NF9FWFRSQV9UVU5FX05PX0xEUF9DT01CSU5FKSkKICAgIHJldHVybiBmYWxzZTsKCiAg aWYgKGxvYWQpCiAgICB7CiAgICAgIG1lbV8xID0gb3BlcmFuZHNbMV07CiAgICAgIG1lbV8yID0g b3BlcmFuZHNbM107CiAgICAgIHJlZ18xID0gb3BlcmFuZHNbMF07CiAgICAgIHJlZ18yID0gb3Bl cmFuZHNbMl07CiAgICAgIGdjY19hc3NlcnQgKFJFR19QIChyZWdfMSkgJiYgUkVHX1AgKHJlZ18y KSk7CiAgICAgIGlmIChSRUdOTyAocmVnXzEpID09IFJFR05PIChyZWdfMikpCglyZXR1cm4gZmFs c2U7CiAgICAgIGlmIChyZWdfb3ZlcmxhcF9tZW50aW9uZWRfcCAocmVnXzEsIG1lbV8yKSkKCXJl dHVybiBmYWxzZTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIG1lbV8xID0gb3BlcmFuZHNbMF07 CiAgICAgIG1lbV8yID0gb3BlcmFuZHNbMl07CiAgICAgIHJlZ18xID0gb3BlcmFuZHNbMV07CiAg ICAgIHJlZ18yID0gb3BlcmFuZHNbM107CiAgICB9CgogIC8qIFRoZSBtZW1zIGNhbm5vdCBiZSB2 b2xhdGlsZS4gICovCiAgaWYgKE1FTV9WT0xBVElMRV9QIChtZW1fMSkgfHwgTUVNX1ZPTEFUSUxF X1AgKG1lbV8yKSkKICAgIHJldHVybiBmYWxzZTsKCiAgLyogSWYgd2UgaGF2ZSBTSW1vZGUgYW5k IHNsb3cgdW5hbGlnbmVkIGxkcCwKICAgICBjaGVjayB0aGUgYWxpZ25tZW50IHRvIGJlIGF0IGxl YXN0IDggYnl0ZS4gKi8KICBpZiAobW9kZSA9PSBTSW1vZGUKICAgICAgJiYgKGFhcmNoNjRfdHVu ZV9wYXJhbXMuZXh0cmFfdHVuaW5nX2ZsYWdzCiAgICAgICAgICAmIEFBUkNINjRfRVhUUkFfVFVO RV9TTE9XX1VOQUxJR05FRF9MRFBXKQogICAgICAmJiAhb3B0aW1pemVfc2l6ZQogICAgICAmJiBN RU1fQUxJR04gKG1lbV8xKSA8IDggKiBCSVRTX1BFUl9VTklUKQogICAgcmV0dXJuIGZhbHNlOwoK ICAvKiBDaGVjayBpZiB0aGUgYWRkcmVzc2VzIGFyZSBpbiB0aGUgZm9ybSBvZiBbYmFzZStvZmZz ZXRdLiAgKi8KICBib29sIHJldmVyc2VkID0gZmFsc2U7CiAgaWYgKCFhYXJjaDY0X2NoZWNrX2Nv bnNlY3V0aXZlX21lbXMgKCZtZW1fMSwgJm1lbV8yLCAmcmV2ZXJzZWQpKQogICAgcmV0dXJuIGZh bHNlOwoKICAvKiBUaGUgb3BlcmFuZHMgbXVzdCBiZSBvZiB0aGUgc2FtZSBzaXplLiAgKi8KICBn Y2NfYXNzZXJ0IChrbm93bl9lcSAoR0VUX01PREVfU0laRSAoR0VUX01PREUgKG1lbV8xKSksCgkJ CUdFVF9NT0RFX1NJWkUgKEdFVF9NT0RFIChtZW1fMikpKSk7CgogIC8qIE9uZSBvZiB0aGUgbWVt b3J5IGFjY2Vzc2VzIG11c3QgYmUgYSBtZW1wYWlyIG9wZXJhbmQuCiAgICAgSWYgaXQgaXMgbm90 IHRoZSBmaXJzdCBvbmUsIHRoZXkgbmVlZCB0byBiZSBzd2FwcGVkIGJ5IHRoZQogICAgIHBlZXBo b2xlLiAgKi8KICBpZiAoIWFhcmNoNjRfbWVtX3BhaXJfb3BlcmFuZCAobWVtXzEsIEdFVF9NT0RF IChtZW1fMSkpCiAgICAgICAmJiAhYWFyY2g2NF9tZW1fcGFpcl9vcGVyYW5kIChtZW1fMiwgR0VU X01PREUgKG1lbV8yKSkpCiAgICByZXR1cm4gZmFsc2U7CgogIGlmIChSRUdfUCAocmVnXzEpICYm IEZQX1JFR05VTV9QIChSRUdOTyAocmVnXzEpKSkKICAgIHJjbGFzc18xID0gRlBfUkVHUzsKICBl bHNlCiAgICByY2xhc3NfMSA9IEdFTkVSQUxfUkVHUzsKCiAgaWYgKFJFR19QIChyZWdfMikgJiYg RlBfUkVHTlVNX1AgKFJFR05PIChyZWdfMikpKQogICAgcmNsYXNzXzIgPSBGUF9SRUdTOwogIGVs c2UKICAgIHJjbGFzc18yID0gR0VORVJBTF9SRUdTOwoKICAvKiBDaGVjayBpZiB0aGUgcmVnaXN0 ZXJzIGFyZSBvZiBzYW1lIGNsYXNzLiAgKi8KICBpZiAocmNsYXNzXzEgIT0gcmNsYXNzXzIpCiAg ICByZXR1cm4gZmFsc2U7CgogIHJldHVybiB0cnVlOwp9CgovKiBHaXZlbiBPUEVSQU5EUyBvZiBj b25zZWN1dGl2ZSBsb2FkL3N0b3JlIHRoYXQgY2FuIGJlIG1lcmdlZCwKICAgc3dhcCB0aGVtIGlm IHRoZXkgYXJlIG5vdCBpbiBhc2NlbmRpbmcgb3JkZXIuICAqLwp2b2lkCmFhcmNoNjRfc3dhcF9s ZHJzdHJfb3BlcmFuZHMgKHJ0eCogb3BlcmFuZHMsIGJvb2wgbG9hZCkKewogIGludCBtZW1fb3Ag PSBsb2FkID8gMSA6IDA7CiAgYm9vbCByZXZlcnNlZCA9IGZhbHNlOwogIGlmICghYWFyY2g2NF9j aGVja19jb25zZWN1dGl2ZV9tZW1zIChvcGVyYW5kcyArIG1lbV9vcCwKCQkJCSAgICAgICBvcGVy YW5kcyArIG1lbV9vcCArIDIsICZyZXZlcnNlZCkpCiAgICBnY2NfdW5yZWFjaGFibGUgKCk7Cgog IGlmIChyZXZlcnNlZCkKICAgIHsKICAgICAgLyogSXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgdGhp cyBpcyBhIGxvYWQgb3IgYSBzdG9yZSwKCSB3ZSBkbyB0aGUgc2FtZSBzd2FwLiAgKi8KICAgICAg c3RkOjpzd2FwIChvcGVyYW5kc1swXSwgb3BlcmFuZHNbMl0pOwogICAgICBzdGQ6OnN3YXAgKG9w ZXJhbmRzWzFdLCBvcGVyYW5kc1szXSk7CiAgICB9Cn0KCi8qIFRha2luZyBYIGFuZCBZIHRvIGJl IEhPU1RfV0lERV9JTlQgcG9pbnRlcnMsIHJldHVybiB0aGUgcmVzdWx0IG9mIGEKICAgY29tcGFy aXNvbiBiZXR3ZWVuIHRoZSB0d28uICAqLwppbnQKYWFyY2g2NF9ob3N0X3dpZGVfaW50X2NvbXBh cmUgKGNvbnN0IHZvaWQgKngsIGNvbnN0IHZvaWQgKnkpCnsKICByZXR1cm4gd2k6OmNtcHMgKCog KChjb25zdCBIT1NUX1dJREVfSU5UICopIHgpLAoJCSAgICogKChjb25zdCBIT1NUX1dJREVfSU5U ICopIHkpKTsKfQoKLyogVGFraW5nIFggYW5kIFkgdG8gYmUgcGFpcnMgb2YgUlRYLCBvbmUgcG9p bnRpbmcgdG8gYSBNRU0gcnR4IGFuZCB0aGUKICAgb3RoZXIgcG9pbnRpbmcgdG8gYSBSRUcgcnR4 IGNvbnRhaW5pbmcgYW4gb2Zmc2V0LCBjb21wYXJlIHRoZSBvZmZzZXRzCiAgIG9mIHRoZSB0d28g cGFpcnMuCgogICBSZXR1cm46CgoJMSBpZmYgb2Zmc2V0IChYKSA+IG9mZnNldCAoWSkKCTAgaWZm IG9mZnNldCAoWCkgPT0gb2Zmc2V0IChZKQoJLTEgaWZmIG9mZnNldCAoWCkgPCBvZmZzZXQgKFkp ICAqLwppbnQKYWFyY2g2NF9sZHJzdHJfb2Zmc2V0X2NvbXBhcmUgKGNvbnN0IHZvaWQgKngsIGNv bnN0IHZvaWQgKnkpCnsKICBjb25zdCBydHggKiBvcGVyYW5kc18xID0gKGNvbnN0IHJ0eCAqKSB4 OwogIGNvbnN0IHJ0eCAqIG9wZXJhbmRzXzIgPSAoY29uc3QgcnR4ICopIHk7CiAgcnR4IG1lbV8x LCBtZW1fMiwgYmFzZSwgb2Zmc2V0XzEsIG9mZnNldF8yOwoKICBpZiAoTUVNX1AgKG9wZXJhbmRz XzFbMF0pKQogICAgbWVtXzEgPSBvcGVyYW5kc18xWzBdOwogIGVsc2UKICAgIG1lbV8xID0gb3Bl cmFuZHNfMVsxXTsKCiAgaWYgKE1FTV9QIChvcGVyYW5kc18yWzBdKSkKICAgIG1lbV8yID0gb3Bl cmFuZHNfMlswXTsKICBlbHNlCiAgICBtZW1fMiA9IG9wZXJhbmRzXzJbMV07CgogIC8qIEV4dHJh Y3QgdGhlIG9mZnNldHMuICAqLwogIGV4dHJhY3RfYmFzZV9vZmZzZXRfaW5fYWRkciAobWVtXzEs ICZiYXNlLCAmb2Zmc2V0XzEpOwogIGV4dHJhY3RfYmFzZV9vZmZzZXRfaW5fYWRkciAobWVtXzIs ICZiYXNlLCAmb2Zmc2V0XzIpOwoKICBnY2NfYXNzZXJ0IChvZmZzZXRfMSAhPSBOVUxMX1JUWCAm JiBvZmZzZXRfMiAhPSBOVUxMX1JUWCk7CgogIHJldHVybiB3aTo6Y21wcyAoSU5UVkFMIChvZmZz ZXRfMSksIElOVFZBTCAob2Zmc2V0XzIpKTsKfQoKLyogR2l2ZW4gT1BFUkFORFMgb2YgY29uc2Vj dXRpdmUgbG9hZC9zdG9yZSwgY2hlY2sgaWYgd2UgY2FuIG1lcmdlCiAgIHRoZW0gaW50byBsZHAv c3RwIGJ5IGFkanVzdGluZyB0aGUgb2Zmc2V0LiAgTE9BRCBpcyB0cnVlIGlmIHRoZXkKICAgYXJl IGxvYWQgaW5zdHJ1Y3Rpb25zLiAgTU9ERSBpcyB0aGUgbW9kZSBvZiBtZW1vcnkgb3BlcmFuZHMu CgogICBHaXZlbiBiZWxvdyBjb25zZWN1dGl2ZSBzdG9yZXM6CgogICAgIHN0ciAgdzEsIFt4Yiwg MHgxMDBdCiAgICAgc3RyICB3MSwgW3hiLCAweDEwNF0KICAgICBzdHIgIHcxLCBbeGIsIDB4MTA4 XQogICAgIHN0ciAgdzEsIFt4YiwgMHgxMGNdCgogICBUaG91Z2ggdGhlIG9mZnNldHMgYXJlIG91 dCBvZiB0aGUgcmFuZ2Ugc3VwcG9ydGVkIGJ5IHN0cCwgd2UgY2FuCiAgIHN0aWxsIHBhaXIgdGhl bSBhZnRlciBhZGp1c3RpbmcgdGhlIG9mZnNldCwgbGlrZToKCiAgICAgYWRkICBzY3JhdGNoLCB4 YiwgMHgxMDAKICAgICBzdHAgIHcxLCB3MSwgW3NjcmF0Y2hdCiAgICAgc3RwICB3MSwgdzEsIFtz Y3JhdGNoLCAweDhdCgogICBUaGUgcGVlcGhvbGUgcGF0dGVybnMgZGV0ZWN0aW5nIHRoaXMgb3Bw b3J0dW5pdHkgc2hvdWxkIGd1YXJhbnRlZQogICB0aGUgc2NyYXRjaCByZWdpc3RlciBpcyBhdmFs aWFibGUuICAqLwoKYm9vbAphYXJjaDY0X29wZXJhbmRzX2FkanVzdF9va19mb3JfbGRwc3RwIChy dHggKm9wZXJhbmRzLCBib29sIGxvYWQsCgkJCQkgICAgICAgbWFjaGluZV9tb2RlIG1vZGUpCnsK ICBjb25zdCBpbnQgbnVtX2luc25zID0gNDsKICBlbnVtIHJlZ19jbGFzcyByY2xhc3M7CiAgSE9T VF9XSURFX0lOVCBvZmZ2YWxzW251bV9pbnNuc10sIG1zaXplOwogIHJ0eCBtZW1bbnVtX2luc25z XSwgcmVnW251bV9pbnNuc10sIGJhc2VbbnVtX2luc25zXSwgb2Zmc2V0W251bV9pbnNuc107Cgog IGlmIChsb2FkKQogICAgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9pbnNuczsgaSsr KQoJewoJICByZWdbaV0gPSBvcGVyYW5kc1syICogaV07CgkgIG1lbVtpXSA9IG9wZXJhbmRzWzIg KiBpICsgMV07CgoJICBnY2NfYXNzZXJ0IChSRUdfUCAocmVnW2ldKSk7Cgl9CgogICAgICAvKiBE byBub3QgYXR0ZW1wdCB0byBtZXJnZSB0aGUgbG9hZHMgaWYgdGhlIGxvYWRzIGNsb2JiZXIgZWFj aCBvdGhlci4gICovCiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSArPSAyKQoJZm9yIChp bnQgaiA9IGkgKyAyOyBqIDwgODsgaiArPSAyKQoJICBpZiAocmVnX292ZXJsYXBfbWVudGlvbmVk X3AgKG9wZXJhbmRzW2ldLCBvcGVyYW5kc1tqXSkpCgkgICAgcmV0dXJuIGZhbHNlOwogICAgfQog IGVsc2UKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2luc25zOyBpKyspCiAgICAgIHsKCW1l bVtpXSA9IG9wZXJhbmRzWzIgKiBpXTsKCXJlZ1tpXSA9IG9wZXJhbmRzWzIgKiBpICsgMV07CiAg ICAgIH0KCiAgLyogU2tpcCBpZiBtZW1vcnkgb3BlcmFuZCBpcyBieSBpdHNlbGYgdmFsaWQgZm9y IGxkcC9zdHAuICAqLwogIGlmICghTUVNX1AgKG1lbVswXSkgfHwgYWFyY2g2NF9tZW1fcGFpcl9v cGVyYW5kIChtZW1bMF0sIG1vZGUpKQogICAgcmV0dXJuIGZhbHNlOwoKICBmb3IgKGludCBpID0g MDsgaSA8IG51bV9pbnNuczsgaSsrKQogICAgewogICAgICAvKiBUaGUgbWVtcyBjYW5ub3QgYmUg dm9sYXRpbGUuICAqLwogICAgICBpZiAoTUVNX1ZPTEFUSUxFX1AgKG1lbVtpXSkpCglyZXR1cm4g ZmFsc2U7CgogICAgICAvKiBDaGVjayBpZiB0aGUgYWRkcmVzc2VzIGFyZSBpbiB0aGUgZm9ybSBv ZiBbYmFzZStvZmZzZXRdLiAgKi8KICAgICAgZXh0cmFjdF9iYXNlX29mZnNldF9pbl9hZGRyICht ZW1baV0sIGJhc2UgKyBpLCBvZmZzZXQgKyBpKTsKICAgICAgaWYgKGJhc2VbaV0gPT0gTlVMTF9S VFggfHwgb2Zmc2V0W2ldID09IE5VTExfUlRYKQoJcmV0dXJuIGZhbHNlOwogICAgfQoKICAvKiBD aGVjayBpZiB0aGUgcmVnaXN0ZXJzIGFyZSBvZiBzYW1lIGNsYXNzLiAgKi8KICByY2xhc3MgPSBS RUdfUCAocmVnWzBdKSAmJiBGUF9SRUdOVU1fUCAoUkVHTk8gKHJlZ1swXSkpCiAgICA/IEZQX1JF R1MgOiBHRU5FUkFMX1JFR1M7CgogIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtX2luc25zOyBpKysp CiAgICBpZiAoUkVHX1AgKHJlZ1tpXSkgJiYgRlBfUkVHTlVNX1AgKFJFR05PIChyZWdbaV0pKSkK ICAgICAgewoJaWYgKHJjbGFzcyAhPSBGUF9SRUdTKQoJICByZXR1cm4gZmFsc2U7CiAgICAgIH0K ICAgIGVsc2UKICAgICAgewoJaWYgKHJjbGFzcyAhPSBHRU5FUkFMX1JFR1MpCgkgIHJldHVybiBm YWxzZTsKICAgICAgfQoKICAvKiBPbmx5IHRoZSBsYXN0IHJlZ2lzdGVyIGluIHRoZSBvcmRlciBp biB3aGljaCB0aGV5IG9jY3VyCiAgICAgbWF5IGJlIGNsb2JiZXJlZCBieSB0aGUgbG9hZC4gICov CiAgaWYgKHJjbGFzcyA9PSBHRU5FUkFMX1JFR1MgJiYgbG9hZCkKICAgIGZvciAoaW50IGkgPSAw OyBpIDwgbnVtX2luc25zIC0gMTsgaSsrKQogICAgICBpZiAocmVnX21lbnRpb25lZF9wIChyZWdb aV0sIG1lbVtpXSkpCglyZXR1cm4gZmFsc2U7CgogIC8qIENoZWNrIGlmIHRoZSBiYXNlcyBhcmUg c2FtZS4gICovCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1faW5zbnMgLSAxOyBpKyspCiAgICBp ZiAoIXJ0eF9lcXVhbF9wIChiYXNlW2ldLCBiYXNlW2kgKyAxXSkpCiAgICAgIHJldHVybiBmYWxz ZTsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1faW5zbnM7IGkrKykKICAgIG9mZnZhbHNbaV0g PSBJTlRWQUwgKG9mZnNldFtpXSk7CgogIG1zaXplID0gR0VUX01PREVfU0laRSAobW9kZSkudG9f Y29uc3RhbnQgKCk7CgogIC8qIENoZWNrIGlmIHRoZSBvZmZzZXRzIGNhbiBiZSBwdXQgaW4gdGhl IHJpZ2h0IG9yZGVyIHRvIGRvIGEgbGRwL3N0cC4gICovCiAgcXNvcnQgKG9mZnZhbHMsIG51bV9p bnNucywgc2l6ZW9mIChIT1NUX1dJREVfSU5UKSwKCSBhYXJjaDY0X2hvc3Rfd2lkZV9pbnRfY29t cGFyZSk7CgogIGlmICghKG9mZnZhbHNbMV0gPT0gb2ZmdmFsc1swXSArIG1zaXplCgkmJiBvZmZ2 YWxzWzNdID09IG9mZnZhbHNbMl0gKyBtc2l6ZSkpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIENo ZWNrIHRoYXQgb2Zmc2V0cyBhcmUgd2l0aGluIHJhbmdlIG9mIGVhY2ggb3RoZXIuICBUaGUgbGRw L3N0cAogICAgIGluc3RydWN0aW9ucyBoYXZlIDcgYml0IGltbWVkaWF0ZSBvZmZzZXRzLCBzbyB1 c2UgMHg4MC4gICovCiAgaWYgKG9mZnZhbHNbMl0gLSBvZmZ2YWxzWzBdID49IG1zaXplICogMHg4 MCkKICAgIHJldHVybiBmYWxzZTsKCiAgLyogVGhlIG9mZnNldHMgbXVzdCBiZSBhbGlnbmVkIHdp dGggcmVzcGVjdCB0byBlYWNoIG90aGVyLiAgKi8KICBpZiAob2ZmdmFsc1swXSAlIG1zaXplICE9 IG9mZnZhbHNbMl0gJSBtc2l6ZSkKICAgIHJldHVybiBmYWxzZTsKCiAgLyogSWYgd2UgaGF2ZSBT SW1vZGUgYW5kIHNsb3cgdW5hbGlnbmVkIGxkcCwKICAgICBjaGVjayB0aGUgYWxpZ25tZW50IHRv IGJlIGF0IGxlYXN0IDggYnl0ZS4gKi8KICBpZiAobW9kZSA9PSBTSW1vZGUKICAgICAgJiYgKGFh cmNoNjRfdHVuZV9wYXJhbXMuZXh0cmFfdHVuaW5nX2ZsYWdzCgkgICYgQUFSQ0g2NF9FWFRSQV9U VU5FX1NMT1dfVU5BTElHTkVEX0xEUFcpCiAgICAgICYmICFvcHRpbWl6ZV9zaXplCiAgICAgICYm IE1FTV9BTElHTiAobWVtWzBdKSA8IDggKiBCSVRTX1BFUl9VTklUKQogICAgcmV0dXJuIGZhbHNl OwoKICByZXR1cm4gdHJ1ZTsKfQoKLyogR2l2ZW4gT1BFUkFORFMgb2YgY29uc2VjdXRpdmUgbG9h ZC9zdG9yZSwgdGhpcyBmdW5jdGlvbiBwYWlycyB0aGVtCiAgIGludG8gTERQL1NUUCBhZnRlciBh ZGp1c3RpbmcgdGhlIG9mZnNldC4gIEl0IGRlcGVuZHMgb24gdGhlIGZhY3QKICAgdGhhdCB0aGUg b3BlcmFuZHMgY2FuIGJlIHNvcnRlZCBzbyB0aGUgb2Zmc2V0cyBhcmUgY29ycmVjdCBmb3IgU1RQ LgogICBNT0RFIGlzIHRoZSBtb2RlIG9mIG1lbW9yeSBvcGVyYW5kcy4gIENPREUgaXMgdGhlIHJ0 bCBvcGVyYXRvcgogICB3aGljaCBzaG91bGQgYmUgYXBwbGllZCB0byBhbGwgbWVtb3J5IG9wZXJh bmRzLCBpdCdzIFNJR05fRVhURU5ELAogICBaRVJPX0VYVEVORCBvciBVTktOT1dOLiAgKi8KCmJv b2wKYWFyY2g2NF9nZW5fYWRqdXN0ZWRfbGRwc3RwIChydHggKm9wZXJhbmRzLCBib29sIGxvYWQs CgkJCSAgICAgbWFjaGluZV9tb2RlIG1vZGUsIFJUWF9DT0RFIGNvZGUpCnsKICBydHggYmFzZSwg b2Zmc2V0XzEsIG9mZnNldF8zLCB0MSwgdDI7CiAgcnR4IG1lbV8xLCBtZW1fMiwgbWVtXzMsIG1l bV80OwogIHJ0eCB0ZW1wX29wZXJhbmRzWzhdOwogIEhPU1RfV0lERV9JTlQgb2ZmX3ZhbF8xLCBv ZmZfdmFsXzMsIGJhc2Vfb2ZmLCBuZXdfb2ZmXzEsIG5ld19vZmZfMywKCQlzdHBfb2ZmX3VwcGVy X2xpbWl0LCBzdHBfb2ZmX2xvd2VyX2xpbWl0LCBtc2l6ZTsKCiAgLyogV2UgbWFrZSBjaGFuZ2Vz IG9uIGEgY29weSBhcyB3ZSBtYXkgc3RpbGwgYmFpbCBvdXQuICAqLwogIGZvciAoaW50IGkgPSAw OyBpIDwgODsgaSArKykKICAgIHRlbXBfb3BlcmFuZHNbaV0gPSBvcGVyYW5kc1tpXTsKCiAgLyog U29ydCB0aGUgb3BlcmFuZHMuICBOb3RlIGZvciBjYXNlcyBhcyBiZWxvdzoKICAgICAgIFtiYXNl ICsgMHgzMTBdID0gQQogICAgICAgW2Jhc2UgKyAweDMyMF0gPSBCCiAgICAgICBbYmFzZSArIDB4 MzMwXSA9IEMKICAgICAgIFtiYXNlICsgMHgzMjBdID0gRAogICAgIFdlIG5lZWQgc3RhYmxlIHNv cnRpbmcgb3RoZXJ3aXNlIHdyb25nIGRhdGEgbWF5IGJlIHN0b3JlIHRvIG9mZnNldCAweDMyMC4K ICAgICBBbHNvIG5vdGUgdGhlIGRlYWQgc3RvcmUgaW4gYWJvdmUgY2FzZSBzaG91bGQgYmUgb3B0 aW1pemVkIGF3YXksIGJ1dCBubwogICAgIGd1YXJhbnRlZXMgaGVyZS4gICovCiAgZ2NjX3N0YWJs ZXNvcnQodGVtcF9vcGVyYW5kcywgNCwgMiAqIHNpemVvZiAocnR4ICopLAoJCSBhYXJjaDY0X2xk cnN0cl9vZmZzZXRfY29tcGFyZSk7CgogIC8qIENvcHkgdGhlIG1lbW9yeSBvcGVyYW5kcyBzbyB0 aGF0IGlmIHdlIGhhdmUgdG8gYmFpbCBmb3Igc29tZQogICAgIHJlYXNvbiB0aGUgb3JpZ2luYWwg YWRkcmVzc2VzIGFyZSB1bmNoYW5nZWQuICAqLwogIGlmIChsb2FkKQogICAgewogICAgICBtZW1f MSA9IGNvcHlfcnR4ICh0ZW1wX29wZXJhbmRzWzFdKTsKICAgICAgbWVtXzIgPSBjb3B5X3J0eCAo dGVtcF9vcGVyYW5kc1szXSk7CiAgICAgIG1lbV8zID0gY29weV9ydHggKHRlbXBfb3BlcmFuZHNb NV0pOwogICAgICBtZW1fNCA9IGNvcHlfcnR4ICh0ZW1wX29wZXJhbmRzWzddKTsKICAgIH0KICBl bHNlCiAgICB7CiAgICAgIG1lbV8xID0gY29weV9ydHggKHRlbXBfb3BlcmFuZHNbMF0pOwogICAg ICBtZW1fMiA9IGNvcHlfcnR4ICh0ZW1wX29wZXJhbmRzWzJdKTsKICAgICAgbWVtXzMgPSBjb3B5 X3J0eCAodGVtcF9vcGVyYW5kc1s0XSk7CiAgICAgIG1lbV80ID0gY29weV9ydHggKHRlbXBfb3Bl cmFuZHNbNl0pOwogICAgICBnY2NfYXNzZXJ0IChjb2RlID09IFVOS05PV04pOwogICAgfQoKICBl eHRyYWN0X2Jhc2Vfb2Zmc2V0X2luX2FkZHIgKG1lbV8xLCAmYmFzZSwgJm9mZnNldF8xKTsKICBl eHRyYWN0X2Jhc2Vfb2Zmc2V0X2luX2FkZHIgKG1lbV8zLCAmYmFzZSwgJm9mZnNldF8zKTsKICBn Y2NfYXNzZXJ0IChiYXNlICE9IE5VTExfUlRYICYmIG9mZnNldF8xICE9IE5VTExfUlRYCgkgICAg ICAmJiBvZmZzZXRfMyAhPSBOVUxMX1JUWCk7CgogIC8qIEFkanVzdCBvZmZzZXQgc28gaXQgY2Fu IGZpdCBpbiBMRFAvU1RQIGluc3RydWN0aW9uLiAgKi8KICBtc2l6ZSA9IEdFVF9NT0RFX1NJWkUg KG1vZGUpLnRvX2NvbnN0YW50KCk7CiAgc3RwX29mZl91cHBlcl9saW1pdCA9IG1zaXplICogKDB4 NDAgLSAxKTsKICBzdHBfb2ZmX2xvd2VyX2xpbWl0ID0gLSBtc2l6ZSAqIDB4NDA7CgogIG9mZl92 YWxfMSA9IElOVFZBTCAob2Zmc2V0XzEpOwogIG9mZl92YWxfMyA9IElOVFZBTCAob2Zmc2V0XzMp OwoKICAvKiBUaGUgYmFzZSBvZmZzZXQgaXMgb3B0aW1hbGx5IGhhbGYgd2F5IGJldHdlZW4gdGhl IHR3byBTVFAvTERQIG9mZnNldHMuICAqLwogIGlmIChtc2l6ZSA8PSA0KQogICAgYmFzZV9vZmYg PSAob2ZmX3ZhbF8xICsgb2ZmX3ZhbF8zKSAvIDI7CiAgZWxzZQogICAgLyogSG93ZXZlciwgZHVl IHRvIGlzc3VlcyB3aXRoIG5lZ2F0aXZlIExEUC9TVFAgb2Zmc2V0IGdlbmVyYXRpb24gZm9yCiAg ICAgICBsYXJnZXIgbW9kZXMsIGZvciBERiwgREQsIERJIGFuZCB2ZWN0b3IgbW9kZXMuIHdlIG11 c3Qgbm90IHVzZSBuZWdhdGl2ZQogICAgICAgYWRkcmVzc2VzIHNtYWxsZXIgdGhhbiA5IHNpZ25l ZCB1bmFkanVzdGVkIGJpdHMgY2FuIHN0b3JlLiAgVGhpcwogICAgICAgcHJvdmlkZXMgdGhlIG1v c3QgcmFuZ2UgaW4gdGhpcyBjYXNlLiAgKi8KICAgIGJhc2Vfb2ZmID0gb2ZmX3ZhbF8xOwoKICAv KiBBZGp1c3QgdGhlIGJhc2Ugc28gdGhhdCBpdCBpcyBhbGlnbmVkIHdpdGggdGhlIGFkZHJlc3Nl cyBidXQgc3RpbGwKICAgICBvcHRpbWFsLiAgKi8KICBpZiAoYmFzZV9vZmYgJSBtc2l6ZSAhPSBv ZmZfdmFsXzEgJSBtc2l6ZSkKICAgIC8qIEZpeCB0aGUgb2Zmc2V0LCBiZWFyaW5nIGluIG1pbmQg d2Ugd2FudCB0byBtYWtlIGl0IGJpZ2dlciBub3QKICAgICAgIHNtYWxsZXIuICAqLwogICAgYmFz ZV9vZmYgKz0gKCgoYmFzZV9vZmYgJSBtc2l6ZSkgLSAob2ZmX3ZhbF8xICUgbXNpemUpKSArIG1z aXplKSAlIG1zaXplOwogIGVsc2UgaWYgKG1zaXplIDw9IDQpCiAgICAvKiBUaGUgbmVnYXRpdmUg cmFuZ2Ugb2YgTERQL1NUUCBpcyBvbmUgbGFyZ2VyIHRoYW4gdGhlIHBvc2l0aXZlIHJhbmdlLiAg Ki8KICAgIGJhc2Vfb2ZmICs9IG1zaXplOwoKICAvKiBDaGVjayBpZiBiYXNlIG9mZnNldCBpcyB0 b28gYmlnIG9yIHRvbyBzbWFsbC4gIFdlIGNhbiBhdHRlbXB0IHRvIHJlc29sdmUKICAgICB0aGlz IGlzc3VlIGJ5IHNldHRpbmcgaXQgdG8gdGhlIG1heGltdW0gdmFsdWUgYW5kIHNlZWluZyBpZiB0 aGUgb2Zmc2V0cwogICAgIHN0aWxsIGZpdC4gICovCiAgaWYgKGJhc2Vfb2ZmID49IDB4MTAwMCkK ICAgIHsKICAgICAgYmFzZV9vZmYgPSAweDEwMDAgLSAxOwogICAgICAvKiBXZSBtdXN0IHN0aWxs IG1ha2Ugc3VyZSB0aGF0IHRoZSBiYXNlIG9mZnNldCBpcyBhbGlnbmVkIHdpdGggcmVzcGVjdAoJ IHRvIHRoZSBhZGRyZXNzLiAgQnV0IGl0IG1heSBub3QgYmUgbWFkZSBhbnkgYmlnZ2VyLiAgKi8K ICAgICAgYmFzZV9vZmYgLT0gKCgoYmFzZV9vZmYgJSBtc2l6ZSkgLSAob2ZmX3ZhbF8xICUgbXNp emUpKSArIG1zaXplKSAlIG1zaXplOwogICAgfQoKICAvKiBMaWtld2lzZSBmb3IgdGhlIGNhc2Ug d2hlcmUgdGhlIGJhc2UgaXMgdG9vIHNtYWxsLiAgKi8KICBpZiAoYmFzZV9vZmYgPD0gLTB4MTAw MCkKICAgIHsKICAgICAgYmFzZV9vZmYgPSAtMHgxMDAwICsgMTsKICAgICAgYmFzZV9vZmYgKz0g KCgoYmFzZV9vZmYgJSBtc2l6ZSkgLSAob2ZmX3ZhbF8xICUgbXNpemUpKSArIG1zaXplKSAlIG1z aXplOwogICAgfQoKICAvKiBPZmZzZXQgb2YgdGhlIGZpcnN0IFNUUC9MRFAuICAqLwogIG5ld19v ZmZfMSA9IG9mZl92YWxfMSAtIGJhc2Vfb2ZmOwoKICAvKiBPZmZzZXQgb2YgdGhlIHNlY29uZCBT VFAvTERQLiAgKi8KICBuZXdfb2ZmXzMgPSBvZmZfdmFsXzMgLSBiYXNlX29mZjsKCiAgLyogVGhl IG9mZnNldHMgbXVzdCBiZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBMRFAvU1RQIGluc3RydWN0 aW9ucy4gICovCiAgaWYgKG5ld19vZmZfMSA+IHN0cF9vZmZfdXBwZXJfbGltaXQgfHwgbmV3X29m Zl8xIDwgc3RwX29mZl9sb3dlcl9saW1pdAogICAgICB8fCBuZXdfb2ZmXzMgPiBzdHBfb2ZmX3Vw cGVyX2xpbWl0IHx8IG5ld19vZmZfMyA8IHN0cF9vZmZfbG93ZXJfbGltaXQpCiAgICByZXR1cm4g ZmFsc2U7CgogIHJlcGxhY2VfZXF1aXZfYWRkcmVzc19udiAobWVtXzEsIHBsdXNfY29uc3RhbnQg KFBtb2RlLCBvcGVyYW5kc1s4XSwKCQkJCQkJICBuZXdfb2ZmXzEpLCB0cnVlKTsKICByZXBsYWNl X2VxdWl2X2FkZHJlc3NfbnYgKG1lbV8yLCBwbHVzX2NvbnN0YW50IChQbW9kZSwgb3BlcmFuZHNb OF0sCgkJCQkJCSAgbmV3X29mZl8xICsgbXNpemUpLCB0cnVlKTsKICByZXBsYWNlX2VxdWl2X2Fk ZHJlc3NfbnYgKG1lbV8zLCBwbHVzX2NvbnN0YW50IChQbW9kZSwgb3BlcmFuZHNbOF0sCgkJCQkJ CSAgbmV3X29mZl8zKSwgdHJ1ZSk7CiAgcmVwbGFjZV9lcXVpdl9hZGRyZXNzX252IChtZW1fNCwg cGx1c19jb25zdGFudCAoUG1vZGUsIG9wZXJhbmRzWzhdLAoJCQkJCQkgIG5ld19vZmZfMyArIG1z aXplKSwgdHJ1ZSk7CgogIGlmICghYWFyY2g2NF9tZW1fcGFpcl9vcGVyYW5kIChtZW1fMSwgbW9k ZSkKICAgICAgfHwgIWFhcmNoNjRfbWVtX3BhaXJfb3BlcmFuZCAobWVtXzMsIG1vZGUpKQogICAg cmV0dXJuIGZhbHNlOwoKICBpZiAoY29kZSA9PSBaRVJPX0VYVEVORCkKICAgIHsKICAgICAgbWVt XzEgPSBnZW5fcnR4X1pFUk9fRVhURU5EIChESW1vZGUsIG1lbV8xKTsKICAgICAgbWVtXzIgPSBn ZW5fcnR4X1pFUk9fRVhURU5EIChESW1vZGUsIG1lbV8yKTsKICAgICAgbWVtXzMgPSBnZW5fcnR4 X1pFUk9fRVhURU5EIChESW1vZGUsIG1lbV8zKTsKICAgICAgbWVtXzQgPSBnZW5fcnR4X1pFUk9f RVhURU5EIChESW1vZGUsIG1lbV80KTsKICAgIH0KICBlbHNlIGlmIChjb2RlID09IFNJR05fRVhU RU5EKQogICAgewogICAgICBtZW1fMSA9IGdlbl9ydHhfU0lHTl9FWFRFTkQgKERJbW9kZSwgbWVt XzEpOwogICAgICBtZW1fMiA9IGdlbl9ydHhfU0lHTl9FWFRFTkQgKERJbW9kZSwgbWVtXzIpOwog ICAgICBtZW1fMyA9IGdlbl9ydHhfU0lHTl9FWFRFTkQgKERJbW9kZSwgbWVtXzMpOwogICAgICBt ZW1fNCA9IGdlbl9ydHhfU0lHTl9FWFRFTkQgKERJbW9kZSwgbWVtXzQpOwogICAgfQoKICBpZiAo bG9hZCkKICAgIHsKICAgICAgb3BlcmFuZHNbMF0gPSB0ZW1wX29wZXJhbmRzWzBdOwogICAgICBv cGVyYW5kc1sxXSA9IG1lbV8xOwogICAgICBvcGVyYW5kc1syXSA9IHRlbXBfb3BlcmFuZHNbMl07 CiAgICAgIG9wZXJhbmRzWzNdID0gbWVtXzI7CiAgICAgIG9wZXJhbmRzWzRdID0gdGVtcF9vcGVy YW5kc1s0XTsKICAgICAgb3BlcmFuZHNbNV0gPSBtZW1fMzsKICAgICAgb3BlcmFuZHNbNl0gPSB0 ZW1wX29wZXJhbmRzWzZdOwogICAgICBvcGVyYW5kc1s3XSA9IG1lbV80OwogICAgfQogIGVsc2UK ICAgIHsKICAgICAgb3BlcmFuZHNbMF0gPSBtZW1fMTsKICAgICAgb3BlcmFuZHNbMV0gPSB0ZW1w X29wZXJhbmRzWzFdOwogICAgICBvcGVyYW5kc1syXSA9IG1lbV8yOwogICAgICBvcGVyYW5kc1sz XSA9IHRlbXBfb3BlcmFuZHNbM107CiAgICAgIG9wZXJhbmRzWzRdID0gbWVtXzM7CiAgICAgIG9w ZXJhbmRzWzVdID0gdGVtcF9vcGVyYW5kc1s1XTsKICAgICAgb3BlcmFuZHNbNl0gPSBtZW1fNDsK ICAgICAgb3BlcmFuZHNbN10gPSB0ZW1wX29wZXJhbmRzWzddOwogICAgfQoKICAvKiBFbWl0IGFk anVzdGluZyBpbnN0cnVjdGlvbi4gICovCiAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAob3BlcmFu ZHNbOF0sIHBsdXNfY29uc3RhbnQgKERJbW9kZSwgYmFzZSwgYmFzZV9vZmYpKSk7CiAgLyogRW1p dCBsZHAvc3RwIGluc3RydWN0aW9ucy4gICovCiAgdDEgPSBnZW5fcnR4X1NFVCAob3BlcmFuZHNb MF0sIG9wZXJhbmRzWzFdKTsKICB0MiA9IGdlbl9ydHhfU0VUIChvcGVyYW5kc1syXSwgb3BlcmFu ZHNbM10pOwogIGVtaXRfaW5zbiAoZ2VuX3J0eF9QQVJBTExFTCAoVk9JRG1vZGUsIGdlbl9ydHZl YyAoMiwgdDEsIHQyKSkpOwogIHQxID0gZ2VuX3J0eF9TRVQgKG9wZXJhbmRzWzRdLCBvcGVyYW5k c1s1XSk7CiAgdDIgPSBnZW5fcnR4X1NFVCAob3BlcmFuZHNbNl0sIG9wZXJhbmRzWzddKTsKICBl bWl0X2luc24gKGdlbl9ydHhfUEFSQUxMRUwgKFZPSURtb2RlLCBnZW5fcnR2ZWMgKDIsIHQxLCB0 MikpKTsKICByZXR1cm4gdHJ1ZTsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9WRUNUT1JJWkVfRU1Q VFlfTUFTS19JU19FWFBFTlNJVkUuICBBc3N1bWUgZm9yIG5vdyB0aGF0CiAgIGl0IGlzbid0IHdv cnRoIGJyYW5jaGluZyBhcm91bmQgZW1wdHkgbWFza2VkIG9wcyAoaW5jbHVkaW5nIG1hc2tlZAog ICBzdG9yZXMpLiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfZW1wdHlfbWFza19pc19leHBlbnNp dmUgKHVuc2lnbmVkKQp7CiAgcmV0dXJuIGZhbHNlOwp9CgovKiBSZXR1cm4gMSBpZiBwc2V1ZG8g cmVnaXN0ZXIgc2hvdWxkIGJlIGNyZWF0ZWQgYW5kIHVzZWQgdG8gaG9sZAogICBHT1QgYWRkcmVz cyBmb3IgUElDIGNvZGUuICAqLwoKYm9vbAphYXJjaDY0X3VzZV9wc2V1ZG9fcGljX3JlZyAodm9p ZCkKewogIHJldHVybiBhYXJjaDY0X2Ntb2RlbCA9PSBBQVJDSDY0X0NNT0RFTF9TTUFMTF9TUElD Owp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX1VOU1BFQ19NQVlfVFJBUF9QLiAgKi8KCnN0YXRpYyBp bnQKYWFyY2g2NF91bnNwZWNfbWF5X3RyYXBfcCAoY29uc3RfcnR4IHgsIHVuc2lnbmVkIGZsYWdz KQp7CiAgc3dpdGNoIChYSU5UICh4LCAxKSkKICAgIHsKICAgIGNhc2UgVU5TUEVDX0dPVFNNQUxM UElDOgogICAgY2FzZSBVTlNQRUNfR09UU01BTExQSUMyOEs6CiAgICBjYXNlIFVOU1BFQ19HT1RU SU5ZUElDOgogICAgICByZXR1cm4gMDsKICAgIGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogICAgfQoK ICByZXR1cm4gZGVmYXVsdF91bnNwZWNfbWF5X3RyYXBfcCAoeCwgZmxhZ3MpOwp9CgoKLyogSWYg WCBpcyBhIHBvc2l0aXZlIENPTlNUX0RPVUJMRSB3aXRoIGEgdmFsdWUgdGhhdCBpcyBhIHBvd2Vy IG9mIDIKICAgcmV0dXJuIHRoZSBsb2cyIG9mIHRoYXQgdmFsdWUuICBPdGhlcndpc2UgcmV0dXJu IC0xLiAgKi8KCmludAphYXJjaDY0X2ZwY29uc3RfcG93X29mXzIgKHJ0eCB4KQp7CiAgY29uc3Qg UkVBTF9WQUxVRV9UWVBFICpyOwoKICBpZiAoIUNPTlNUX0RPVUJMRV9QICh4KSkKICAgIHJldHVy biAtMTsKCiAgciA9IENPTlNUX0RPVUJMRV9SRUFMX1ZBTFVFICh4KTsKCiAgaWYgKFJFQUxfVkFM VUVfTkVHQVRJVkUgKCpyKQogICAgICB8fCBSRUFMX1ZBTFVFX0lTTkFOICgqcikKICAgICAgfHwg UkVBTF9WQUxVRV9JU0lORiAoKnIpCiAgICAgIHx8ICFyZWFsX2lzaW50ZWdlciAociwgREZtb2Rl KSkKICAgIHJldHVybiAtMTsKCiAgcmV0dXJuIGV4YWN0X2xvZzIgKHJlYWxfdG9faW50ZWdlciAo cikpOwp9CgovKiBJZiBYIGlzIGEgcG9zaXRpdmUgQ09OU1RfRE9VQkxFIHdpdGggYSB2YWx1ZSB0 aGF0IGlzIHRoZSByZWNpcHJvY2FsIG9mIGEKICAgcG93ZXIgb2YgMiAoaS5lIDEvMl5uKSByZXR1 cm4gdGhlIG51bWJlciBvZiBmbG9hdCBiaXRzLiBlLmcuIGZvciB4PT0oMS8yXm4pCiAgIHJldHVy biBuLiBPdGhlcndpc2UgcmV0dXJuIC0xLiAgKi8KCmludAphYXJjaDY0X2ZwY29uc3RfcG93Ml9y ZWNpcCAocnR4IHgpCnsKICBSRUFMX1ZBTFVFX1RZUEUgcjA7CgogIGlmICghQ09OU1RfRE9VQkxF X1AgKHgpKQogICAgcmV0dXJuIC0xOwoKICByMCA9ICpDT05TVF9ET1VCTEVfUkVBTF9WQUxVRSAo eCk7CiAgaWYgKGV4YWN0X3JlYWxfaW52ZXJzZSAoREZtb2RlLCAmcjApCiAgICAgICYmICFSRUFM X1ZBTFVFX05FR0FUSVZFIChyMCkpCiAgICB7CglpbnQgcmV0ID0gZXhhY3RfbG9nMiAocmVhbF90 b19pbnRlZ2VyICgmcjApKTsKCWlmIChyZXQgPj0gMSAmJiByZXQgPD0gMzIpCgkgICAgcmV0dXJu IHJldDsKICAgIH0KICByZXR1cm4gLTE7Cn0KCi8qIElmIFggaXMgYSB2ZWN0b3Igb2YgZXF1YWwg Q09OU1RfRE9VQkxFIHZhbHVlcyBhbmQgdGhhdCB2YWx1ZSBpcwogICBZLCByZXR1cm4gdGhlIGFh cmNoNjRfZnBjb25zdF9wb3dfb2ZfMiBvZiBZLiAgT3RoZXJ3aXNlIHJldHVybiAtMS4gICovCgpp bnQKYWFyY2g2NF92ZWNfZnBjb25zdF9wb3dfb2ZfMiAocnR4IHgpCnsKICBpbnQgbmVsdHM7CiAg aWYgKCFDT05TVF9WRUNUT1JfUCAoeCkKICAgICAgfHwgIUNPTlNUX1ZFQ1RPUl9OVU5JVFMgKHgp LmlzX2NvbnN0YW50ICgmbmVsdHMpKQogICAgcmV0dXJuIC0xOwoKICBpZiAoR0VUX01PREVfQ0xB U1MgKEdFVF9NT0RFICh4KSkgIT0gTU9ERV9WRUNUT1JfRkxPQVQpCiAgICByZXR1cm4gLTE7Cgog IGludCBmaXJzdHZhbCA9IGFhcmNoNjRfZnBjb25zdF9wb3dfb2ZfMiAoQ09OU1RfVkVDVE9SX0VM VCAoeCwgMCkpOwogIGlmIChmaXJzdHZhbCA8PSAwKQogICAgcmV0dXJuIC0xOwoKICBmb3IgKGlu dCBpID0gMTsgaSA8IG5lbHRzOyBpKyspCiAgICBpZiAoYWFyY2g2NF9mcGNvbnN0X3Bvd19vZl8y IChDT05TVF9WRUNUT1JfRUxUICh4LCBpKSkgIT0gZmlyc3R2YWwpCiAgICAgIHJldHVybiAtMTsK CiAgcmV0dXJuIGZpcnN0dmFsOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX1BST01PVEVEX1RZUEUg dG8gcHJvbW90ZSAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZXMKICAgdG8gZmxvYXQuCgogICBf X2ZwMTYgYWx3YXlzIHByb21vdGVzIHRocm91Z2ggdGhpcyBob29rLgogICBfRmxvYXQxNiBtYXkg cHJvbW90ZSBpZiBUQVJHRVRfRkxUX0VWQUxfTUVUSE9EIGlzIDE2LCBidXQgd2UgZG8gdGhhdAog ICB0aHJvdWdoIHRoZSBnZW5lcmljIGV4Y2VzcyBwcmVjaXNpb24gbG9naWMgcmF0aGVyIHRoYW4g aGVyZS4gICovCgpzdGF0aWMgdHJlZQphYXJjaDY0X3Byb21vdGVkX3R5cGUgKGNvbnN0X3RyZWUg dCkKewogIGlmIChTQ0FMQVJfRkxPQVRfVFlQRV9QICh0KQogICAgICAmJiBUWVBFX01BSU5fVkFS SUFOVCAodCkgPT0gYWFyY2g2NF9mcDE2X3R5cGVfbm9kZSkKICAgIHJldHVybiBmbG9hdF90eXBl X25vZGU7CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEltcGxlbWVudCB0aGUgVEFSR0VUX09Q VEFCX1NVUFBPUlRFRF9QIGhvb2suICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF9vcHRhYl9zdXBw b3J0ZWRfcCAoaW50IG9wLCBtYWNoaW5lX21vZGUgbW9kZTEsIG1hY2hpbmVfbW9kZSwKCQkJICAg b3B0aW1pemF0aW9uX3R5cGUgb3B0X3R5cGUpCnsKICBzd2l0Y2ggKG9wKQogICAgewogICAgY2Fz ZSByc3FydF9vcHRhYjoKICAgICAgcmV0dXJuIG9wdF90eXBlID09IE9QVElNSVpFX0ZPUl9TUEVF RCAmJiB1c2VfcnNxcnRfcCAobW9kZTEpOwoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB0cnVl OwogICAgfQp9CgovKiBJbXBsZW1lbnQgdGhlIFRBUkdFVF9EV0FSRl9QT0xZX0lOREVURVJNSU5B VEVfVkFMVUUgaG9vay4gICovCgpzdGF0aWMgdW5zaWduZWQgaW50CmFhcmNoNjRfZHdhcmZfcG9s eV9pbmRldGVybWluYXRlX3ZhbHVlICh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50ICpmYWN0 b3IsCgkJCQkJaW50ICpvZmZzZXQpCnsKICAvKiBQb2x5bm9taWFsIGludmFyaWFudCAxID09IChW RyAvIDIpIC0gMS4gICovCiAgZ2NjX2Fzc2VydCAoaSA9PSAxKTsKICAqZmFjdG9yID0gMjsKICAq b2Zmc2V0ID0gMTsKICByZXR1cm4gQUFSQ0g2NF9EV0FSRl9WRzsKfQoKLyogSW1wbGVtZW50IFRB UkdFVF9MSUJHQ0NfRkxPQVRJTkdfUE9JTlRfTU9ERV9TVVBQT1JURURfUCAtIHJldHVybiBUUlVF CiAgIGlmIE1PREUgaXMgW0JIXUZtb2RlLCBhbmQgcHVudCB0byB0aGUgZ2VuZXJpYyBpbXBsZW1l bnRhdGlvbiBvdGhlcndpc2UuICAqLwoKc3RhdGljIGJvb2wKYWFyY2g2NF9saWJnY2NfZmxvYXRp bmdfbW9kZV9zdXBwb3J0ZWRfcCAoc2NhbGFyX2Zsb2F0X21vZGUgbW9kZSkKewogIHJldHVybiAo KG1vZGUgPT0gSEZtb2RlIHx8IG1vZGUgPT0gQkZtb2RlKQoJICA/IHRydWUKCSAgOiBkZWZhdWx0 X2xpYmdjY19mbG9hdGluZ19tb2RlX3N1cHBvcnRlZF9wIChtb2RlKSk7Cn0KCi8qIEltcGxlbWVu dCBUQVJHRVRfU0NBTEFSX01PREVfU1VQUE9SVEVEX1AgLSByZXR1cm4gVFJVRQogICBpZiBNT0RF IGlzIFtCSF1GbW9kZSwgYW5kIHB1bnQgdG8gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb3Ro ZXJ3aXNlLiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRfc2NhbGFyX21vZGVfc3VwcG9ydGVkX3Ag KHNjYWxhcl9tb2RlIG1vZGUpCnsKICBpZiAoREVDSU1BTF9GTE9BVF9NT0RFX1AgKG1vZGUpKQog ICAgcmV0dXJuIGRlZmF1bHRfZGVjaW1hbF9mbG9hdF9zdXBwb3J0ZWRfcCAoKTsKCiAgcmV0dXJu ICgobW9kZSA9PSBIRm1vZGUgfHwgbW9kZSA9PSBCRm1vZGUpCgkgID8gdHJ1ZQoJICA6IGRlZmF1 bHRfc2NhbGFyX21vZGVfc3VwcG9ydGVkX3AgKG1vZGUpKTsKfQoKLyogU2V0IHRoZSB2YWx1ZSBv ZiBGTFRfRVZBTF9NRVRIT0QuCiAgIElTTy9JRUMgVFMgMTg2NjEtMyBkZWZpbmVzIHR3byB2YWx1 ZXMgdGhhdCB3ZSdkIGxpa2UgdG8gbWFrZSB1c2Ugb2Y6CgogICAgMDogZXZhbHVhdGUgYWxsIG9w ZXJhdGlvbnMgYW5kIGNvbnN0YW50cywgd2hvc2Ugc2VtYW50aWMgdHlwZSBoYXMgYXQKICAgICAg IG1vc3QgdGhlIHJhbmdlIGFuZCBwcmVjaXNpb24gb2YgdHlwZSBmbG9hdCwgdG8gdGhlIHJhbmdl IGFuZAogICAgICAgcHJlY2lzaW9uIG9mIGZsb2F0OyBldmFsdWF0ZSBhbGwgb3RoZXIgb3BlcmF0 aW9ucyBhbmQgY29uc3RhbnRzIHRvCiAgICAgICB0aGUgcmFuZ2UgYW5kIHByZWNpc2lvbiBvZiB0 aGUgc2VtYW50aWMgdHlwZTsKCiAgICBOLCB3aGVyZSBfRmxvYXROIGlzIGEgc3VwcG9ydGVkIGlu dGVyY2hhbmdlIGZsb2F0aW5nIHR5cGUKICAgICAgIGV2YWx1YXRlIGFsbCBvcGVyYXRpb25zIGFu ZCBjb25zdGFudHMsIHdob3NlIHNlbWFudGljIHR5cGUgaGFzIGF0CiAgICAgICBtb3N0IHRoZSBy YW5nZSBhbmQgcHJlY2lzaW9uIG9mIF9GbG9hdE4gdHlwZSwgdG8gdGhlIHJhbmdlIGFuZAogICAg ICAgcHJlY2lzaW9uIG9mIHRoZSBfRmxvYXROIHR5cGU7IGV2YWx1YXRlIGFsbCBvdGhlciBvcGVy YXRpb25zIGFuZAogICAgICAgY29uc3RhbnRzIHRvIHRoZSByYW5nZSBhbmQgcHJlY2lzaW9uIG9m IHRoZSBzZW1hbnRpYyB0eXBlOwoKICAgSWYgd2UgaGF2ZSB0aGUgQVJNdjguMi1BIGV4dGVuc2lv bnMgdGhlbiB3ZSBzdXBwb3J0IF9GbG9hdDE2IGluIG5hdGl2ZQogICBwcmVjaXNpb24sIHNvIHdl IHNob3VsZCBzZXQgdGhpcyB0byAxNi4gIE90aGVyd2lzZSwgd2Ugc3VwcG9ydCB0aGUgdHlwZSwK ICAgYnV0IHdhbnQgdG8gZXZhbHVhdGUgZXhwcmVzc2lvbnMgaW4gZmxvYXQgcHJlY2lzaW9uLCBz byBzZXQgdGhpcyB0bwogICAwLiAgKi8KCnN0YXRpYyBlbnVtIGZsdF9ldmFsX21ldGhvZAphYXJj aDY0X2V4Y2Vzc19wcmVjaXNpb24gKGVudW0gZXhjZXNzX3ByZWNpc2lvbl90eXBlIHR5cGUpCnsK ICBzd2l0Y2ggKHR5cGUpCiAgICB7CiAgICAgIGNhc2UgRVhDRVNTX1BSRUNJU0lPTl9UWVBFX0ZB U1Q6CiAgICAgIGNhc2UgRVhDRVNTX1BSRUNJU0lPTl9UWVBFX1NUQU5EQVJEOgoJLyogV2UgY2Fu IGNhbGN1bGF0ZSBlaXRoZXIgaW4gMTYtYml0IHJhbmdlIGFuZCBwcmVjaXNpb24gb3IKCSAgIDMy LWJpdCByYW5nZSBhbmQgcHJlY2lzaW9uLiAgTWFrZSB0aGF0IGRlY2lzaW9uIGJhc2VkIG9uIHdo ZXRoZXIKCSAgIHdlIGhhdmUgbmF0aXZlIHN1cHBvcnQgZm9yIHRoZSBBUk12OC4yLUEgMTYtYml0 IGZsb2F0aW5nLXBvaW50CgkgICBpbnN0cnVjdGlvbnMgb3Igbm90LiAgKi8KCXJldHVybiAoVEFS R0VUX0ZQX0YxNklOU1QKCQk/IEZMVF9FVkFMX01FVEhPRF9QUk9NT1RFX1RPX0ZMT0FUMTYKCQk6 IEZMVF9FVkFMX01FVEhPRF9QUk9NT1RFX1RPX0ZMT0FUKTsKICAgICAgY2FzZSBFWENFU1NfUFJF Q0lTSU9OX1RZUEVfSU1QTElDSVQ6CiAgICAgIGNhc2UgRVhDRVNTX1BSRUNJU0lPTl9UWVBFX0ZM T0FUMTY6CglyZXR1cm4gRkxUX0VWQUxfTUVUSE9EX1BST01PVEVfVE9fRkxPQVQxNjsKICAgICAg ZGVmYXVsdDoKCWdjY191bnJlYWNoYWJsZSAoKTsKICAgIH0KICByZXR1cm4gRkxUX0VWQUxfTUVU SE9EX1VOUFJFRElDVEFCTEU7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRfU0NIRURfQ0FOX1NQRUNV TEFURV9JTlNOLiAgUmV0dXJuIHRydWUgaWYgSU5TTiBjYW4gYmUKICAgc2NoZWR1bGVkIGZvciBz cGVjdWxhdGl2ZSBleGVjdXRpb24uICBSZWplY3QgdGhlIGxvbmctcnVubmluZyBkaXZpc2lvbgog ICBhbmQgc3F1YXJlLXJvb3QgaW5zdHJ1Y3Rpb25zLiAgKi8KCnN0YXRpYyBib29sCmFhcmNoNjRf c2NoZWRfY2FuX3NwZWN1bGF0ZV9pbnNuIChydHhfaW5zbiAqaW5zbikKewogIHN3aXRjaCAoZ2V0 X2F0dHJfdHlwZSAoaW5zbikpCiAgICB7CiAgICAgIGNhc2UgVFlQRV9TRElWOgogICAgICBjYXNl IFRZUEVfVURJVjoKICAgICAgY2FzZSBUWVBFX0ZESVZTOgogICAgICBjYXNlIFRZUEVfRkRJVkQ6 CiAgICAgIGNhc2UgVFlQRV9GU1FSVFM6CiAgICAgIGNhc2UgVFlQRV9GU1FSVEQ6CiAgICAgIGNh c2UgVFlQRV9ORU9OX0ZQX1NRUlRfUzoKICAgICAgY2FzZSBUWVBFX05FT05fRlBfU1FSVF9EOgog ICAgICBjYXNlIFRZUEVfTkVPTl9GUF9TUVJUX1NfUToKICAgICAgY2FzZSBUWVBFX05FT05fRlBf U1FSVF9EX1E6CiAgICAgIGNhc2UgVFlQRV9ORU9OX0ZQX0RJVl9TOgogICAgICBjYXNlIFRZUEVf TkVPTl9GUF9ESVZfRDoKICAgICAgY2FzZSBUWVBFX05FT05fRlBfRElWX1NfUToKICAgICAgY2Fz ZSBUWVBFX05FT05fRlBfRElWX0RfUToKCXJldHVybiBmYWxzZTsKICAgICAgZGVmYXVsdDoKCXJl dHVybiB0cnVlOwogICAgfQp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX0NPTVBVVEVfUFJFU1NVUkVf Q0xBU1NFUy4gICovCgpzdGF0aWMgaW50CmFhcmNoNjRfY29tcHV0ZV9wcmVzc3VyZV9jbGFzc2Vz IChyZWdfY2xhc3MgKmNsYXNzZXMpCnsKICBpbnQgaSA9IDA7CiAgY2xhc3Nlc1tpKytdID0gR0VO RVJBTF9SRUdTOwogIGNsYXNzZXNbaSsrXSA9IEZQX1JFR1M7CiAgLyogUFJfUkVHUyBpc24ndCBh IHVzZWZ1bCBwcmVzc3VyZSBjbGFzcyBiZWNhdXNlIG1hbnkgcHJlZGljYXRlIHBzZXVkbwogICAg IHJlZ2lzdGVycyBuZWVkIHRvIGdvIGluIFBSX0xPX1JFR1MgYXQgc29tZSBwb2ludCBkdXJpbmcg dGhlaXIKICAgICBsaWZldGltZS4gIFNwbGl0dGluZyBpdCBpbnRvIHR3byBoYWx2ZXMgaGFzIHRo ZSBlZmZlY3Qgb2YgbWFraW5nCiAgICAgYWxsIHByZWRpY2F0ZXMgY291bnQgYWdhaW5zdCBQUl9M T19SRUdTLCBzbyB0aGF0IHdlIHRyeSB3aGVuZXZlcgogICAgIHBvc3NpYmxlIHRvIHJlc3RyaWN0 IHRoZSBudW1iZXIgb2YgbGl2ZSBwcmVkaWNhdGVzIHRvIDguICBUaGlzCiAgICAgZ3JlYXRseSBy ZWR1Y2VzIHRoZSBhbW91bnQgb2Ygc3BpbGxpbmcgaW4gY2VydGFpbiBsb29wcy4gICovCiAgY2xh c3Nlc1tpKytdID0gUFJfTE9fUkVHUzsKICBjbGFzc2VzW2krK10gPSBQUl9ISV9SRUdTOwogIHJl dHVybiBpOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX0NBTl9DSEFOR0VfTU9ERV9DTEFTUy4gICov CgpzdGF0aWMgYm9vbAphYXJjaDY0X2Nhbl9jaGFuZ2VfbW9kZV9jbGFzcyAobWFjaGluZV9tb2Rl IGZyb20sCgkJCSAgICAgICBtYWNoaW5lX21vZGUgdG8sIHJlZ19jbGFzc190KQp7CiAgdW5zaWdu ZWQgaW50IGZyb21fZmxhZ3MgPSBhYXJjaDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlIChmcm9tKTsK ICB1bnNpZ25lZCBpbnQgdG9fZmxhZ3MgPSBhYXJjaDY0X2NsYXNzaWZ5X3ZlY3Rvcl9tb2RlICh0 byk7CgogIGJvb2wgZnJvbV9zdmVfcCA9IChmcm9tX2ZsYWdzICYgVkVDX0FOWV9TVkUpOwogIGJv b2wgdG9fc3ZlX3AgPSAodG9fZmxhZ3MgJiBWRUNfQU5ZX1NWRSk7CgogIGJvb2wgZnJvbV9wYXJ0 aWFsX3N2ZV9wID0gZnJvbV9zdmVfcCAmJiAoZnJvbV9mbGFncyAmIFZFQ19QQVJUSUFMKTsKICBi b29sIHRvX3BhcnRpYWxfc3ZlX3AgPSB0b19zdmVfcCAmJiAodG9fZmxhZ3MgJiBWRUNfUEFSVElB TCk7CgogIGJvb2wgZnJvbV9wcmVkX3AgPSAoZnJvbV9mbGFncyAmIFZFQ19TVkVfUFJFRCk7CiAg Ym9vbCB0b19wcmVkX3AgPSAodG9fZmxhZ3MgJiBWRUNfU1ZFX1BSRUQpOwoKICBib29sIHRvX3Bh cnRpYWxfYWR2c2ltZF9zdHJ1Y3RfcCA9ICh0b19mbGFncyA9PSAoVkVDX0FEVlNJTUQgfCBWRUNf U1RSVUNUCgkJCQkJCSAgIHwgVkVDX1BBUlRJQUwpKTsKICBib29sIGZyb21fcGFydGlhbF9hZHZz aW1kX3N0cnVjdF9wID0gKGZyb21fZmxhZ3MgPT0gKFZFQ19BRFZTSU1EIHwgVkVDX1NUUlVDVAoJ CQkJCQkgICB8IFZFQ19QQVJUSUFMKSk7CgogIC8qIERvbid0IGFsbG93IGNoYW5nZXMgYmV0d2Vl biBwcmVkaWNhdGUgbW9kZXMgYW5kIG90aGVyIG1vZGVzLgogICAgIE9ubHkgcHJlZGljYXRlIHJl Z2lzdGVycyBjYW4gaG9sZCBwcmVkaWNhdGUgbW9kZXMgYW5kIG9ubHkKICAgICBub24tcHJlZGlj YXRlIHJlZ2lzdGVycyBjYW4gaG9sZCBub24tcHJlZGljYXRlIG1vZGVzLCBzbyBhbnkKICAgICBh dHRlbXB0IHRvIG1peCB0aGVtIHdvdWxkIHJlcXVpcmUgYSByb3VuZCB0cmlwIHRocm91Z2ggbWVt b3J5LiAgKi8KICBpZiAoZnJvbV9wcmVkX3AgIT0gdG9fcHJlZF9wKQogICAgcmV0dXJuIGZhbHNl OwoKICAvKiBEb24ndCBhbGxvdyBjaGFuZ2VzIGJldHdlZW4gcGFydGlhbCBTVkUgbW9kZXMgYW5k IG90aGVyIG1vZGVzLgogICAgIFRoZSBjb250ZW50cyBvZiBwYXJ0aWFsIFNWRSBtb2RlcyBhcmUg ZGlzdHJpYnV0ZWQgZXZlbmx5IGFjcm9zcwogICAgIHRoZSByZWdpc3Rlciwgd2hlcmVhcyBHQ0Mg ZXhwZWN0cyB0aGVtIHRvIGJlIGNsdXN0ZXJlZCB0b2dldGhlci4gICovCiAgaWYgKGZyb21fcGFy dGlhbF9zdmVfcCAhPSB0b19wYXJ0aWFsX3N2ZV9wKQogICAgcmV0dXJuIGZhbHNlOwoKICAvKiBT aW1pbGFybHkgcmVqZWN0IGNoYW5nZXMgYmV0d2VlbiBwYXJ0aWFsIFNWRSBtb2RlcyB0aGF0IGhh dmUKICAgICBkaWZmZXJlbnQgcGF0dGVybnMgb2Ygc2lnbmlmaWNhbnQgYW5kIGluc2lnbmlmaWNh bnQgYml0cy4gICovCiAgaWYgKGZyb21fcGFydGlhbF9zdmVfcAogICAgICAmJiAoYWFyY2g2NF9z dmVfY29udGFpbmVyX2JpdHMgKGZyb20pICE9IGFhcmNoNjRfc3ZlX2NvbnRhaW5lcl9iaXRzICh0 bykKCSAgfHwgR0VUX01PREVfVU5JVF9TSVpFIChmcm9tKSAhPSBHRVRfTU9ERV9VTklUX1NJWkUg KHRvKSkpCiAgICByZXR1cm4gZmFsc2U7CgogIC8qIERvbid0IGFsbG93IGNoYW5nZXMgYmV0d2Vl biBwYXJ0aWFsIGFuZCBvdGhlciByZWdpc3RlcnMgb25seSBpZgogICAgIG9uZSBpcyBhIG5vcm1h bCBTSU1EIHJlZ2lzdGVyLCBhbGxvdyBvbmx5IGlmIG5vdCBsYXJnZXIgdGhhbiA2NC1iaXQuICAq LwogIGlmICgodG9fcGFydGlhbF9hZHZzaW1kX3N0cnVjdF9wIF4gZnJvbV9wYXJ0aWFsX2FkdnNp bWRfc3RydWN0X3ApCiAgICAgICYmIChrbm93bl9ndCAoR0VUX01PREVfU0laRSAodG8pLCA4KSB8 fCBrbm93bl9ndCAoR0VUX01PREVfU0laRSAodG8pLCA4KSkpCiAgICByZXR1cm4gZmFsc2U7Cgog IGlmIChtYXliZV9uZSAoQklUU19QRVJfU1ZFX1ZFQ1RPUiwgMTI4dSkpCiAgICB7CiAgICAgIC8q IERvbid0IGFsbG93IGNoYW5nZXMgYmV0d2VlbiBTVkUgbW9kZXMgYW5kIG90aGVyIG1vZGVzIHRo YXQgbWlnaHQKCSBiZSBiaWdnZXIgdGhhbiAxMjggYml0cy4gIEluIHBhcnRpY3VsYXIsIE9JbW9k ZSwgQ0ltb2RlIGFuZCBYSW1vZGUKCSBkaXZpZGUgaW50byAxMjgtYml0IHF1YW50aXRpZXMgd2hp bGUgU1ZFIG1vZGVzIGRpdmlkZSBpbnRvCgkgQklUU19QRVJfU1ZFX1ZFQ1RPUiBxdWFudGl0aWVz LiAgKi8KICAgICAgaWYgKGZyb21fc3ZlX3AgJiYgIXRvX3N2ZV9wICYmIG1heWJlX2d0IChHRVRf TU9ERV9CSVRTSVpFICh0byksIDEyOCkpCglyZXR1cm4gZmFsc2U7CiAgICAgIGlmICh0b19zdmVf cCAmJiAhZnJvbV9zdmVfcCAmJiBtYXliZV9ndCAoR0VUX01PREVfQklUU0laRSAoZnJvbSksIDEy OCkpCglyZXR1cm4gZmFsc2U7CiAgICB9CgogIGlmIChCWVRFU19CSUdfRU5ESUFOKQogICAgewog ICAgICAvKiBEb24ndCBhbGxvdyBjaGFuZ2VzIGJldHdlZW4gU1ZFIGRhdGEgbW9kZXMgYW5kIG5v bi1TVkUgbW9kZXMuCgkgU2VlIHRoZSBjb21tZW50IGF0IHRoZSBoZWFkIG9mIGFhcmNoNjQtc3Zl Lm1kIGZvciBkZXRhaWxzLiAgKi8KICAgICAgaWYgKGZyb21fc3ZlX3AgIT0gdG9fc3ZlX3ApCgly ZXR1cm4gZmFsc2U7CgogICAgICAvKiBEb24ndCBhbGxvdyBjaGFuZ2VzIGluIGVsZW1lbnQgc2l6 ZTogbGFuZSAwIG9mIHRoZSBuZXcgdmVjdG9yCgkgd291bGQgbm90IHRoZW4gYmUgbGFuZSAwIG9m IHRoZSBvbGQgdmVjdG9yLiAgU2VlIHRoZSBjb21tZW50CgkgYWJvdmUgYWFyY2g2NF9tYXliZV9l eHBhbmRfc3ZlX3N1YnJlZ19tb3ZlIGZvciBhIG1vcmUgZGV0YWlsZWQKCSBkZXNjcmlwdGlvbi4K CgkgSW4gdGhlIHdvcnN0IGNhc2UsIHRoaXMgZm9yY2VzIGEgcmVnaXN0ZXIgdG8gYmUgc3BpbGxl ZCBpbgoJIG9uZSBtb2RlIGFuZCByZWxvYWRlZCBpbiB0aGUgb3RoZXIsIHdoaWNoIGhhbmRsZXMg dGhlCgkgZW5kaWFubmVzcyBjb3JyZWN0bHkuICAqLwogICAgICBpZiAoZnJvbV9zdmVfcCAmJiBH RVRfTU9ERV9VTklUX1NJWkUgKGZyb20pICE9IEdFVF9NT0RFX1VOSVRfU0laRSAodG8pKQoJcmV0 dXJuIGZhbHNlOwogICAgfQogIHJldHVybiB0cnVlOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX0VB UkxZX1JFTUFUX01PREVTLiAgKi8KCnN0YXRpYyB2b2lkCmFhcmNoNjRfc2VsZWN0X2Vhcmx5X3Jl bWF0X21vZGVzIChzYml0bWFwIG1vZGVzKQp7CiAgLyogU1ZFIHZhbHVlcyBhcmUgbm90IG5vcm1h bGx5IGxpdmUgYWNyb3NzIGEgY2FsbCwgc28gaXQgc2hvdWxkIGJlCiAgICAgd29ydGggZG9pbmcg ZWFybHkgcmVtYXRlcmlhbGl6YXRpb24gZXZlbiBpbiBWTC1zcGVjaWZpYyBtb2RlLiAgKi8KICBm b3IgKGludCBpID0gMDsgaSA8IE5VTV9NQUNISU5FX01PREVTOyArK2kpCiAgICBpZiAoYWFyY2g2 NF9zdmVfbW9kZV9wICgobWFjaGluZV9tb2RlKSBpKSkKICAgICAgYml0bWFwX3NldF9iaXQgKG1v ZGVzLCBpKTsKfQoKLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGFyZ2V0IHNwZWN1bGF0aW9uX3Nh ZmVfdmFsdWUuICAqLwpzdGF0aWMgcnR4CmFhcmNoNjRfc3BlY3VsYXRpb25fc2FmZV92YWx1ZSAo bWFjaGluZV9tb2RlIG1vZGUsCgkJCQlydHggcmVzdWx0LCBydHggdmFsLCBydHggZmFpbHZhbCkK ewogIC8qIE1heWJlIHdlIHNob3VsZCB3YXJuIGlmIGZhbGxpbmcgYmFjayB0byBoYXJkIGJhcnJp ZXJzLiAgVGhleSBhcmUKICAgICBsaWtlbHkgdG8gYmUgbm90aWNhYmx5IG1vcmUgZXhwZW5zaXZl IHRoYW4gdGhlIGFsdGVybmF0aXZlIGJlbG93LiAgKi8KICBpZiAoIWFhcmNoNjRfdHJhY2tfc3Bl Y3VsYXRpb24pCiAgICByZXR1cm4gZGVmYXVsdF9zcGVjdWxhdGlvbl9zYWZlX3ZhbHVlIChtb2Rl LCByZXN1bHQsIHZhbCwgZmFpbHZhbCk7CgogIGlmICghUkVHX1AgKHZhbCkpCiAgICB2YWwgPSBj b3B5X3RvX21vZGVfcmVnIChtb2RlLCB2YWwpOwoKICBpZiAoIWFhcmNoNjRfcmVnX29yX3plcm8g KGZhaWx2YWwsIG1vZGUpKQogICAgZmFpbHZhbCA9IGNvcHlfdG9fbW9kZV9yZWcgKG1vZGUsIGZh aWx2YWwpOwoKICBlbWl0X2luc24gKGdlbl9kZXNwZWN1bGF0ZV9jb3B5IChtb2RlLCByZXN1bHQs IHZhbCwgZmFpbHZhbCkpOwogIHJldHVybiByZXN1bHQ7Cn0KCi8qIEltcGxlbWVudCBUQVJHRVRf RVNUSU1BVEVEX1BPTFlfVkFMVUUuCiAgIExvb2sgaW50byB0aGUgdHVuaW5nIHN0cnVjdHVyZSBm b3IgYW4gZXN0aW1hdGUuCiAgIEtJTkQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHJlcXVlc3RlZCBl c3RpbWF0ZTogbWluLCBtYXggb3IgbGlrZWx5LgogICBGb3IgY29yZXMgd2l0aCBhIGtub3duIFNW RSB3aWR0aCBhbGwgdGhyZWUgZXN0aW1hdGVzIGFyZSB0aGUgc2FtZS4KICAgRm9yIGdlbmVyaWMg U1ZFIHR1bmluZyB3ZSB3YW50IHRvIGRpc3Rpbmd1aXNoIHRoZSBtYXhpbXVtIGVzdGltYXRlIGZy b20KICAgdGhlIG1pbmltdW0gYW5kIGxpa2VseSBvbmVzLgogICBUaGUgbGlrZWx5IGVzdGltYXRl IGlzIHRoZSBzYW1lIGFzIHRoZSBtaW5pbXVtIGluIHRoYXQgY2FzZSB0byBnaXZlIGEKICAgY29u c2VydmF0aXZlIGJlaGF2aW9yIG9mIGF1dG8tdmVjdG9yaXppbmcgd2l0aCBTVkUgd2hlbiBpdCBp cyBhIHdpbgogICBldmVuIGZvciAxMjgtYml0IFNWRS4KICAgV2hlbiBTVkUgd2lkdGggaW5mb3Jt YXRpb24gaXMgYXZhaWxhYmxlIFZBTC5jb2VmZnNbMV0gaXMgbXVsdGlwbGllZCBieQogICB0aGUg bnVtYmVyIG9mIFZRIGNodW5rcyBvdmVyIHRoZSBpbml0aWFsIEFkdmFuY2VkIFNJTUQgMTI4IGJp dHMuICAqLwoKc3RhdGljIEhPU1RfV0lERV9JTlQKYWFyY2g2NF9lc3RpbWF0ZWRfcG9seV92YWx1 ZSAocG9seV9pbnQ2NCB2YWwsCgkJCSAgICAgIHBvbHlfdmFsdWVfZXN0aW1hdGVfa2luZCBraW5k CgkJCQk9IFBPTFlfVkFMVUVfTElLRUxZKQp7CiAgdW5zaWduZWQgaW50IHdpZHRoX3NvdXJjZSA9 IGFhcmNoNjRfdHVuZV9wYXJhbXMuc3ZlX3dpZHRoOwoKICAvKiBJZiB0aGVyZSBpcyBubyBjb3Jl LXNwZWNpZmljIGluZm9ybWF0aW9uIHRoZW4gdGhlIG1pbmltdW0gYW5kIGxpa2VseQogICAgIHZh bHVlcyBhcmUgYmFzZWQgb24gMTI4LWJpdCB2ZWN0b3JzIGFuZCB0aGUgbWF4aW11bSBpcyBiYXNl ZCBvbgogICAgIHRoZSBhcmNoaXRlY3R1cmFsIG1heGltdW0gb2YgMjA0OCBiaXRzLiAgKi8KICBp ZiAod2lkdGhfc291cmNlID09IFNWRV9TQ0FMQUJMRSkKICAgIHN3aXRjaCAoa2luZCkKICAgICAg ewogICAgICBjYXNlIFBPTFlfVkFMVUVfTUlOOgogICAgICBjYXNlIFBPTFlfVkFMVUVfTElLRUxZ OgoJcmV0dXJuIHZhbC5jb2VmZnNbMF07CiAgICAgIGNhc2UgUE9MWV9WQUxVRV9NQVg6CgkgIHJl dHVybiB2YWwuY29lZmZzWzBdICsgdmFsLmNvZWZmc1sxXSAqIDE1OwogICAgICB9CgogIC8qIEFs bG93IHN2ZV93aWR0aCB0byBiZSBhIGJpdG1hc2sgb2YgZGlmZmVyZW50IFZMLCB0cmVhdGluZyB0 aGUgbG93ZXN0CiAgICAgYXMgbGlrZWx5LiAgVGhpcyBjb3VsZCBiZSBtYWRlIG1vcmUgZ2VuZXJh bCBpZiBmdXR1cmUgLW10dW5lIG9wdGlvbnMKICAgICBuZWVkIGl0IHRvIGJlLiAgKi8KICBpZiAo a2luZCA9PSBQT0xZX1ZBTFVFX01BWCkKICAgIHdpZHRoX3NvdXJjZSA9IDEgPDwgZmxvb3JfbG9n MiAod2lkdGhfc291cmNlKTsKICBlbHNlCiAgICB3aWR0aF9zb3VyY2UgPSBsZWFzdF9iaXRfaHdp ICh3aWR0aF9zb3VyY2UpOwoKICAvKiBJZiB0aGUgY29yZSBwcm92aWRlcyB3aWR0aCBpbmZvcm1h dGlvbiwgdXNlIHRoYXQuICAqLwogIEhPU1RfV0lERV9JTlQgb3Zlcl8xMjggPSB3aWR0aF9zb3Vy Y2UgLSAxMjg7CiAgcmV0dXJuIHZhbC5jb2VmZnNbMF0gKyB2YWwuY29lZmZzWzFdICogb3Zlcl8x MjggLyAxMjg7Cn0KCgovKiBSZXR1cm4gdHJ1ZSBmb3IgdHlwZXMgdGhhdCBjb3VsZCBiZSBzdXBw b3J0ZWQgYXMgU0lNRCByZXR1cm4gb3IKICAgYXJndW1lbnQgdHlwZXMuICAqLwoKc3RhdGljIGJv b2wKc3VwcG9ydGVkX3NpbWRfdHlwZSAodHJlZSB0KQp7CiAgaWYgKFNDQUxBUl9GTE9BVF9UWVBF X1AgKHQpIHx8IElOVEVHUkFMX1RZUEVfUCAodCkgfHwgUE9JTlRFUl9UWVBFX1AgKHQpKQogICAg ewogICAgICBIT1NUX1dJREVfSU5UIHMgPSB0cmVlX3RvX3Nod2kgKFRZUEVfU0laRV9VTklUICh0 KSk7CiAgICAgIHJldHVybiBzID09IDEgfHwgcyA9PSAyIHx8IHMgPT0gNCB8fCBzID09IDg7CiAg ICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovKiBSZXR1cm4gdHJ1ZSBmb3IgdHlwZXMgdGhhdCBjdXJy ZW50bHkgYXJlIHN1cHBvcnRlZCBhcyBTSU1EIHJldHVybgogICBvciBhcmd1bWVudCB0eXBlcy4g ICovCgpzdGF0aWMgYm9vbApjdXJyZW50bHlfc3VwcG9ydGVkX3NpbWRfdHlwZSAodHJlZSB0LCB0 cmVlIGIpCnsKICBpZiAoQ09NUExFWF9GTE9BVF9UWVBFX1AgKHQpKQogICAgcmV0dXJuIGZhbHNl OwoKICBpZiAoVFlQRV9TSVpFICh0KSAhPSBUWVBFX1NJWkUgKGIpKQogICAgcmV0dXJuIGZhbHNl OwoKICByZXR1cm4gc3VwcG9ydGVkX3NpbWRfdHlwZSAodCk7Cn0KCi8qIEltcGxlbWVudCBUQVJH RVRfU0lNRF9DTE9ORV9DT01QVVRFX1ZFQ1NJWkVfQU5EX1NJTURMRU4uICAqLwoKc3RhdGljIGlu dAphYXJjaDY0X3NpbWRfY2xvbmVfY29tcHV0ZV92ZWNzaXplX2FuZF9zaW1kbGVuIChzdHJ1Y3Qg Y2dyYXBoX25vZGUgKm5vZGUsCgkJCQkJc3RydWN0IGNncmFwaF9zaW1kX2Nsb25lICpjbG9uZWks CgkJCQkJdHJlZSBiYXNlX3R5cGUsIGludCBudW0sCgkJCQkJYm9vbCBleHBsaWNpdF9wKQp7CiAg dHJlZSB0LCByZXRfdHlwZTsKICB1bnNpZ25lZCBpbnQgZWx0X2JpdHMsIGNvdW50OwogIHVuc2ln bmVkIEhPU1RfV0lERV9JTlQgY29uc3Rfc2ltZGxlbjsKICBwb2x5X3VpbnQ2NCB2ZWNfYml0czsK CiAgaWYgKCFUQVJHRVRfU0lNRCkKICAgIHJldHVybiAwOwoKICAvKiBGb3Igbm93LCBTVkUgc2lt ZGNsb25lcyB3b24ndCBwcm9kdWNlIGlsbGVnYWwgc2ltZGxlbiwgU28gb25seSBjaGVjawogICAg IGNvbnN0IHNpbWRsZW5zIGhlcmUuICAqLwogIGlmIChtYXliZV9uZSAoY2xvbmVpLT5zaW1kbGVu LCAwVSkKICAgICAgJiYgY2xvbmVpLT5zaW1kbGVuLmlzX2NvbnN0YW50ICgmY29uc3Rfc2ltZGxl bikKICAgICAgJiYgKGNvbnN0X3NpbWRsZW4gPCAyCgkgIHx8IGNvbnN0X3NpbWRsZW4gPiAxMDI0 CgkgIHx8IChjb25zdF9zaW1kbGVuICYgKGNvbnN0X3NpbWRsZW4gLSAxKSkgIT0gMCkpCiAgICB7 CiAgICAgIGlmIChleHBsaWNpdF9wKQoJd2FybmluZ19hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04g KG5vZGUtPmRlY2wpLCAwLAoJCSAgICAidW5zdXBwb3J0ZWQgc2ltZGxlbiAld2QiLCBjb25zdF9z aW1kbGVuKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogIHJldF90eXBlID0gVFJFRV9UWVBFIChU UkVFX1RZUEUgKG5vZGUtPmRlY2wpKTsKICBpZiAoVFJFRV9DT0RFIChyZXRfdHlwZSkgIT0gVk9J RF9UWVBFCiAgICAgICYmICFjdXJyZW50bHlfc3VwcG9ydGVkX3NpbWRfdHlwZSAocmV0X3R5cGUs IGJhc2VfdHlwZSkpCiAgICB7CiAgICAgIGlmICghZXhwbGljaXRfcCkKCTsKICAgICAgZWxzZSBp ZiAoVFlQRV9TSVpFIChyZXRfdHlwZSkgIT0gVFlQRV9TSVpFIChiYXNlX3R5cGUpKQoJd2Fybmlu Z19hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKG5vZGUtPmRlY2wpLCAwLAoJCSAgICAiR0NDIGRv ZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IG1peGVkIHNpemUgdHlwZXMgIgoJCSAgICAiZm9yICU8 c2ltZCU+IGZ1bmN0aW9ucyIpOwogICAgICBlbHNlIGlmIChzdXBwb3J0ZWRfc2ltZF90eXBlIChy ZXRfdHlwZSkpCgl3YXJuaW5nX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVjbCks IDAsCgkJICAgICJHQ0MgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgcmV0dXJuIHR5cGUgJXFU ICIKCQkgICAgImZvciAlPHNpbWQlPiBmdW5jdGlvbnMiLCByZXRfdHlwZSk7CiAgICAgIGVsc2UK CXdhcm5pbmdfYXQgKERFQ0xfU09VUkNFX0xPQ0FUSU9OIChub2RlLT5kZWNsKSwgMCwKCQkgICAg InVuc3VwcG9ydGVkIHJldHVybiB0eXBlICVxVCBmb3IgJTxzaW1kJT4gZnVuY3Rpb25zIiwKCQkg ICAgcmV0X3R5cGUpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgaW50IGk7CiAgdHJlZSB0eXBl X2FyZ190eXBlcyA9IFRZUEVfQVJHX1RZUEVTIChUUkVFX1RZUEUgKG5vZGUtPmRlY2wpKTsKICBi b29sIGRlY2xfYXJnX3AgPSAobm9kZS0+ZGVmaW5pdGlvbiB8fCB0eXBlX2FyZ190eXBlcyA9PSBO VUxMX1RSRUUpOwoKICBmb3IgKHQgPSAoZGVjbF9hcmdfcCA/IERFQ0xfQVJHVU1FTlRTIChub2Rl LT5kZWNsKSA6IHR5cGVfYXJnX3R5cGVzKSwgaSA9IDA7CiAgICAgICB0ICYmIHQgIT0gdm9pZF9s aXN0X25vZGU7IHQgPSBUUkVFX0NIQUlOICh0KSwgaSsrKQogICAgewogICAgICB0cmVlIGFyZ190 eXBlID0gZGVjbF9hcmdfcCA/IFRSRUVfVFlQRSAodCkgOiBUUkVFX1ZBTFVFICh0KTsKCiAgICAg IGlmIChjbG9uZWktPmFyZ3NbaV0uYXJnX3R5cGUgIT0gU0lNRF9DTE9ORV9BUkdfVFlQRV9VTklG T1JNCgkgICYmICFjdXJyZW50bHlfc3VwcG9ydGVkX3NpbWRfdHlwZSAoYXJnX3R5cGUsIGJhc2Vf dHlwZSkpCgl7CgkgIGlmICghZXhwbGljaXRfcCkKCSAgICA7CgkgIGVsc2UgaWYgKFRZUEVfU0la RSAoYXJnX3R5cGUpICE9IFRZUEVfU0laRSAoYmFzZV90eXBlKSkKCSAgICB3YXJuaW5nX2F0IChE RUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVjbCksIDAsCgkJCSJHQ0MgZG9lcyBub3QgY3Vy cmVudGx5IHN1cHBvcnQgbWl4ZWQgc2l6ZSB0eXBlcyAiCgkJCSJmb3IgJTxzaW1kJT4gZnVuY3Rp b25zIik7CgkgIGVsc2UKCSAgICB3YXJuaW5nX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9k ZS0+ZGVjbCksIDAsCgkJCSJHQ0MgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgYXJndW1lbnQg dHlwZSAlcVQgIgoJCQkiZm9yICU8c2ltZCU+IGZ1bmN0aW9ucyIsIGFyZ190eXBlKTsKCSAgcmV0 dXJuIDA7Cgl9CiAgICB9CgogIGNsb25laS0+dmVjc2l6ZV9tYW5nbGUgPSAnbic7CiAgY2xvbmVp LT5tYXNrX21vZGUgPSBWT0lEbW9kZTsKICBlbHRfYml0cyA9IEdFVF9NT0RFX0JJVFNJWkUgKFND QUxBUl9UWVBFX01PREUgKGJhc2VfdHlwZSkpOwogIGlmIChrbm93bl9lcSAoY2xvbmVpLT5zaW1k bGVuLCAwVSkpCiAgICB7CiAgICAgIGNvdW50ID0gMjsKICAgICAgdmVjX2JpdHMgPSAobnVtID09 IDAgPyA2NCA6IDEyOCk7CiAgICAgIGNsb25laS0+c2ltZGxlbiA9IGV4YWN0X2RpdiAodmVjX2Jp dHMsIGVsdF9iaXRzKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGNvdW50ID0gMTsKICAgICAg dmVjX2JpdHMgPSBjbG9uZWktPnNpbWRsZW4gKiBlbHRfYml0czsKICAgICAgLyogRm9yIG5vdywg U1ZFIHNpbWRjbG9uZXMgd29uJ3QgcHJvZHVjZSBpbGxlZ2FsIHNpbWRsZW4sIFNvIG9ubHkgY2hl Y2sKCSBjb25zdCBzaW1kbGVucyBoZXJlLiAgKi8KICAgICAgaWYgKGNsb25laS0+c2ltZGxlbi5p c19jb25zdGFudCAoJmNvbnN0X3NpbWRsZW4pCgkgICYmIG1heWJlX25lICh2ZWNfYml0cywgNjRV KSAmJiBtYXliZV9uZSAodmVjX2JpdHMsIDEyOFUpKQoJewoJICBpZiAoZXhwbGljaXRfcCkKCSAg ICB3YXJuaW5nX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVjbCksIDAsCgkJCSJH Q0MgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgc2ltZGxlbiAld2QgZm9yICIKCQkJInR5cGUg JXFUIiwKCQkJY29uc3Rfc2ltZGxlbiwgYmFzZV90eXBlKTsKCSAgcmV0dXJuIDA7Cgl9CiAgICB9 CiAgY2xvbmVpLT52ZWNzaXplX2ludCA9IHZlY19iaXRzOwogIGNsb25laS0+dmVjc2l6ZV9mbG9h dCA9IHZlY19iaXRzOwogIHJldHVybiBjb3VudDsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9TSU1E X0NMT05FX0FESlVTVC4gICovCgpzdGF0aWMgdm9pZAphYXJjaDY0X3NpbWRfY2xvbmVfYWRqdXN0 IChzdHJ1Y3QgY2dyYXBoX25vZGUgKm5vZGUpCnsKICAvKiBBZGQgYWFyY2g2NF92ZWN0b3JfcGNz IHRhcmdldCBhdHRyaWJ1dGUgdG8gU0lNRCBjbG9uZXMgc28gdGhleQogICAgIHVzZSB0aGUgY29y cmVjdCBBQkkuICAqLwoKICB0cmVlIHQgPSBUUkVFX1RZUEUgKG5vZGUtPmRlY2wpOwogIFRZUEVf QVRUUklCVVRFUyAodCkgPSBtYWtlX2F0dHJpYnV0ZSAoImFhcmNoNjRfdmVjdG9yX3BjcyIsICJk ZWZhdWx0IiwKCQkJCQlUWVBFX0FUVFJJQlVURVMgKHQpKTsKfQoKLyogSW1wbGVtZW50IFRBUkdF VF9TSU1EX0NMT05FX1VTQUJMRS4gICovCgpzdGF0aWMgaW50CmFhcmNoNjRfc2ltZF9jbG9uZV91 c2FibGUgKHN0cnVjdCBjZ3JhcGhfbm9kZSAqbm9kZSkKewogIHN3aXRjaCAobm9kZS0+c2ltZGNs b25lLT52ZWNzaXplX21hbmdsZSkKICAgIHsKICAgIGNhc2UgJ24nOgogICAgICBpZiAoIVRBUkdF VF9TSU1EKQoJcmV0dXJuIC0xOwogICAgICByZXR1cm4gMDsKICAgIGRlZmF1bHQ6CiAgICAgIGdj Y191bnJlYWNoYWJsZSAoKTsKICAgIH0KfQoKLyogSW1wbGVtZW50IFRBUkdFVF9DT01QX1RZUEVf QVRUUklCVVRFUyAqLwoKc3RhdGljIGludAphYXJjaDY0X2NvbXBfdHlwZV9hdHRyaWJ1dGVzIChj b25zdF90cmVlIHR5cGUxLCBjb25zdF90cmVlIHR5cGUyKQp7CiAgYXV0byBjaGVja19hdHRyID0g WyZdKGNvbnN0IGNoYXIgKm5hbWUpIHsKICAgIHRyZWUgYXR0cjEgPSBsb29rdXBfYXR0cmlidXRl IChuYW1lLCBUWVBFX0FUVFJJQlVURVMgKHR5cGUxKSk7CiAgICB0cmVlIGF0dHIyID0gbG9va3Vw X2F0dHJpYnV0ZSAobmFtZSwgVFlQRV9BVFRSSUJVVEVTICh0eXBlMikpOwogICAgaWYgKCFhdHRy MSAmJiAhYXR0cjIpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIHJldHVybiBhdHRyMSAmJiBhdHRy MiAmJiBhdHRyaWJ1dGVfdmFsdWVfZXF1YWwgKGF0dHIxLCBhdHRyMik7CiAgfTsKCiAgaWYgKCFj aGVja19hdHRyICgiYWFyY2g2NF92ZWN0b3JfcGNzIikpCiAgICByZXR1cm4gMDsKICBpZiAoIWNo ZWNrX2F0dHIgKCJBZHZhbmNlZCBTSU1EIHR5cGUiKSkKICAgIHJldHVybiAwOwogIGlmICghY2hl Y2tfYXR0ciAoIlNWRSB0eXBlIikpCiAgICByZXR1cm4gMDsKICBpZiAoIWNoZWNrX2F0dHIgKCJT VkUgc2l6ZWxlc3MgdHlwZSIpKQogICAgcmV0dXJuIDA7CiAgcmV0dXJuIDE7Cn0KCi8qIEltcGxl bWVudCBUQVJHRVRfR0VUX01VTFRJTElCX0FCSV9OQU1FICovCgpzdGF0aWMgY29uc3QgY2hhciAq CmFhcmNoNjRfZ2V0X211bHRpbGliX2FiaV9uYW1lICh2b2lkKQp7CiAgaWYgKFRBUkdFVF9CSUdf RU5EKQogICAgcmV0dXJuIFRBUkdFVF9JTFAzMiA/ICJhYXJjaDY0X2JlX2lscDMyIiA6ICJhYXJj aDY0X2JlIjsKICByZXR1cm4gVEFSR0VUX0lMUDMyID8gImFhcmNoNjRfaWxwMzIiIDogImFhcmNo NjQiOwp9CgovKiBJbXBsZW1lbnQgVEFSR0VUX1NUQUNLX1BST1RFQ1RfR1VBUkQuIEluIGNhc2Ug b2YgYQogICBnbG9iYWwgdmFyaWFibGUgYmFzZWQgZ3VhcmQgdXNlIHRoZSBkZWZhdWx0IGVsc2UK ICAgcmV0dXJuIGEgbnVsbCB0cmVlLiAgKi8Kc3RhdGljIHRyZWUKYWFyY2g2NF9zdGFja19wcm90 ZWN0X2d1YXJkICh2b2lkKQp7CiAgaWYgKGFhcmNoNjRfc3RhY2tfcHJvdGVjdG9yX2d1YXJkID09 IFNTUF9HTE9CQUwpCiAgICByZXR1cm4gZGVmYXVsdF9zdGFja19wcm90ZWN0X2d1YXJkICgpOwoK ICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBSZXR1cm4gdGhlIGRpYWdub3N0aWMgbWVzc2FnZSBz dHJpbmcgaWYgdGhlIGJpbmFyeSBvcGVyYXRpb24gT1AgaXMKICAgbm90IHBlcm1pdHRlZCBvbiBU WVBFMSBhbmQgVFlQRTIsIE5VTEwgb3RoZXJ3aXNlLiAgKi8KCnN0YXRpYyBjb25zdCBjaGFyICoK YWFyY2g2NF9pbnZhbGlkX2JpbmFyeV9vcCAoaW50IG9wIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0 X3RyZWUgdHlwZTEsCgkJCSAgIGNvbnN0X3RyZWUgdHlwZTIpCnsKICBpZiAoVkVDVE9SX1RZUEVf UCAodHlwZTEpCiAgICAgICYmIFZFQ1RPUl9UWVBFX1AgKHR5cGUyKQogICAgICAmJiAhVFlQRV9J TkRJVklTSUJMRV9QICh0eXBlMSkKICAgICAgJiYgIVRZUEVfSU5ESVZJU0lCTEVfUCAodHlwZTIp CiAgICAgICYmIChhYXJjaDY0X3N2ZTo6YnVpbHRpbl90eXBlX3AgKHR5cGUxKQoJICAhPSBhYXJj aDY0X3N2ZTo6YnVpbHRpbl90eXBlX3AgKHR5cGUyKSkpCiAgICByZXR1cm4gTl8oImNhbm5vdCBj b21iaW5lIEdOVSBhbmQgU1ZFIHZlY3RvcnMgaW4gYSBiaW5hcnkgb3BlcmF0aW9uIik7CgogIC8q IE9wZXJhdGlvbiBhbGxvd2VkLiAgKi8KICByZXR1cm4gTlVMTDsKfQoKLyogSW1wbGVtZW50IFRB UkdFVF9NRU1UQUdfQ0FOX1RBR19BRERSRVNTRVMuICBIZXJlIHdlIHRlbGwgdGhlIHJlc3Qgb2Yg dGhlCiAgIGNvbXBpbGVyIHRoYXQgd2UgYXV0b21hdGljYWxseSBpZ25vcmUgdGhlIHRvcCBieXRl IG9mIG91ciBwb2ludGVycywgd2hpY2gKICAgYWxsb3dzIHVzaW5nIC1mc2FuaXRpemU9aHdhZGRy ZXNzLiAgKi8KYm9vbAphYXJjaDY0X2Nhbl90YWdfYWRkcmVzc2VzICgpCnsKICByZXR1cm4gIVRB UkdFVF9JTFAzMjsKfQoKLyogSW1wbGVtZW50IFRBUkdFVF9BU01fRklMRV9FTkQgZm9yIEFBcmNo NjQuICBUaGlzIGFkZHMgdGhlIEFBcmNoNjQgR05VIE5PVEUKICAgc2VjdGlvbiBhdCB0aGUgZW5k IGlmIG5lZWRlZC4gICovCiNkZWZpbmUgR05VX1BST1BFUlRZX0FBUkNINjRfRkVBVFVSRV8xX0FO RAkweGMwMDAwMDAwCiNkZWZpbmUgR05VX1BST1BFUlRZX0FBUkNINjRfRkVBVFVSRV8xX0JUSQko MVUgPDwgMCkKI2RlZmluZSBHTlVfUFJPUEVSVFlfQUFSQ0g2NF9GRUFUVVJFXzFfUEFDCSgxVSA8 PCAxKQp2b2lkCmFhcmNoNjRfZmlsZV9lbmRfaW5kaWNhdGVfZXhlY19zdGFjayAoKQp7CiAgZmls ZV9lbmRfaW5kaWNhdGVfZXhlY19zdGFjayAoKTsKCiAgdW5zaWduZWQgZmVhdHVyZV8xX2FuZCA9 IDA7CiAgaWYgKGFhcmNoX2J0aV9lbmFibGVkICgpKQogICAgZmVhdHVyZV8xX2FuZCB8PSBHTlVf UFJPUEVSVFlfQUFSQ0g2NF9GRUFUVVJFXzFfQlRJOwoKICBpZiAoYWFyY2hfcmFfc2lnbl9zY29w ZSAhPSBBQVJDSF9GVU5DVElPTl9OT05FKQogICAgZmVhdHVyZV8xX2FuZCB8PSBHTlVfUFJPUEVS VFlfQUFSQ0g2NF9GRUFUVVJFXzFfUEFDOwoKICBpZiAoZmVhdHVyZV8xX2FuZCkKICAgIHsKICAg ICAgLyogR2VuZXJhdGUgLm5vdGUuZ251LnByb3BlcnR5IHNlY3Rpb24uICAqLwogICAgICBzd2l0 Y2hfdG9fc2VjdGlvbiAoZ2V0X3NlY3Rpb24gKCIubm90ZS5nbnUucHJvcGVydHkiLAoJCQkJICAg ICAgU0VDVElPTl9OT1RZUEUsIE5VTEwpKTsKCiAgICAgIC8qIFBUX05PVEUgaGVhZGVyOiBuYW1l c3osIGRlc2NzeiwgdHlwZS4KCSBuYW1lc3ogPSA0ICgiR05VXDAiKQoJIGRlc2NzeiA9IDE2IChT aXplIG9mIHRoZSBwcm9ncmFtIHByb3BlcnR5IGFycmF5KQoJCSAgWygxMiArIHBhZGRpbmcpICog TnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzXQoJIHR5cGUgICA9IDUgKE5UX0dOVV9QUk9QRVJUWV9U WVBFXzApLiAgKi8KICAgICAgYXNzZW1ibGVfYWxpZ24gKFBPSU5URVJfU0laRSk7CiAgICAgIGFz c2VtYmxlX2ludGVnZXIgKEdFTl9JTlQgKDQpLCA0LCAzMiwgMSk7CiAgICAgIGFzc2VtYmxlX2lu dGVnZXIgKEdFTl9JTlQgKFJPVU5EX1VQICgxMiwgUE9JTlRFUl9CWVRFUykpLCA0LCAzMiwgMSk7 CiAgICAgIGFzc2VtYmxlX2ludGVnZXIgKEdFTl9JTlQgKDUpLCA0LCAzMiwgMSk7CgogICAgICAv KiBQVF9OT1RFIG5hbWUuICAqLwogICAgICBhc3NlbWJsZV9zdHJpbmcgKCJHTlUiLCA0KTsKCiAg ICAgIC8qIFBUX05PVEUgY29udGVudHMgZm9yIE5UX0dOVV9QUk9QRVJUWV9UWVBFXzA6CgkgdHlw ZSAgID0gR05VX1BST1BFUlRZX0FBUkNINjRfRkVBVFVSRV8xX0FORAoJIGRhdGFzeiA9IDQKCSBk YXRhICAgPSBmZWF0dXJlXzFfYW5kLiAgKi8KICAgICAgYXNzZW1ibGVfaW50ZWdlciAoR0VOX0lO VCAoR05VX1BST1BFUlRZX0FBUkNINjRfRkVBVFVSRV8xX0FORCksIDQsIDMyLCAxKTsKICAgICAg YXNzZW1ibGVfaW50ZWdlciAoR0VOX0lOVCAoNCksIDQsIDMyLCAxKTsKICAgICAgYXNzZW1ibGVf aW50ZWdlciAoR0VOX0lOVCAoZmVhdHVyZV8xX2FuZCksIDQsIDMyLCAxKTsKCiAgICAgIC8qIFBh ZCB0aGUgc2l6ZSBvZiB0aGUgbm90ZSB0byB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KICAg ICAgYXNzZW1ibGVfYWxpZ24gKFBPSU5URVJfU0laRSk7CiAgICB9Cn0KI3VuZGVmIEdOVV9QUk9Q RVJUWV9BQVJDSDY0X0ZFQVRVUkVfMV9QQUMKI3VuZGVmIEdOVV9QUk9QRVJUWV9BQVJDSDY0X0ZF QVRVUkVfMV9CVEkKI3VuZGVmIEdOVV9QUk9QRVJUWV9BQVJDSDY0X0ZFQVRVUkVfMV9BTkQKCi8q IEhlbHBlciBmdW5jdGlvbiBmb3Igc3RyYWlnaHQgbGluZSBzcGVjdWxhdGlvbi4KICAgUmV0dXJu IHdoYXQgYmFycmllciBzaG91bGQgYmUgZW1pdHRlZCBmb3Igc3RyYWlnaHQgbGluZSBzcGVjdWxh dGlvbgogICBtaXRpZ2F0aW9uLgogICBXaGVuIG5vdCBtaXRpZ2F0aW5nIGFnYWluc3Qgc3RyYWln aHQgbGluZSBzcGVjdWxhdGlvbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMKICAgYW4gZW1wdHkgc3Ry aW5nLgogICBXaGVuIG1pdGlnYXRpbmcgYWdhaW5zdCBzdHJhaWdodCBsaW5lIHNwZWN1bGF0aW9u LCB1c2U6CiAgICogU0Igd2hlbiB0aGUgdjguNS1BIFNCIGV4dGVuc2lvbiBpcyBlbmFibGVkLgog ICAqIERTQitJU0Igb3RoZXJ3aXNlLiAgKi8KY29uc3QgY2hhciAqCmFhcmNoNjRfc2xzX2JhcnJp ZXIgKGludCBtaXRpZ2F0aW9uX3JlcXVpcmVkKQp7CiAgcmV0dXJuIG1pdGlnYXRpb25fcmVxdWly ZWQKICAgID8gKFRBUkdFVF9TQiA/ICJzYiIgOiAiZHNiXHRzeVxuXHRpc2IiKQogICAgOiAiIjsK fQoKc3RhdGljIEdUWSAoKCkpIHRyZWUgYWFyY2g2NF9zbHNfc2hhcmVkX3RodW5rc1szMF07CnN0 YXRpYyBHVFkgKCgpKSBib29sIGFhcmNoNjRfc2xzX3NoYXJlZF90aHVua3NfbmVlZGVkID0gZmFs c2U7CmNvbnN0IGNoYXIgKmluZGlyZWN0X3N5bWJvbF9uYW1lc1szMF0gPSB7CiAgICAiX19jYWxs X2luZGlyZWN0X3gwIiwKICAgICJfX2NhbGxfaW5kaXJlY3RfeDEiLAogICAgIl9fY2FsbF9pbmRp cmVjdF94MiIsCiAgICAiX19jYWxsX2luZGlyZWN0X3gzIiwKICAgICJfX2NhbGxfaW5kaXJlY3Rf eDQiLAogICAgIl9fY2FsbF9pbmRpcmVjdF94NSIsCiAgICAiX19jYWxsX2luZGlyZWN0X3g2IiwK ICAgICJfX2NhbGxfaW5kaXJlY3RfeDciLAogICAgIl9fY2FsbF9pbmRpcmVjdF94OCIsCiAgICAi X19jYWxsX2luZGlyZWN0X3g5IiwKICAgICJfX2NhbGxfaW5kaXJlY3RfeDEwIiwKICAgICJfX2Nh bGxfaW5kaXJlY3RfeDExIiwKICAgICJfX2NhbGxfaW5kaXJlY3RfeDEyIiwKICAgICJfX2NhbGxf aW5kaXJlY3RfeDEzIiwKICAgICJfX2NhbGxfaW5kaXJlY3RfeDE0IiwKICAgICJfX2NhbGxfaW5k aXJlY3RfeDE1IiwKICAgICIiLCAvKiAiX19jYWxsX2luZGlyZWN0X3gxNiIsICAqLwogICAgIiIs IC8qICJfX2NhbGxfaW5kaXJlY3RfeDE3IiwgICovCiAgICAiX19jYWxsX2luZGlyZWN0X3gxOCIs CiAgICAiX19jYWxsX2luZGlyZWN0X3gxOSIsCiAgICAiX19jYWxsX2luZGlyZWN0X3gyMCIsCiAg ICAiX19jYWxsX2luZGlyZWN0X3gyMSIsCiAgICAiX19jYWxsX2luZGlyZWN0X3gyMiIsCiAgICAi X19jYWxsX2luZGlyZWN0X3gyMyIsCiAgICAiX19jYWxsX2luZGlyZWN0X3gyNCIsCiAgICAiX19j YWxsX2luZGlyZWN0X3gyNSIsCiAgICAiX19jYWxsX2luZGlyZWN0X3gyNiIsCiAgICAiX19jYWxs X2luZGlyZWN0X3gyNyIsCiAgICAiX19jYWxsX2luZGlyZWN0X3gyOCIsCiAgICAiX19jYWxsX2lu ZGlyZWN0X3gyOSIsCn07CgovKiBGdW5jdGlvbiB0byBjcmVhdGUgYSBCTFIgdGh1bmsuICBUaGlz IHRodW5rIGlzIHVzZWQgdG8gbWl0aWdhdGUgc3RyYWlnaHQKICAgbGluZSBzcGVjdWxhdGlvbi4g IEluc3RlYWQgb2YgYSBzaW1wbGUgQkxSIHRoYXQgY2FuIGJlIHNwZWN1bGF0ZWQgcGFzdCwKICAg d2UgZW1pdCBhIEJMIHRvIHRoaXMgdGh1bmssIGFuZCB0aGlzIHRodW5rIGNvbnRhaW5zIGEgQlIg dG8gdGhlIHJlbGV2YW50CiAgIHJlZ2lzdGVyLiAgVGhlc2UgdGh1bmtzIGhhdmUgdGhlIHJlbGV2 YW50IHNwZWN1bGF0aW9uIGJhcnJpZXMgcHV0IGFmdGVyCiAgIHRoZWlyIGluZGlyZWN0IGJyYW5j aCBzbyB0aGF0IHNwZWN1bGF0aW9uIGlzIGJsb2NrZWQuCgogICBXZSB1c2Ugc3VjaCBhIHRodW5r IHNvIHRoZSBzcGVjdWxhdGlvbiBiYXJyaWVycyBhcmUga2VwdCBvZmYgdGhlCiAgIGFyY2hpdGVj dHVyYWxseSBleGVjdXRlZCBwYXRoIGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgcGVyZm9ybWFuY2Ug b3ZlcmhlYWQuCgogICBXaGVuIG9wdGltaXppbmcgZm9yIHNpemUgd2UgdXNlIHN0dWJzIHNoYXJl ZCBieSB0aGUgbGlua2VkIG9iamVjdC4KICAgV2hlbiBvcHRpbWl6aW5nIGZvciBwZXJmb3JtYW5j ZSB3ZSBlbWl0IHN0dWJzIGZvciBlYWNoIGZ1bmN0aW9uIGluIHRoZSBob3BlCiAgIHRoYXQgdGhl IGJyYW5jaCBwcmVkaWN0b3IgY2FuIGJldHRlciB0cmFpbiBvbiBqdW1wcyBzcGVjaWZpYyBmb3Ig YSBnaXZlbgogICBmdW5jdGlvbi4gICovCnJ0eAphYXJjaDY0X3Nsc19jcmVhdGVfYmxyX2xhYmVs IChpbnQgcmVnbnVtKQp7CiAgZ2NjX2Fzc2VydCAoU1RVQl9SRUdOVU1fUCAocmVnbnVtKSk7CiAg aWYgKG9wdGltaXplX2Z1bmN0aW9uX2Zvcl9zaXplX3AgKGNmdW4pKQogICAgewogICAgICAvKiBG b3IgdGhlIHRodW5rcyBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgZnVuY3Rpb25zIGluIHRoaXMg Y29tcGlsYXRpb24KCSB1bml0IHdlIHVzZSBhIG5hbWVkIHN5bWJvbCAtLSB0aGlzIGlzIGp1c3Qg Zm9yIHVzZXJzIHRvIG1vcmUgZWFzaWx5CgkgdW5kZXJzdGFuZCB0aGUgZ2VuZXJhdGVkIGFzc2Vt Ymx5LiAgKi8KICAgICAgYWFyY2g2NF9zbHNfc2hhcmVkX3RodW5rc19uZWVkZWQgPSB0cnVlOwog ICAgICBjb25zdCBjaGFyICp0aHVua19uYW1lID0gaW5kaXJlY3Rfc3ltYm9sX25hbWVzW3JlZ251 bV07CiAgICAgIGlmIChhYXJjaDY0X3Nsc19zaGFyZWRfdGh1bmtzW3JlZ251bV0gPT0gTlVMTCkK CXsKCSAgLyogQnVpbGQgYSBkZWNsIHJlcHJlc2VudGluZyB0aGlzIGZ1bmN0aW9uIHN0dWIgYW5k IHJlY29yZCBpdCBmb3IKCSAgICAgbGF0ZXIuICBXZSBidWlsZCBhIGRlY2wgaGVyZSBzbyB3ZSBj YW4gdXNlIHRoZSBHQ0MgbWFjaGluZXJ5IGZvcgoJICAgICBoYW5kbGluZyBzZWN0aW9ucyBhdXRv bWF0aWNhbGx5ICh0aHJvdWdoIGBnZXRfbmFtZWRfc2VjdGlvbmAgYW5kCgkgICAgIGBtYWtlX2Rl Y2xfb25lX29ubHlgKS4gIFRoYXQgc2F2ZXMgdXMgYSBsb3Qgb2YgdHJvdWJsZSBoYW5kbGluZwoJ ICAgICB0aGUgc3BlY2lmaWNzIG9mIGRpZmZlcmVudCBvdXRwdXQgZmlsZSBmb3JtYXRzLiAgKi8K CSAgdHJlZSBkZWNsID0gYnVpbGRfZGVjbCAoQlVJTFRJTlNfTE9DQVRJT04sIEZVTkNUSU9OX0RF Q0wsCgkJCQkgIGdldF9pZGVudGlmaWVyICh0aHVua19uYW1lKSwKCQkJCSAgYnVpbGRfZnVuY3Rp b25fdHlwZV9saXN0ICh2b2lkX3R5cGVfbm9kZSwKCQkJCQkJCSAgICBOVUxMX1RSRUUpKTsKCSAg REVDTF9SRVNVTFQgKGRlY2wpID0gYnVpbGRfZGVjbCAoQlVJTFRJTlNfTE9DQVRJT04sIFJFU1VM VF9ERUNMLAoJCQkJCSAgIE5VTExfVFJFRSwgdm9pZF90eXBlX25vZGUpOwoJICBUUkVFX1BVQkxJ QyAoZGVjbCkgPSAxOwoJICBUUkVFX1NUQVRJQyAoZGVjbCkgPSAxOwoJICBERUNMX0lHTk9SRURf UCAoZGVjbCkgPSAxOwoJICBERUNMX0FSVElGSUNJQUwgKGRlY2wpID0gMTsKCSAgbWFrZV9kZWNs X29uZV9vbmx5IChkZWNsLCBERUNMX0FTU0VNQkxFUl9OQU1FIChkZWNsKSk7CgkgIHJlc29sdmVf dW5pcXVlX3NlY3Rpb24gKGRlY2wsIDAsIGZhbHNlKTsKCSAgYWFyY2g2NF9zbHNfc2hhcmVkX3Ro dW5rc1tyZWdudW1dID0gZGVjbDsKCX0KCiAgICAgIHJldHVybiBnZW5fcnR4X1NZTUJPTF9SRUYg KFBtb2RlLCB0aHVua19uYW1lKTsKICAgIH0KCiAgaWYgKGNmdW4tPm1hY2hpbmUtPmNhbGxfdmlh W3JlZ251bV0gPT0gTlVMTCkKICAgIGNmdW4tPm1hY2hpbmUtPmNhbGxfdmlhW3JlZ251bV0KICAg ICAgPSBnZW5fcnR4X0xBQkVMX1JFRiAoUG1vZGUsIGdlbl9sYWJlbF9ydHggKCkpOwogIHJldHVy biBjZnVuLT5tYWNoaW5lLT5jYWxsX3ZpYVtyZWdudW1dOwp9CgovKiBIZWxwZXIgZnVuY3Rpb24g Zm9yIGFhcmNoNjRfc2xzX2VtaXRfYmxyX2Z1bmN0aW9uX3RodW5rcyBhbmQKICAgYWFyY2g2NF9z bHNfZW1pdF9zaGFyZWRfYmxyX3RodW5rcyBiZWxvdy4gICovCnN0YXRpYyB2b2lkCmFhcmNoNjRf c2xzX2VtaXRfZnVuY3Rpb25fc3R1YiAoRklMRSAqb3V0X2ZpbGUsIGludCByZWdudW0pCnsKICAv KiBTYXZlIGluIHgxNiBhbmQgYnJhbmNoIHRvIHRoYXQgZnVuY3Rpb24gc28gdGhpcyB0cmFuc2Zv cm1hdGlvbiBkb2VzCiAgICAgbm90IHByZXZlbnQganVtcGluZyB0byBgQlRJIGNgIGluc3RydWN0 aW9ucy4gICovCiAgYXNtX2ZwcmludGYgKG91dF9maWxlLCAiXHRtb3ZcdHgxNiwgeCVkXG4iLCBy ZWdudW0pOwogIGFzbV9mcHJpbnRmIChvdXRfZmlsZSwgIlx0YnJcdHgxNlxuIik7Cn0KCi8qIEVt aXQgYWxsIEJMUiBzdHVicyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgogICBIZXJlIHdl IGVtaXQgYWxsIHRoZSBCTFIgc3R1YnMgbmVlZGVkIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4g IFNpbmNlIHdlCiAgIGVtaXQgdGhlc2Ugc3R1YnMgaW4gYSBjb25zZWN1dGl2ZSBibG9jayB3ZSBr bm93IHRoZXJlIHdpbGwgYmUgbm8gc3BlY3VsYXRpb24KICAgZ2FkZ2V0cyBiZXR3ZWVuIGVhY2gg c3R1YiwgYW5kIGhlbmNlIHdlIG9ubHkgZW1pdCBhIHNwZWN1bGF0aW9uIGJhcnJpZXIgYXQKICAg dGhlIGVuZCBvZiB0aGUgc3R1YiBzZXF1ZW5jZXMuCgogICBUaGlzIGlzIGNhbGxlZCBpbiB0aGUg VEFSR0VUX0FTTV9GVU5DVElPTl9FUElMT0dVRSBob29rLiAgKi8Kdm9pZAphYXJjaDY0X3Nsc19l bWl0X2Jscl9mdW5jdGlvbl90aHVua3MgKEZJTEUgKm91dF9maWxlKQp7CiAgaWYgKCEgYWFyY2g2 NF9oYXJkZW5fc2xzX2Jscl9wICgpKQogICAgcmV0dXJuOwoKICBib29sIGFueV9mdW5jdGlvbnNf ZW1pdHRlZCA9IGZhbHNlOwogIC8qIFdlIG11c3Qgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgY3VycmVu dCBmdW5jdGlvbiBzZWN0aW9uIHNpbmNlIHRoaXMgYXNzZW1ibHkKICAgICBpcyBlbWl0dGVkIGF0 IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcyBtZWFucyBpdCBjYW4gYmUgZW1pdHRlZCAq anVzdAogICAgIGFmdGVyKiB0aGUgY29sZCBzZWN0aW9uIG9mIGEgZnVuY3Rpb24uICBUaGF0IGNv bGQgcGFydCB3b3VsZCBiZSBlbWl0dGVkIGluCiAgICAgYSBkaWZmZXJlbnQgc2VjdGlvbi4gIFRo YXQgc3dpdGNoIHdvdWxkIHRyaWdnZXIgYSBgLmNmaV9lbmRwcm9jYCBkaXJlY3RpdmUKICAgICB0 byBiZSBlbWl0dGVkIGluIHRoZSBvcmlnaW5hbCBzZWN0aW9uIGFuZCBhIGAuY2ZpX3N0YXJ0cHJv Y2AgZGlyZWN0aXZlIHRvCiAgICAgYmUgZW1pdHRlZCBpbiB0aGUgbmV3IHNlY3Rpb24uICBTd2l0 Y2hpbmcgdG8gdGhlIG9yaWdpbmFsIHNlY3Rpb24gd2l0aG91dAogICAgIHJlc3RvcmluZyB3b3Vs ZCBtZWFuIHRoYXQgdGhlIGAuY2ZpX2VuZHByb2NgIGVtaXR0ZWQgYXMgYSBmdW5jdGlvbiBlbmRz CiAgICAgd291bGQgaGFwcGVuIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gLS0gbGVhdmluZyBhbiB1 bm1hdGNoZWQKICAgICBgLmNmaV9zdGFydHByb2NgIGluIHRoZSBjb2xkIHRleHQgc2VjdGlvbiBh bmQgYW4gdW5tYXRjaGVkIGAuY2ZpX2VuZHByb2NgCiAgICAgaW4gdGhlIHN0YW5kYXJkIHRleHQg c2VjdGlvbi4gICovCiAgc2VjdGlvbiAqc2F2ZV90ZXh0X3NlY3Rpb24gPSBpbl9zZWN0aW9uOwog IHN3aXRjaF90b19zZWN0aW9uIChmdW5jdGlvbl9zZWN0aW9uIChjdXJyZW50X2Z1bmN0aW9uX2Rl Y2wpKTsKICBmb3IgKGludCByZWdudW0gPSAwOyByZWdudW0gPCAzMDsgKytyZWdudW0pCiAgICB7 CiAgICAgIHJ0eCBzcGVjdV9sYWJlbCA9IGNmdW4tPm1hY2hpbmUtPmNhbGxfdmlhW3JlZ251bV07 CiAgICAgIGlmIChzcGVjdV9sYWJlbCA9PSBOVUxMKQoJY29udGludWU7CgogICAgICB0YXJnZXRt LmFzbV9vdXQucHJpbnRfb3BlcmFuZCAob3V0X2ZpbGUsIHNwZWN1X2xhYmVsLCAwKTsKICAgICAg YXNtX2ZwcmludGYgKG91dF9maWxlLCAiOlxuIik7CiAgICAgIGFhcmNoNjRfc2xzX2VtaXRfZnVu Y3Rpb25fc3R1YiAob3V0X2ZpbGUsIHJlZ251bSk7CiAgICAgIGFueV9mdW5jdGlvbnNfZW1pdHRl ZCA9IHRydWU7CiAgICB9CiAgaWYgKGFueV9mdW5jdGlvbnNfZW1pdHRlZCkKICAgIC8qIENhbiB1 c2UgdGhlIFNCIGlmIG5lZWRzIGJlIGhlcmUsIHNpbmNlIHRoaXMgc3R1YiB3aWxsIG9ubHkgYmUg dXNlZAogICAgICBieSB0aGUgY3VycmVudCBmdW5jdGlvbiwgYW5kIGhlbmNlIGZvciB0aGUgY3Vy cmVudCB0YXJnZXQuICAqLwogICAgYXNtX2ZwcmludGYgKG91dF9maWxlLCAiXHQlc1xuIiwgYWFy Y2g2NF9zbHNfYmFycmllciAodHJ1ZSkpOwogIHN3aXRjaF90b19zZWN0aW9uIChzYXZlX3RleHRf c2VjdGlvbik7Cn0KCi8qIEVtaXQgc2hhcmVkIEJMUiBzdHVicyBmb3IgdGhlIGN1cnJlbnQgY29t cGlsYXRpb24gdW5pdC4KICAgT3ZlciB0aGUgY291cnNlIG9mIGNvbXBpbGluZyB0aGlzIHVuaXQg d2UgbWF5IGhhdmUgY29udmVydGVkIHNvbWUgQkxSCiAgIGluc3RydWN0aW9ucyB0byBhIEJMIHRv IGEgc2hhcmVkIHN0dWIgZnVuY3Rpb24uICBUaGlzIGlzIHdoZXJlIHdlIGVtaXQgdGhvc2UKICAg c3R1YiBmdW5jdGlvbnMuCiAgIFRoaXMgZnVuY3Rpb24gaXMgZm9yIHRoZSBzdHVicyBzaGFyZWQg YmV0d2VlbiBkaWZmZXJlbnQgZnVuY3Rpb25zIGluIHRoaXMKICAgY29tcGlsYXRpb24gdW5pdC4g IFdlIHNoYXJlIHdoZW4gb3B0aW1pemluZyBmb3Igc2l6ZSBpbnN0ZWFkIG9mIHNwZWVkLgoKICAg VGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhyb3VnaCB0aGUgVEFSR0VUX0FTTV9GSUxFX0VORCBo b29rLiAgKi8Kdm9pZAphYXJjaDY0X3Nsc19lbWl0X3NoYXJlZF9ibHJfdGh1bmtzIChGSUxFICpv dXRfZmlsZSkKewogIGlmICghIGFhcmNoNjRfc2xzX3NoYXJlZF90aHVua3NfbmVlZGVkKQogICAg cmV0dXJuOwoKICBmb3IgKGludCByZWdudW0gPSAwOyByZWdudW0gPCAzMDsgKytyZWdudW0pCiAg ICB7CiAgICAgIHRyZWUgZGVjbCA9IGFhcmNoNjRfc2xzX3NoYXJlZF90aHVua3NbcmVnbnVtXTsK ICAgICAgaWYgKCFkZWNsKQoJY29udGludWU7CgogICAgICBjb25zdCBjaGFyICpuYW1lID0gaW5k aXJlY3Rfc3ltYm9sX25hbWVzW3JlZ251bV07CiAgICAgIHN3aXRjaF90b19zZWN0aW9uIChnZXRf bmFtZWRfc2VjdGlvbiAoZGVjbCwgTlVMTCwgMCkpOwogICAgICBBU01fT1VUUFVUX0FMSUdOIChv dXRfZmlsZSwgMik7CiAgICAgIHRhcmdldG0uYXNtX291dC5nbG9iYWxpemVfbGFiZWwgKG91dF9m aWxlLCBuYW1lKTsKICAgICAgLyogT25seSBlbWl0cyBpZiB0aGUgY29tcGlsZXIgaXMgY29uZmln dXJlZCBmb3IgYW4gYXNzZW1ibGVyIHRoYXQgY2FuCgkgaGFuZGxlIHZpc2liaWxpdHkgZGlyZWN0 aXZlcy4gICovCiAgICAgIHRhcmdldG0uYXNtX291dC5hc3NlbWJsZV92aXNpYmlsaXR5IChkZWNs LCBWSVNJQklMSVRZX0hJRERFTik7CiAgICAgIEFTTV9PVVRQVVRfVFlQRV9ESVJFQ1RJVkUgKG91 dF9maWxlLCBuYW1lLCAiZnVuY3Rpb24iKTsKICAgICAgQVNNX09VVFBVVF9MQUJFTCAob3V0X2Zp bGUsIG5hbWUpOwogICAgICBhYXJjaDY0X3Nsc19lbWl0X2Z1bmN0aW9uX3N0dWIgKG91dF9maWxl LCByZWdudW0pOwogICAgICAvKiBVc2UgdGhlIG1vc3QgY29uc2VydmF0aXZlIHRhcmdldCB0byBl bnN1cmUgaXQgY2FuIGFsd2F5cyBiZSB1c2VkIGJ5IGFueQoJIGZ1bmN0aW9uIGluIHRoZSB0cmFu c2xhdGlvbiB1bml0LiAgKi8KICAgICAgYXNtX2ZwcmludGYgKG91dF9maWxlLCAiXHRkc2JcdHN5 XG5cdGlzYlxuIik7CiAgICAgIEFTTV9ERUNMQVJFX0ZVTkNUSU9OX1NJWkUgKG91dF9maWxlLCBu YW1lLCBkZWNsKTsKICAgIH0KfQoKLyogSW1wbGVtZW50IFRBUkdFVF9BU01fRklMRV9FTkQuICAq Lwp2b2lkCmFhcmNoNjRfYXNtX2ZpbGVfZW5kICgpCnsKICBhYXJjaDY0X3Nsc19lbWl0X3NoYXJl ZF9ibHJfdGh1bmtzIChhc21fb3V0X2ZpbGUpOwogIC8qIFNpbmNlIHRoaXMgZnVuY3Rpb24gd2ls bCBiZSBjYWxsZWQgZm9yIHRoZSBBU01fRklMRV9FTkQgaG9vaywgd2UgZW5zdXJlCiAgICAgdGhh dCB3aGF0IHdvdWxkIGJlIGNhbGxlZCBvdGhlcndpc2UgKGUuZy4gYGZpbGVfZW5kX2luZGljYXRl X2V4ZWNfc3RhY2tgCiAgICAgZm9yIEZyZWVCU0QpIHN0aWxsIGdldHMgY2FsbGVkLiAgKi8KI2lm ZGVmIFRBUkdFVF9BU01fRklMRV9FTkQKICBUQVJHRVRfQVNNX0ZJTEVfRU5EICgpOwojZW5kaWYK fQoKY29uc3QgY2hhciAqCmFhcmNoNjRfaW5kaXJlY3RfY2FsbF9hc20gKHJ0eCBhZGRyKQp7CiAg Z2NjX2Fzc2VydCAoUkVHX1AgKGFkZHIpKTsKICBpZiAoYWFyY2g2NF9oYXJkZW5fc2xzX2Jscl9w ICgpKQogICAgewogICAgICBydHggc3R1Yl9sYWJlbCA9IGFhcmNoNjRfc2xzX2NyZWF0ZV9ibHJf bGFiZWwgKFJFR05PIChhZGRyKSk7CiAgICAgIG91dHB1dF9hc21faW5zbiAoImJsXHQlMCIsICZz dHViX2xhYmVsKTsKICAgIH0KICBlbHNlCiAgIG91dHB1dF9hc21faW5zbiAoImJsclx0JTAiLCAm YWRkcik7CiAgcmV0dXJuICIiOwp9CgovKiBFbWl0IHRoZSBhc3NlbWJseSBpbnN0cnVjdGlvbiB0 byBsb2FkIHRoZSB0aHJlYWQgcG9pbnRlciBpbnRvIERFU1QuCiAgIFNlbGVjdCBiZXR3ZWVuIGRp ZmZlcmVudCB0cGlkcl9lbE4gcmVnaXN0ZXJzIGRlcGVuZGluZyBvbiAtbXRwPSBzZXR0aW5nLiAg Ki8KCmNvbnN0IGNoYXIgKgphYXJjaDY0X291dHB1dF9sb2FkX3RwIChydHggZGVzdCkKewogIGNv bnN0IGNoYXIgKnRwaWRyc1tdID0geyJ0cGlkcl9lbDAiLCAidHBpZHJfZWwxIiwgInRwaWRyX2Vs MiIsICJ0cGlkcl9lbDMifTsKICBjaGFyIGJ1ZmZlcls2NF07CiAgc25wcmludGYgKGJ1ZmZlciwg c2l6ZW9mIChidWZmZXIpLCAibXJzXHQlJTAsICVzIiwKCSAgICB0cGlkcnNbYWFyY2g2NF90cGlk cl9yZWdpc3Rlcl0pOwogIG91dHB1dF9hc21faW5zbiAoYnVmZmVyLCAmZGVzdCk7CiAgcmV0dXJu ICIiOwp9CgovKiBTZXQgdXAgdGhlIHZhbHVlIG9mIFJFR19BTExPQ19PUkRFUiBmcm9tIHNjcmF0 Y2guCgogICBJdCB3YXMgcHJldmlvdXNseSBnb29kIHByYWN0aWNlIHRvIHB1dCBjYWxsLWNsb2Ji ZXJlZCByZWdpc3RlcnMgYWhlYWQKICAgb2YgY2FsbC1wcmVzZXJ2ZWQgcmVnaXN0ZXJzLCBidXQg dGhhdCBpc24ndCBuZWNlc3NhcnkgdGhlc2UgZGF5cy4KICAgSVJBJ3MgbW9kZWwgb2YgcmVnaXN0 ZXIgc2F2ZS9yZXN0b3JlIGNvc3RzIGlzIG11Y2ggbW9yZSBzb3BoaXN0aWNhdGVkCiAgIHRoYW4g dGhlIG1vZGVsIHRoYXQgYSBzaW1wbGUgb3JkZXJpbmcgY291bGQgcHJvdmlkZS4gIFdlIGxlYXZl CiAgIEhPTk9SX1JFR19BTExPQ19PUkRFUiB1bmRlZmluZWQgc28gdGhhdCB3ZSBjYW4gZ2V0IHRo ZSBmdWxsIGJlbmVmaXQKICAgb2YgSVJBJ3MgbW9kZWwuCgogICBIb3dldmVyLCBpdCBpcyBzdGls bCB1c2VmdWwgdG8gbGlzdCByZWdpc3RlcnMgdGhhdCBhcmUgbWVtYmVycyBvZgogICBtdWx0aXBs ZSBjbGFzc2VzIGFmdGVyIHJlZ2lzdGVycyB0aGF0IGFyZSBtZW1iZXJzIG9mIGZld2VyIGNsYXNz ZXMuCiAgIEZvciBleGFtcGxlLCB3ZSBoYXZlOgoKICAgLSBGUF9MTzhfUkVHUzogdjAtdjcKICAg LSBGUF9MT19SRUdTOiB2MC12MTUKICAgLSBGUF9SRUdTOiB2MC12MzEKCiAgIElmLCBhcyBhIHRp ZS1icmVha2VyLCB3ZSBhbGxvY2F0ZSBGUF9SRUdTIGluIHRoZSBvcmRlciB2MC12MzEsCiAgIHdl IHJ1biB0aGUgcmlzayBvZiBzdGFydmluZyBvdGhlciAobG93ZXItcHJpb3JpdHkpIHBzZXVkb3Mg dGhhdAogICByZXF1aXJlIEZQX0xPOF9SRUdTIG9yIEZQX0xPX1JFR1MuICBBbGxvY2F0aW5nIEZQ X0xPX1JFR1MgaW4gdGhlCiAgIG9yZGVyIHYwLXYxNSBjb3VsZCBzaW1pbGFybHkgc3RhcnZlIHBz ZXVkb3MgdGhhdCByZXF1aXJlIEZQX0xPOF9SRUdTLgogICBBbGxvY2F0aW5nIGRvd253YXJkcyBy YXRoZXIgdGhhbiB1cHdhcmRzIGF2b2lkcyB0aGlzIHByb2JsZW0sIGF0IGxlYXN0CiAgIGluIGNv ZGUgdGhhdCBoYXMgcmVhc29uYWJsZSByZWdpc3RlciBwcmVzc3VyZS4KCiAgIFRoZSBzaXR1YXRp b24gZm9yIHByZWRpY2F0ZSByZWdpc3RlcnMgaXMgc2ltaWxhci4gICovCgp2b2lkCmFhcmNoNjRf YWRqdXN0X3JlZ19hbGxvY19vcmRlciAoKQp7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVJTVF9Q U0VVRE9fUkVHSVNURVI7ICsraSkKICAgIGlmIChJTl9SQU5HRSAoaSwgVjBfUkVHTlVNLCBWMzFf UkVHTlVNKSkKICAgICAgcmVnX2FsbG9jX29yZGVyW2ldID0gVjMxX1JFR05VTSAtIChpIC0gVjBf UkVHTlVNKTsKICAgIGVsc2UgaWYgKElOX1JBTkdFIChpLCBQMF9SRUdOVU0sIFAxNV9SRUdOVU0p KQogICAgICByZWdfYWxsb2Nfb3JkZXJbaV0gPSBQMTVfUkVHTlVNIC0gKGkgLSBQMF9SRUdOVU0p OwogICAgZWxzZQogICAgICByZWdfYWxsb2Nfb3JkZXJbaV0gPSBpOwp9CgovKiBUYXJnZXQtc3Bl Y2lmaWMgc2VsZnRlc3RzLiAgKi8KCiNpZiBDSEVDS0lOR19QCgpuYW1lc3BhY2Ugc2VsZnRlc3Qg ewoKLyogU2VsZnRlc3QgZm9yIHRoZSBSVEwgbG9hZGVyLgogICBWZXJpZnkgdGhhdCB0aGUgUlRM IGxvYWRlciBjb3BlcyB3aXRoIGEgZHVtcCBmcm9tCiAgIHByaW50X3J0eF9mdW5jdGlvbi4gIFRo aXMgaXMgZXNzZW50aWFsbHkganVzdCBhIHRlc3QgdGhhdCBjbGFzcwogICBmdW5jdGlvbl9yZWFk ZXIgY2FuIGhhbmRsZSBhIHJlYWwgZHVtcCwgYnV0IGl0IGFsc28gdmVyaWZpZXMKICAgdGhhdCBs b29rdXBfcmVnX2J5X2R1bXBfbmFtZSBjb3JyZWN0bHkgaGFuZGxlcyBoYXJkIHJlZ3MuCiAgIFRo ZSBwcmVzZW5jZSBvZiBoYXJkIHJlZyBuYW1lcyBpbiB0aGUgZHVtcCBtZWFucyB0aGF0IHRoZSB0 ZXN0IGlzCiAgIHRhcmdldC1zcGVjaWZpYywgaGVuY2UgaXQgaXMgaW4gdGhpcyBmaWxlLiAgKi8K CnN0YXRpYyB2b2lkCmFhcmNoNjRfdGVzdF9sb2FkaW5nX2Z1bGxfZHVtcCAoKQp7CiAgcnRsX2R1 bXBfdGVzdCB0IChTRUxGVEVTVF9MT0NBVElPTiwgbG9jYXRlX2ZpbGUgKCJhYXJjaDY0L3RpbWVz LXR3by5ydGwiKSk7CgogIEFTU0VSVF9TVFJFUSAoInRpbWVzX3R3byIsIElERU5USUZJRVJfUE9J TlRFUiAoREVDTF9OQU1FIChjZnVuLT5kZWNsKSkpOwoKICBydHhfaW5zbiAqaW5zbl8xID0gZ2V0 X2luc25fYnlfdWlkICgxKTsKICBBU1NFUlRfRVEgKE5PVEUsIEdFVF9DT0RFIChpbnNuXzEpKTsK CiAgcnR4X2luc24gKmluc25fMTUgPSBnZXRfaW5zbl9ieV91aWQgKDE1KTsKICBBU1NFUlRfRVEg KElOU04sIEdFVF9DT0RFIChpbnNuXzE1KSk7CiAgQVNTRVJUX0VRIChVU0UsIEdFVF9DT0RFIChQ QVRURVJOIChpbnNuXzE1KSkpOwoKICAvKiBWZXJpZnkgY3J0bC0+cmV0dXJuX3J0eC4gICovCiAg QVNTRVJUX0VRIChSRUcsIEdFVF9DT0RFIChjcnRsLT5yZXR1cm5fcnR4KSk7CiAgQVNTRVJUX0VR ICgwLCBSRUdOTyAoY3J0bC0+cmV0dXJuX3J0eCkpOwogIEFTU0VSVF9FUSAoU0ltb2RlLCBHRVRf TU9ERSAoY3J0bC0+cmV0dXJuX3J0eCkpOwp9CgovKiBUZXN0IHRoZSBmcmFjdGlvbmFsX2Nvc3Qg Y2xhc3MuICAqLwoKc3RhdGljIHZvaWQKYWFyY2g2NF90ZXN0X2ZyYWN0aW9uYWxfY29zdCAoKQp7 CiAgdXNpbmcgY2YgPSBmcmFjdGlvbmFsX2Nvc3Q7CgogIEFTU0VSVF9FUSAoY2YgKDAsIDIwKSwg MCk7CgogIEFTU0VSVF9FUSAoY2YgKDQsIDIpLCAyKTsKICBBU1NFUlRfRVEgKDMsIGNmICg5LCAz KSk7CgogIEFTU0VSVF9ORSAoY2YgKDUsIDIpLCAyKTsKICBBU1NFUlRfTkUgKDMsIGNmICg4LCAz KSk7CgogIEFTU0VSVF9FUSAoY2YgKDcsIDExKSArIGNmICgxNSwgMTEpLCAyKTsKICBBU1NFUlRf RVEgKGNmICgyLCAzKSArIGNmICgzLCA1KSwgY2YgKDE5LCAxNSkpOwogIEFTU0VSVF9FUSAoY2Yg KDIsIDMpICsgY2YgKDEsIDYpICsgY2YgKDEsIDYpLCAxKTsKCiAgQVNTRVJUX0VRIChjZiAoMTQs IDE1KSAtIGNmICg0LCAxNSksIGNmICgyLCAzKSk7CiAgQVNTRVJUX0VRIChjZiAoMSwgNCkgLSBj ZiAoMSwgMiksIDApOwogIEFTU0VSVF9FUSAoY2YgKDMsIDUpIC0gY2YgKDEsIDEwKSwgY2YgKDEs IDIpKTsKICBBU1NFUlRfRVEgKGNmICgxMSwgMykgLSAzLCBjZiAoMiwgMykpOwogIEFTU0VSVF9F USAoMyAtIGNmICg3LCAzKSwgY2YgKDIsIDMpKTsKICBBU1NFUlRfRVEgKDMgLSBjZiAoMTAsIDMp LCAwKTsKCiAgQVNTRVJUX0VRIChjZiAoMiwgMykgKiA1LCBjZiAoMTAsIDMpKTsKICBBU1NFUlRf RVEgKDE0ICogY2YgKDExLCAyMSksIGNmICgyMiwgMykpOwoKICBBU1NFUlRfVFJVRSAoY2YgKDQs IDE1KSA8IGNmICg1LCAxNSkpOwogIEFTU0VSVF9GQUxTRSAoY2YgKDUsIDE1KSA8IGNmICg1LCAx NSkpOwogIEFTU0VSVF9GQUxTRSAoY2YgKDYsIDE1KSA8IGNmICg1LCAxNSkpOwogIEFTU0VSVF9U UlVFIChjZiAoMSwgMykgPCBjZiAoMiwgNSkpOwogIEFTU0VSVF9UUlVFIChjZiAoMSwgMTIpIDwg Y2YgKDEsIDYpKTsKICBBU1NFUlRfRkFMU0UgKGNmICg1LCAzKSA8IGNmICg1LCAzKSk7CiAgQVNT RVJUX1RSVUUgKGNmICgyMzksIDI0MCkgPCAxKTsKICBBU1NFUlRfRkFMU0UgKGNmICgyNDAsIDI0 MCkgPCAxKTsKICBBU1NFUlRfRkFMU0UgKGNmICgyNDEsIDI0MCkgPCAxKTsKICBBU1NFUlRfRkFM U0UgKDIgPCBjZiAoMjA3LCAxMDQpKTsKICBBU1NFUlRfRkFMU0UgKDIgPCBjZiAoMjA4LCAxMDQp KTsKICBBU1NFUlRfVFJVRSAoMiA8IGNmICgyMDksIDEwNCkpOwoKICBBU1NFUlRfVFJVRSAoY2Yg KDQsIDE1KSA8IGNmICg1LCAxNSkpOwogIEFTU0VSVF9GQUxTRSAoY2YgKDUsIDE1KSA8IGNmICg1 LCAxNSkpOwogIEFTU0VSVF9GQUxTRSAoY2YgKDYsIDE1KSA8IGNmICg1LCAxNSkpOwogIEFTU0VS VF9UUlVFIChjZiAoMSwgMykgPCBjZiAoMiwgNSkpOwogIEFTU0VSVF9UUlVFIChjZiAoMSwgMTIp IDwgY2YgKDEsIDYpKTsKICBBU1NFUlRfRkFMU0UgKGNmICg1LCAzKSA8IGNmICg1LCAzKSk7CiAg QVNTRVJUX1RSVUUgKGNmICgyMzksIDI0MCkgPCAxKTsKICBBU1NFUlRfRkFMU0UgKGNmICgyNDAs IDI0MCkgPCAxKTsKICBBU1NFUlRfRkFMU0UgKGNmICgyNDEsIDI0MCkgPCAxKTsKICBBU1NFUlRf RkFMU0UgKDIgPCBjZiAoMjA3LCAxMDQpKTsKICBBU1NFUlRfRkFMU0UgKDIgPCBjZiAoMjA4LCAx MDQpKTsKICBBU1NFUlRfVFJVRSAoMiA8IGNmICgyMDksIDEwNCkpOwoKICBBU1NFUlRfRkFMU0Ug KGNmICg0LCAxNSkgPj0gY2YgKDUsIDE1KSk7CiAgQVNTRVJUX1RSVUUgKGNmICg1LCAxNSkgPj0g Y2YgKDUsIDE1KSk7CiAgQVNTRVJUX1RSVUUgKGNmICg2LCAxNSkgPj0gY2YgKDUsIDE1KSk7CiAg QVNTRVJUX0ZBTFNFIChjZiAoMSwgMykgPj0gY2YgKDIsIDUpKTsKICBBU1NFUlRfRkFMU0UgKGNm ICgxLCAxMikgPj0gY2YgKDEsIDYpKTsKICBBU1NFUlRfVFJVRSAoY2YgKDUsIDMpID49IGNmICg1 LCAzKSk7CiAgQVNTRVJUX0ZBTFNFIChjZiAoMjM5LCAyNDApID49IDEpOwogIEFTU0VSVF9UUlVF IChjZiAoMjQwLCAyNDApID49IDEpOwogIEFTU0VSVF9UUlVFIChjZiAoMjQxLCAyNDApID49IDEp OwogIEFTU0VSVF9UUlVFICgyID49IGNmICgyMDcsIDEwNCkpOwogIEFTU0VSVF9UUlVFICgyID49 IGNmICgyMDgsIDEwNCkpOwogIEFTU0VSVF9GQUxTRSAoMiA+PSBjZiAoMjA5LCAxMDQpKTsKCiAg QVNTRVJUX0ZBTFNFIChjZiAoNCwgMTUpID4gY2YgKDUsIDE1KSk7CiAgQVNTRVJUX0ZBTFNFIChj ZiAoNSwgMTUpID4gY2YgKDUsIDE1KSk7CiAgQVNTRVJUX1RSVUUgKGNmICg2LCAxNSkgPiBjZiAo NSwgMTUpKTsKICBBU1NFUlRfRkFMU0UgKGNmICgxLCAzKSA+IGNmICgyLCA1KSk7CiAgQVNTRVJU X0ZBTFNFIChjZiAoMSwgMTIpID4gY2YgKDEsIDYpKTsKICBBU1NFUlRfRkFMU0UgKGNmICg1LCAz KSA+IGNmICg1LCAzKSk7CiAgQVNTRVJUX0ZBTFNFIChjZiAoMjM5LCAyNDApID4gMSk7CiAgQVNT RVJUX0ZBTFNFIChjZiAoMjQwLCAyNDApID4gMSk7CiAgQVNTRVJUX1RSVUUgKGNmICgyNDEsIDI0 MCkgPiAxKTsKICBBU1NFUlRfVFJVRSAoMiA+IGNmICgyMDcsIDEwNCkpOwogIEFTU0VSVF9GQUxT RSAoMiA+IGNmICgyMDgsIDEwNCkpOwogIEFTU0VSVF9GQUxTRSAoMiA+IGNmICgyMDksIDEwNCkp OwoKICBBU1NFUlRfRVEgKGNmICgxLCAyKS5jZWlsICgpLCAxKTsKICBBU1NFUlRfRVEgKGNmICgx MSwgNykuY2VpbCAoKSwgMik7CiAgQVNTRVJUX0VRIChjZiAoMjAsIDEpLmNlaWwgKCksIDIwKTsK ICBBU1NFUlRfRVEgKChjZiAoMHhmZmZmZmZmZCkgKyAxKS5jZWlsICgpLCAweGZmZmZmZmZlKTsK ICBBU1NFUlRfRVEgKChjZiAoMHhmZmZmZmZmZCkgKyAyKS5jZWlsICgpLCAweGZmZmZmZmZmKTsK ICBBU1NFUlRfRVEgKChjZiAoMHhmZmZmZmZmZCkgKyAzKS5jZWlsICgpLCAweGZmZmZmZmZmKTsK ICBBU1NFUlRfRVEgKChjZiAoMHg3ZmZmZmZmZikgKiAyKS5jZWlsICgpLCAweGZmZmZmZmZlKTsK ICBBU1NFUlRfRVEgKChjZiAoMHg4MDAwMDAwMCkgKiAyKS5jZWlsICgpLCAweGZmZmZmZmZmKTsK CiAgQVNTRVJUX0VRIChjZiAoMSwgMikuYXNfZG91YmxlICgpLCAwLjUpOwp9CgovKiBSdW4gYWxs IHRhcmdldC1zcGVjaWZpYyBzZWxmdGVzdHMuICAqLwoKc3RhdGljIHZvaWQKYWFyY2g2NF9ydW5f c2VsZnRlc3RzICh2b2lkKQp7CiAgYWFyY2g2NF90ZXN0X2xvYWRpbmdfZnVsbF9kdW1wICgpOwog IGFhcmNoNjRfdGVzdF9mcmFjdGlvbmFsX2Nvc3QgKCk7Cn0KCn0gLy8gbmFtZXNwYWNlIHNlbGZ0 ZXN0CgojZW5kaWYgLyogI2lmIENIRUNLSU5HX1AgKi8KCiN1bmRlZiBUQVJHRVRfU1RBQ0tfUFJP VEVDVF9HVUFSRAojZGVmaW5lIFRBUkdFVF9TVEFDS19QUk9URUNUX0dVQVJEIGFhcmNoNjRfc3Rh Y2tfcHJvdGVjdF9ndWFyZAoKI3VuZGVmIFRBUkdFVF9BRERSRVNTX0NPU1QKI2RlZmluZSBUQVJH RVRfQUREUkVTU19DT1NUIGFhcmNoNjRfYWRkcmVzc19jb3N0CgovKiBUaGlzIGhvb2sgd2lsbCBk ZXRlcm1pbmVzIHdoZXRoZXIgdW5uYW1lZCBiaXRmaWVsZHMgYWZmZWN0IHRoZSBhbGlnbm1lbnQK ICAgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlLiAgVGhlIGhvb2sgcmV0dXJucyB0cnVlIGlm IHRoZSBzdHJ1Y3R1cmUKICAgc2hvdWxkIGluaGVyaXQgdGhlIGFsaWdubWVudCByZXF1aXJlbWVu dHMgb2YgYW4gdW5uYW1lZCBiaXRmaWVsZCdzCiAgIHR5cGUuICAqLwojdW5kZWYgVEFSR0VUX0FM SUdOX0FOT05fQklURklFTEQKI2RlZmluZSBUQVJHRVRfQUxJR05fQU5PTl9CSVRGSUVMRCBob29r X2Jvb2xfdm9pZF90cnVlCgojdW5kZWYgVEFSR0VUX0FTTV9BTElHTkVEX0RJX09QCiNkZWZpbmUg VEFSR0VUX0FTTV9BTElHTkVEX0RJX09QICJcdC54d29yZFx0IgoKI3VuZGVmIFRBUkdFVF9BU01f QUxJR05FRF9ISV9PUAojZGVmaW5lIFRBUkdFVF9BU01fQUxJR05FRF9ISV9PUCAiXHQuaHdvcmRc dCIKCiN1bmRlZiBUQVJHRVRfQVNNX0FMSUdORURfU0lfT1AKI2RlZmluZSBUQVJHRVRfQVNNX0FM SUdORURfU0lfT1AgIlx0LndvcmRcdCIKCiN1bmRlZiBUQVJHRVRfQVNNX0NBTl9PVVRQVVRfTUlf VEhVTksKI2RlZmluZSBUQVJHRVRfQVNNX0NBTl9PVVRQVVRfTUlfVEhVTksgXAogIGhvb2tfYm9v bF9jb25zdF90cmVlX2h3aV9od2lfY29uc3RfdHJlZV90cnVlCgojdW5kZWYgVEFSR0VUX0FTTV9G SUxFX1NUQVJUCiNkZWZpbmUgVEFSR0VUX0FTTV9GSUxFX1NUQVJUIGFhcmNoNjRfc3RhcnRfZmls ZQoKI3VuZGVmIFRBUkdFVF9BU01fT1VUUFVUX01JX1RIVU5LCiNkZWZpbmUgVEFSR0VUX0FTTV9P VVRQVVRfTUlfVEhVTksgYWFyY2g2NF9vdXRwdXRfbWlfdGh1bmsKCiN1bmRlZiBUQVJHRVRfQVNN X1NFTEVDVF9SVFhfU0VDVElPTgojZGVmaW5lIFRBUkdFVF9BU01fU0VMRUNUX1JUWF9TRUNUSU9O IGFhcmNoNjRfc2VsZWN0X3J0eF9zZWN0aW9uCgojdW5kZWYgVEFSR0VUX0FTTV9UUkFNUE9MSU5F X1RFTVBMQVRFCiNkZWZpbmUgVEFSR0VUX0FTTV9UUkFNUE9MSU5FX1RFTVBMQVRFIGFhcmNoNjRf YXNtX3RyYW1wb2xpbmVfdGVtcGxhdGUKCiN1bmRlZiBUQVJHRVRfQVNNX1BSSU5UX1BBVENIQUJM RV9GVU5DVElPTl9FTlRSWQojZGVmaW5lIFRBUkdFVF9BU01fUFJJTlRfUEFUQ0hBQkxFX0ZVTkNU SU9OX0VOVFJZIGFhcmNoNjRfcHJpbnRfcGF0Y2hhYmxlX2Z1bmN0aW9uX2VudHJ5CgojdW5kZWYg VEFSR0VUX0JVSUxEX0JVSUxUSU5fVkFfTElTVAojZGVmaW5lIFRBUkdFVF9CVUlMRF9CVUlMVElO X1ZBX0xJU1QgYWFyY2g2NF9idWlsZF9idWlsdGluX3ZhX2xpc3QKCiN1bmRlZiBUQVJHRVRfQ0FM TEVFX0NPUElFUwojZGVmaW5lIFRBUkdFVF9DQUxMRUVfQ09QSUVTIGhvb2tfYm9vbF9DVU1VTEFU SVZFX0FSR1NfYXJnX2luZm9fZmFsc2UKCiN1bmRlZiBUQVJHRVRfQ0FOX0VMSU1JTkFURQojZGVm aW5lIFRBUkdFVF9DQU5fRUxJTUlOQVRFIGFhcmNoNjRfY2FuX2VsaW1pbmF0ZQoKI3VuZGVmIFRB UkdFVF9DQU5fSU5MSU5FX1AKI2RlZmluZSBUQVJHRVRfQ0FOX0lOTElORV9QIGFhcmNoNjRfY2Fu X2lubGluZV9wCgojdW5kZWYgVEFSR0VUX0NBTk5PVF9GT1JDRV9DT05TVF9NRU0KI2RlZmluZSBU QVJHRVRfQ0FOTk9UX0ZPUkNFX0NPTlNUX01FTSBhYXJjaDY0X2Nhbm5vdF9mb3JjZV9jb25zdF9t ZW0KCiN1bmRlZiBUQVJHRVRfQ0FTRV9WQUxVRVNfVEhSRVNIT0xECiNkZWZpbmUgVEFSR0VUX0NB U0VfVkFMVUVTX1RIUkVTSE9MRCBhYXJjaDY0X2Nhc2VfdmFsdWVzX3RocmVzaG9sZAoKI3VuZGVm IFRBUkdFVF9DT05ESVRJT05BTF9SRUdJU1RFUl9VU0FHRQojZGVmaW5lIFRBUkdFVF9DT05ESVRJ T05BTF9SRUdJU1RFUl9VU0FHRSBhYXJjaDY0X2NvbmRpdGlvbmFsX3JlZ2lzdGVyX3VzYWdlCgoj dW5kZWYgVEFSR0VUX01FTUJFUl9UWVBFX0ZPUkNFU19CTEsKI2RlZmluZSBUQVJHRVRfTUVNQkVS X1RZUEVfRk9SQ0VTX0JMSyBhYXJjaDY0X21lbWJlcl90eXBlX2ZvcmNlc19ibGsKCi8qIE9ubHkg dGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBpcyB1c2VkIGZvciBpbml0aWFsaXphdGlvbiBndWFy ZAogICB2YXJpYWJsZXMuICAqLwojdW5kZWYgVEFSR0VUX0NYWF9HVUFSRF9NQVNLX0JJVAojZGVm aW5lIFRBUkdFVF9DWFhfR1VBUkRfTUFTS19CSVQgaG9va19ib29sX3ZvaWRfdHJ1ZQoKI3VuZGVm IFRBUkdFVF9DX01PREVfRk9SX1NVRkZJWAojZGVmaW5lIFRBUkdFVF9DX01PREVfRk9SX1NVRkZJ WCBhYXJjaDY0X2NfbW9kZV9mb3Jfc3VmZml4CgojaWZkZWYgVEFSR0VUX0JJR19FTkRJQU5fREVG QVVMVAojdW5kZWYgIFRBUkdFVF9ERUZBVUxUX1RBUkdFVF9GTEFHUwojZGVmaW5lIFRBUkdFVF9E RUZBVUxUX1RBUkdFVF9GTEFHUyAoTUFTS19CSUdfRU5EKQojZW5kaWYKCiN1bmRlZiBUQVJHRVRf Q0xBU1NfTUFYX05SRUdTCiNkZWZpbmUgVEFSR0VUX0NMQVNTX01BWF9OUkVHUyBhYXJjaDY0X2Ns YXNzX21heF9ucmVncwoKI3VuZGVmIFRBUkdFVF9CVUlMVElOX0RFQ0wKI2RlZmluZSBUQVJHRVRf QlVJTFRJTl9ERUNMIGFhcmNoNjRfYnVpbHRpbl9kZWNsCgojdW5kZWYgVEFSR0VUX0JVSUxUSU5f UkVDSVBST0NBTAojZGVmaW5lIFRBUkdFVF9CVUlMVElOX1JFQ0lQUk9DQUwgYWFyY2g2NF9idWls dGluX3JlY2lwcm9jYWwKCiN1bmRlZiBUQVJHRVRfQ19FWENFU1NfUFJFQ0lTSU9OCiNkZWZpbmUg VEFSR0VUX0NfRVhDRVNTX1BSRUNJU0lPTiBhYXJjaDY0X2V4Y2Vzc19wcmVjaXNpb24KCiN1bmRl ZiAgVEFSR0VUX0VYUEFORF9CVUlMVElOCiNkZWZpbmUgVEFSR0VUX0VYUEFORF9CVUlMVElOIGFh cmNoNjRfZXhwYW5kX2J1aWx0aW4KCiN1bmRlZiBUQVJHRVRfRVhQQU5EX0JVSUxUSU5fVkFfU1RB UlQKI2RlZmluZSBUQVJHRVRfRVhQQU5EX0JVSUxUSU5fVkFfU1RBUlQgYWFyY2g2NF9leHBhbmRf YnVpbHRpbl92YV9zdGFydAoKI3VuZGVmIFRBUkdFVF9GT0xEX0JVSUxUSU4KI2RlZmluZSBUQVJH RVRfRk9MRF9CVUlMVElOIGFhcmNoNjRfZm9sZF9idWlsdGluCgojdW5kZWYgVEFSR0VUX0ZVTkNU SU9OX0FSRwojZGVmaW5lIFRBUkdFVF9GVU5DVElPTl9BUkcgYWFyY2g2NF9mdW5jdGlvbl9hcmcK CiN1bmRlZiBUQVJHRVRfRlVOQ1RJT05fQVJHX0FEVkFOQ0UKI2RlZmluZSBUQVJHRVRfRlVOQ1RJ T05fQVJHX0FEVkFOQ0UgYWFyY2g2NF9mdW5jdGlvbl9hcmdfYWR2YW5jZQoKI3VuZGVmIFRBUkdF VF9GVU5DVElPTl9BUkdfQk9VTkRBUlkKI2RlZmluZSBUQVJHRVRfRlVOQ1RJT05fQVJHX0JPVU5E QVJZIGFhcmNoNjRfZnVuY3Rpb25fYXJnX2JvdW5kYXJ5CgojdW5kZWYgVEFSR0VUX0ZVTkNUSU9O X0FSR19QQURESU5HCiNkZWZpbmUgVEFSR0VUX0ZVTkNUSU9OX0FSR19QQURESU5HIGFhcmNoNjRf ZnVuY3Rpb25fYXJnX3BhZGRpbmcKCiN1bmRlZiBUQVJHRVRfR0VUX1JBV19SRVNVTFRfTU9ERQoj ZGVmaW5lIFRBUkdFVF9HRVRfUkFXX1JFU1VMVF9NT0RFIGFhcmNoNjRfZ2V0X3JlZ19yYXdfbW9k ZQojdW5kZWYgVEFSR0VUX0dFVF9SQVdfQVJHX01PREUKI2RlZmluZSBUQVJHRVRfR0VUX1JBV19B UkdfTU9ERSBhYXJjaDY0X2dldF9yZWdfcmF3X21vZGUKCiN1bmRlZiBUQVJHRVRfRlVOQ1RJT05f T0tfRk9SX1NJQkNBTEwKI2RlZmluZSBUQVJHRVRfRlVOQ1RJT05fT0tfRk9SX1NJQkNBTEwgYWFy Y2g2NF9mdW5jdGlvbl9va19mb3Jfc2liY2FsbAoKI3VuZGVmIFRBUkdFVF9GVU5DVElPTl9WQUxV RQojZGVmaW5lIFRBUkdFVF9GVU5DVElPTl9WQUxVRSBhYXJjaDY0X2Z1bmN0aW9uX3ZhbHVlCgoj dW5kZWYgVEFSR0VUX0ZVTkNUSU9OX1ZBTFVFX1JFR05PX1AKI2RlZmluZSBUQVJHRVRfRlVOQ1RJ T05fVkFMVUVfUkVHTk9fUCBhYXJjaDY0X2Z1bmN0aW9uX3ZhbHVlX3JlZ25vX3AKCiN1bmRlZiBU QVJHRVRfR0lNUExFX0ZPTERfQlVJTFRJTgojZGVmaW5lIFRBUkdFVF9HSU1QTEVfRk9MRF9CVUlM VElOIGFhcmNoNjRfZ2ltcGxlX2ZvbGRfYnVpbHRpbgoKI3VuZGVmIFRBUkdFVF9HSU1QTElGWV9W QV9BUkdfRVhQUgojZGVmaW5lIFRBUkdFVF9HSU1QTElGWV9WQV9BUkdfRVhQUiBhYXJjaDY0X2dp bXBsaWZ5X3ZhX2FyZ19leHByCgojdW5kZWYgIFRBUkdFVF9JTklUX0JVSUxUSU5TCiNkZWZpbmUg VEFSR0VUX0lOSVRfQlVJTFRJTlMgIGFhcmNoNjRfaW5pdF9idWlsdGlucwoKI3VuZGVmIFRBUkdF VF9JUkFfQ0hBTkdFX1BTRVVET19BTExPQ05PX0NMQVNTCiNkZWZpbmUgVEFSR0VUX0lSQV9DSEFO R0VfUFNFVURPX0FMTE9DTk9fQ0xBU1MgXAogIGFhcmNoNjRfaXJhX2NoYW5nZV9wc2V1ZG9fYWxs b2Nub19jbGFzcwoKI3VuZGVmIFRBUkdFVF9MRUdJVElNQVRFX0FERFJFU1NfUAojZGVmaW5lIFRB UkdFVF9MRUdJVElNQVRFX0FERFJFU1NfUCBhYXJjaDY0X2xlZ2l0aW1hdGVfYWRkcmVzc19ob29r X3AKCiN1bmRlZiBUQVJHRVRfTEVHSVRJTUFURV9DT05TVEFOVF9QCiNkZWZpbmUgVEFSR0VUX0xF R0lUSU1BVEVfQ09OU1RBTlRfUCBhYXJjaDY0X2xlZ2l0aW1hdGVfY29uc3RhbnRfcAoKI3VuZGVm IFRBUkdFVF9MRUdJVElNSVpFX0FERFJFU1NfRElTUExBQ0VNRU5UCiNkZWZpbmUgVEFSR0VUX0xF R0lUSU1JWkVfQUREUkVTU19ESVNQTEFDRU1FTlQgXAogIGFhcmNoNjRfbGVnaXRpbWl6ZV9hZGRy ZXNzX2Rpc3BsYWNlbWVudAoKI3VuZGVmIFRBUkdFVF9MSUJHQ0NfQ01QX1JFVFVSTl9NT0RFCiNk ZWZpbmUgVEFSR0VUX0xJQkdDQ19DTVBfUkVUVVJOX01PREUgYWFyY2g2NF9saWJnY2NfY21wX3Jl dHVybl9tb2RlCgojdW5kZWYgVEFSR0VUX0xJQkdDQ19GTE9BVElOR19NT0RFX1NVUFBPUlRFRF9Q CiNkZWZpbmUgVEFSR0VUX0xJQkdDQ19GTE9BVElOR19NT0RFX1NVUFBPUlRFRF9QIFwKYWFyY2g2 NF9saWJnY2NfZmxvYXRpbmdfbW9kZV9zdXBwb3J0ZWRfcAoKI3VuZGVmIFRBUkdFVF9NQU5HTEVf VFlQRQojZGVmaW5lIFRBUkdFVF9NQU5HTEVfVFlQRSBhYXJjaDY0X21hbmdsZV90eXBlCgojdW5k ZWYgVEFSR0VUX0lOVkFMSURfQklOQVJZX09QCiNkZWZpbmUgVEFSR0VUX0lOVkFMSURfQklOQVJZ X09QIGFhcmNoNjRfaW52YWxpZF9iaW5hcnlfb3AKCiN1bmRlZiBUQVJHRVRfVkVSSUZZX1RZUEVf Q09OVEVYVAojZGVmaW5lIFRBUkdFVF9WRVJJRllfVFlQRV9DT05URVhUIGFhcmNoNjRfdmVyaWZ5 X3R5cGVfY29udGV4dAoKI3VuZGVmIFRBUkdFVF9NRU1PUllfTU9WRV9DT1NUCiNkZWZpbmUgVEFS R0VUX01FTU9SWV9NT1ZFX0NPU1QgYWFyY2g2NF9tZW1vcnlfbW92ZV9jb3N0CgojdW5kZWYgVEFS R0VUX01JTl9ESVZJU0lPTlNfRk9SX1JFQ0lQX01VTAojZGVmaW5lIFRBUkdFVF9NSU5fRElWSVNJ T05TX0ZPUl9SRUNJUF9NVUwgYWFyY2g2NF9taW5fZGl2aXNpb25zX2Zvcl9yZWNpcF9tdWwKCiN1 bmRlZiBUQVJHRVRfTVVTVF9QQVNTX0lOX1NUQUNLCiNkZWZpbmUgVEFSR0VUX01VU1RfUEFTU19J Tl9TVEFDSyBtdXN0X3Bhc3NfaW5fc3RhY2tfdmFyX3NpemUKCi8qIFRoaXMgdGFyZ2V0IGhvb2sg c2hvdWxkIHJldHVybiB0cnVlIGlmIGFjY2Vzc2VzIHRvIHZvbGF0aWxlIGJpdGZpZWxkcwogICBz aG91bGQgdXNlIHRoZSBuYXJyb3dlc3QgbW9kZSBwb3NzaWJsZS4gIEl0IHNob3VsZCByZXR1cm4g ZmFsc2UgaWYgdGhlc2UKICAgYWNjZXNzZXMgc2hvdWxkIHVzZSB0aGUgYml0ZmllbGQgY29udGFp bmVyIHR5cGUuICAqLwojdW5kZWYgVEFSR0VUX05BUlJPV19WT0xBVElMRV9CSVRGSUVMRAojZGVm aW5lIFRBUkdFVF9OQVJST1dfVk9MQVRJTEVfQklURklFTEQgaG9va19ib29sX3ZvaWRfZmFsc2UK CiN1bmRlZiAgVEFSR0VUX09QVElPTl9PVkVSUklERQojZGVmaW5lIFRBUkdFVF9PUFRJT05fT1ZF UlJJREUgYWFyY2g2NF9vdmVycmlkZV9vcHRpb25zCgojdW5kZWYgVEFSR0VUX09WRVJSSURFX09Q VElPTlNfQUZURVJfQ0hBTkdFCiNkZWZpbmUgVEFSR0VUX09WRVJSSURFX09QVElPTlNfQUZURVJf Q0hBTkdFIFwKICBhYXJjaDY0X292ZXJyaWRlX29wdGlvbnNfYWZ0ZXJfY2hhbmdlCgojdW5kZWYg VEFSR0VUX09GRkxPQURfT1BUSU9OUwojZGVmaW5lIFRBUkdFVF9PRkZMT0FEX09QVElPTlMgYWFy Y2g2NF9vZmZsb2FkX29wdGlvbnMKCiN1bmRlZiBUQVJHRVRfT1BUSU9OX1JFU1RPUkUKI2RlZmlu ZSBUQVJHRVRfT1BUSU9OX1JFU1RPUkUgYWFyY2g2NF9vcHRpb25fcmVzdG9yZQoKI3VuZGVmIFRB UkdFVF9PUFRJT05fUFJJTlQKI2RlZmluZSBUQVJHRVRfT1BUSU9OX1BSSU5UIGFhcmNoNjRfb3B0 aW9uX3ByaW50CgojdW5kZWYgVEFSR0VUX09QVElPTl9WQUxJRF9BVFRSSUJVVEVfUAojZGVmaW5l IFRBUkdFVF9PUFRJT05fVkFMSURfQVRUUklCVVRFX1AgYWFyY2g2NF9vcHRpb25fdmFsaWRfYXR0 cmlidXRlX3AKCiN1bmRlZiBUQVJHRVRfU0VUX0NVUlJFTlRfRlVOQ1RJT04KI2RlZmluZSBUQVJH RVRfU0VUX0NVUlJFTlRfRlVOQ1RJT04gYWFyY2g2NF9zZXRfY3VycmVudF9mdW5jdGlvbgoKI3Vu ZGVmIFRBUkdFVF9QQVNTX0JZX1JFRkVSRU5DRQojZGVmaW5lIFRBUkdFVF9QQVNTX0JZX1JFRkVS RU5DRSBhYXJjaDY0X3Bhc3NfYnlfcmVmZXJlbmNlCgojdW5kZWYgVEFSR0VUX1BSRUZFUlJFRF9S RUxPQURfQ0xBU1MKI2RlZmluZSBUQVJHRVRfUFJFRkVSUkVEX1JFTE9BRF9DTEFTUyBhYXJjaDY0 X3ByZWZlcnJlZF9yZWxvYWRfY2xhc3MKCiN1bmRlZiBUQVJHRVRfU0NIRURfUkVBU1NPQ0lBVElP Tl9XSURUSAojZGVmaW5lIFRBUkdFVF9TQ0hFRF9SRUFTU09DSUFUSU9OX1dJRFRIIGFhcmNoNjRf cmVhc3NvY2lhdGlvbl93aWR0aAoKI3VuZGVmIFRBUkdFVF9EV0FSRl9GUkFNRV9SRUdfTU9ERQoj ZGVmaW5lIFRBUkdFVF9EV0FSRl9GUkFNRV9SRUdfTU9ERSBhYXJjaDY0X2R3YXJmX2ZyYW1lX3Jl Z19tb2RlCgojdW5kZWYgVEFSR0VUX1BST01PVEVEX1RZUEUKI2RlZmluZSBUQVJHRVRfUFJPTU9U RURfVFlQRSBhYXJjaDY0X3Byb21vdGVkX3R5cGUKCiN1bmRlZiBUQVJHRVRfU0VDT05EQVJZX1JF TE9BRAojZGVmaW5lIFRBUkdFVF9TRUNPTkRBUllfUkVMT0FEIGFhcmNoNjRfc2Vjb25kYXJ5X3Jl bG9hZAoKI3VuZGVmIFRBUkdFVF9TRUNPTkRBUllfTUVNT1JZX05FRURFRAojZGVmaW5lIFRBUkdF VF9TRUNPTkRBUllfTUVNT1JZX05FRURFRCBhYXJjaDY0X3NlY29uZGFyeV9tZW1vcnlfbmVlZGVk CgojdW5kZWYgVEFSR0VUX1NISUZUX1RSVU5DQVRJT05fTUFTSwojZGVmaW5lIFRBUkdFVF9TSElG VF9UUlVOQ0FUSU9OX01BU0sgYWFyY2g2NF9zaGlmdF90cnVuY2F0aW9uX21hc2sKCiN1bmRlZiBU QVJHRVRfU0VUVVBfSU5DT01JTkdfVkFSQVJHUwojZGVmaW5lIFRBUkdFVF9TRVRVUF9JTkNPTUlO R19WQVJBUkdTIGFhcmNoNjRfc2V0dXBfaW5jb21pbmdfdmFyYXJncwoKI3VuZGVmIFRBUkdFVF9T VFJVQ1RfVkFMVUVfUlRYCiNkZWZpbmUgVEFSR0VUX1NUUlVDVF9WQUxVRV9SVFggICBhYXJjaDY0 X3N0cnVjdF92YWx1ZV9ydHgKCiN1bmRlZiBUQVJHRVRfUkVHSVNURVJfTU9WRV9DT1NUCiNkZWZp bmUgVEFSR0VUX1JFR0lTVEVSX01PVkVfQ09TVCBhYXJjaDY0X3JlZ2lzdGVyX21vdmVfY29zdAoK I3VuZGVmIFRBUkdFVF9SRVRVUk5fSU5fTUVNT1JZCiNkZWZpbmUgVEFSR0VUX1JFVFVSTl9JTl9N RU1PUlkgYWFyY2g2NF9yZXR1cm5faW5fbWVtb3J5CgojdW5kZWYgVEFSR0VUX1JFVFVSTl9JTl9N U0IKI2RlZmluZSBUQVJHRVRfUkVUVVJOX0lOX01TQiBhYXJjaDY0X3JldHVybl9pbl9tc2IKCiN1 bmRlZiBUQVJHRVRfUlRYX0NPU1RTCiNkZWZpbmUgVEFSR0VUX1JUWF9DT1NUUyBhYXJjaDY0X3J0 eF9jb3N0c193cmFwcGVyCgojdW5kZWYgVEFSR0VUX1NDQUxBUl9NT0RFX1NVUFBPUlRFRF9QCiNk ZWZpbmUgVEFSR0VUX1NDQUxBUl9NT0RFX1NVUFBPUlRFRF9QIGFhcmNoNjRfc2NhbGFyX21vZGVf c3VwcG9ydGVkX3AKCiN1bmRlZiBUQVJHRVRfU0NIRURfSVNTVUVfUkFURQojZGVmaW5lIFRBUkdF VF9TQ0hFRF9JU1NVRV9SQVRFIGFhcmNoNjRfc2NoZWRfaXNzdWVfcmF0ZQoKI3VuZGVmIFRBUkdF VF9TQ0hFRF9WQVJJQUJMRV9JU1NVRQojZGVmaW5lIFRBUkdFVF9TQ0hFRF9WQVJJQUJMRV9JU1NV RSBhYXJjaDY0X3NjaGVkX3ZhcmlhYmxlX2lzc3VlCgojdW5kZWYgVEFSR0VUX1NDSEVEX0ZJUlNU X0NZQ0xFX01VTFRJUEFTU19ERkFfTE9PS0FIRUFECiNkZWZpbmUgVEFSR0VUX1NDSEVEX0ZJUlNU X0NZQ0xFX01VTFRJUEFTU19ERkFfTE9PS0FIRUFEIFwKICBhYXJjaDY0X3NjaGVkX2ZpcnN0X2N5 Y2xlX211bHRpcGFzc19kZmFfbG9va2FoZWFkCgojdW5kZWYgVEFSR0VUX1NDSEVEX0ZJUlNUX0NZ Q0xFX01VTFRJUEFTU19ERkFfTE9PS0FIRUFEX0dVQVJECiNkZWZpbmUgVEFSR0VUX1NDSEVEX0ZJ UlNUX0NZQ0xFX01VTFRJUEFTU19ERkFfTE9PS0FIRUFEX0dVQVJEIFwKICBhYXJjaDY0X2ZpcnN0 X2N5Y2xlX211bHRpcGFzc19kZmFfbG9va2FoZWFkX2d1YXJkCgojdW5kZWYgVEFSR0VUX1NIUklO S19XUkFQX0dFVF9TRVBBUkFURV9DT01QT05FTlRTCiNkZWZpbmUgVEFSR0VUX1NIUklOS19XUkFQ X0dFVF9TRVBBUkFURV9DT01QT05FTlRTIFwKICBhYXJjaDY0X2dldF9zZXBhcmF0ZV9jb21wb25l bnRzCgojdW5kZWYgVEFSR0VUX1NIUklOS19XUkFQX0NPTVBPTkVOVFNfRk9SX0JCCiNkZWZpbmUg VEFSR0VUX1NIUklOS19XUkFQX0NPTVBPTkVOVFNfRk9SX0JCIFwKICBhYXJjaDY0X2NvbXBvbmVu dHNfZm9yX2JiCgojdW5kZWYgVEFSR0VUX1NIUklOS19XUkFQX0RJU1FVQUxJRllfQ09NUE9ORU5U UwojZGVmaW5lIFRBUkdFVF9TSFJJTktfV1JBUF9ESVNRVUFMSUZZX0NPTVBPTkVOVFMgXAogIGFh cmNoNjRfZGlzcXVhbGlmeV9jb21wb25lbnRzCgojdW5kZWYgVEFSR0VUX1NIUklOS19XUkFQX0VN SVRfUFJPTE9HVUVfQ09NUE9ORU5UUwojZGVmaW5lIFRBUkdFVF9TSFJJTktfV1JBUF9FTUlUX1BS T0xPR1VFX0NPTVBPTkVOVFMgXAogIGFhcmNoNjRfZW1pdF9wcm9sb2d1ZV9jb21wb25lbnRzCgoj dW5kZWYgVEFSR0VUX1NIUklOS19XUkFQX0VNSVRfRVBJTE9HVUVfQ09NUE9ORU5UUwojZGVmaW5l IFRBUkdFVF9TSFJJTktfV1JBUF9FTUlUX0VQSUxPR1VFX0NPTVBPTkVOVFMgXAogIGFhcmNoNjRf ZW1pdF9lcGlsb2d1ZV9jb21wb25lbnRzCgojdW5kZWYgVEFSR0VUX1NIUklOS19XUkFQX1NFVF9I QU5ETEVEX0NPTVBPTkVOVFMKI2RlZmluZSBUQVJHRVRfU0hSSU5LX1dSQVBfU0VUX0hBTkRMRURf Q09NUE9ORU5UUyBcCiAgYWFyY2g2NF9zZXRfaGFuZGxlZF9jb21wb25lbnRzCgojdW5kZWYgVEFS R0VUX1RSQU1QT0xJTkVfSU5JVAojZGVmaW5lIFRBUkdFVF9UUkFNUE9MSU5FX0lOSVQgYWFyY2g2 NF90cmFtcG9saW5lX2luaXQKCiN1bmRlZiBUQVJHRVRfVVNFX0JMT0NLU19GT1JfQ09OU1RBTlRf UAojZGVmaW5lIFRBUkdFVF9VU0VfQkxPQ0tTX0ZPUl9DT05TVEFOVF9QIGFhcmNoNjRfdXNlX2Js b2Nrc19mb3JfY29uc3RhbnRfcAoKI3VuZGVmIFRBUkdFVF9WRUNUT1JfTU9ERV9TVVBQT1JURURf UAojZGVmaW5lIFRBUkdFVF9WRUNUT1JfTU9ERV9TVVBQT1JURURfUCBhYXJjaDY0X3ZlY3Rvcl9t b2RlX3N1cHBvcnRlZF9wCgojdW5kZWYgVEFSR0VUX0NPTVBBVElCTEVfVkVDVE9SX1RZUEVTX1AK I2RlZmluZSBUQVJHRVRfQ09NUEFUSUJMRV9WRUNUT1JfVFlQRVNfUCBhYXJjaDY0X2NvbXBhdGli bGVfdmVjdG9yX3R5cGVzX3AKCiN1bmRlZiBUQVJHRVRfVkVDVE9SSVpFX1NVUFBPUlRfVkVDVE9S X01JU0FMSUdOTUVOVAojZGVmaW5lIFRBUkdFVF9WRUNUT1JJWkVfU1VQUE9SVF9WRUNUT1JfTUlT QUxJR05NRU5UIFwKICBhYXJjaDY0X2J1aWx0aW5fc3VwcG9ydF92ZWN0b3JfbWlzYWxpZ25tZW50 CgojdW5kZWYgVEFSR0VUX0FSUkFZX01PREUKI2RlZmluZSBUQVJHRVRfQVJSQVlfTU9ERSBhYXJj aDY0X2FycmF5X21vZGUKCiN1bmRlZiBUQVJHRVRfQVJSQVlfTU9ERV9TVVBQT1JURURfUAojZGVm aW5lIFRBUkdFVF9BUlJBWV9NT0RFX1NVUFBPUlRFRF9QIGFhcmNoNjRfYXJyYXlfbW9kZV9zdXBw b3J0ZWRfcAoKI3VuZGVmIFRBUkdFVF9WRUNUT1JJWkVfQ1JFQVRFX0NPU1RTCiNkZWZpbmUgVEFS R0VUX1ZFQ1RPUklaRV9DUkVBVEVfQ09TVFMgYWFyY2g2NF92ZWN0b3JpemVfY3JlYXRlX2Nvc3Rz CgojdW5kZWYgVEFSR0VUX1ZFQ1RPUklaRV9CVUlMVElOX1ZFQ1RPUklaQVRJT05fQ09TVAojZGVm aW5lIFRBUkdFVF9WRUNUT1JJWkVfQlVJTFRJTl9WRUNUT1JJWkFUSU9OX0NPU1QgXAogIGFhcmNo NjRfYnVpbHRpbl92ZWN0b3JpemF0aW9uX2Nvc3QKCiN1bmRlZiBUQVJHRVRfVkVDVE9SSVpFX1BS RUZFUlJFRF9TSU1EX01PREUKI2RlZmluZSBUQVJHRVRfVkVDVE9SSVpFX1BSRUZFUlJFRF9TSU1E X01PREUgYWFyY2g2NF9wcmVmZXJyZWRfc2ltZF9tb2RlCgojdW5kZWYgVEFSR0VUX1ZFQ1RPUkla RV9CVUlMVElOUwojZGVmaW5lIFRBUkdFVF9WRUNUT1JJWkVfQlVJTFRJTlMKCiN1bmRlZiBUQVJH RVRfVkVDVE9SSVpFX0FVVE9WRUNUT1JJWkVfVkVDVE9SX01PREVTCiNkZWZpbmUgVEFSR0VUX1ZF Q1RPUklaRV9BVVRPVkVDVE9SSVpFX1ZFQ1RPUl9NT0RFUyBcCiAgYWFyY2g2NF9hdXRvdmVjdG9y aXplX3ZlY3Rvcl9tb2RlcwoKI3VuZGVmIFRBUkdFVF9BVE9NSUNfQVNTSUdOX0VYUEFORF9GRU5W CiNkZWZpbmUgVEFSR0VUX0FUT01JQ19BU1NJR05fRVhQQU5EX0ZFTlYgXAogIGFhcmNoNjRfYXRv bWljX2Fzc2lnbl9leHBhbmRfZmVudgoKLyogU2VjdGlvbiBhbmNob3Igc3VwcG9ydC4gICovCgoj dW5kZWYgVEFSR0VUX01JTl9BTkNIT1JfT0ZGU0VUCiNkZWZpbmUgVEFSR0VUX01JTl9BTkNIT1Jf T0ZGU0VUIC0yNTYKCi8qIExpbWl0IHRoZSBtYXhpbXVtIGFuY2hvciBvZmZzZXQgdG8gNGstMSwg c2luY2UgdGhhdCdzIHRoZSBsaW1pdCBmb3IgYQogICBieXRlIG9mZnNldDsgd2UgY2FuIGRvIG11 Y2ggbW9yZSBmb3IgbGFyZ2VyIGRhdGEgdHlwZXMsIGJ1dCBoYXZlIG5vIHdheQogICB0byBkZXRl cm1pbmUgdGhlIHNpemUgb2YgdGhlIGFjY2Vzcy4gIFdlIGFzc3VtZSBhY2Nlc3NlcyBhcmUgYWxp Z25lZC4gICovCiN1bmRlZiBUQVJHRVRfTUFYX0FOQ0hPUl9PRkZTRVQKI2RlZmluZSBUQVJHRVRf TUFYX0FOQ0hPUl9PRkZTRVQgNDA5NQoKI3VuZGVmIFRBUkdFVF9WRUNUT1JJWkVfUFJFRkVSUkVE X0RJVl9BU19TSElGVFNfT1ZFUl9NVUxUCiNkZWZpbmUgVEFSR0VUX1ZFQ1RPUklaRV9QUkVGRVJS RURfRElWX0FTX1NISUZUU19PVkVSX01VTFQgXAogIGFhcmNoNjRfdmVjdG9yaXplX3ByZWZlcnJl ZF9kaXZfYXNfc2hpZnRzX292ZXJfbXVsdAoKI3VuZGVmIFRBUkdFVF9WRUNUT1JfQUxJR05NRU5U CiNkZWZpbmUgVEFSR0VUX1ZFQ1RPUl9BTElHTk1FTlQgYWFyY2g2NF9zaW1kX3ZlY3Rvcl9hbGln bm1lbnQKCiN1bmRlZiBUQVJHRVRfVkVDVE9SSVpFX1BSRUZFUlJFRF9WRUNUT1JfQUxJR05NRU5U CiNkZWZpbmUgVEFSR0VUX1ZFQ1RPUklaRV9QUkVGRVJSRURfVkVDVE9SX0FMSUdOTUVOVCBcCiAg YWFyY2g2NF92ZWN0b3JpemVfcHJlZmVycmVkX3ZlY3Rvcl9hbGlnbm1lbnQKI3VuZGVmIFRBUkdF VF9WRUNUT1JJWkVfVkVDVE9SX0FMSUdOTUVOVF9SRUFDSEFCTEUKI2RlZmluZSBUQVJHRVRfVkVD VE9SSVpFX1ZFQ1RPUl9BTElHTk1FTlRfUkVBQ0hBQkxFIFwKICBhYXJjaDY0X3NpbWRfdmVjdG9y X2FsaWdubWVudF9yZWFjaGFibGUKCi8qIHZlY19wZXJtIHN1cHBvcnQuICAqLwoKI3VuZGVmIFRB UkdFVF9WRUNUT1JJWkVfVkVDX1BFUk1fQ09OU1QKI2RlZmluZSBUQVJHRVRfVkVDVE9SSVpFX1ZF Q19QRVJNX0NPTlNUIFwKICBhYXJjaDY0X3ZlY3Rvcml6ZV92ZWNfcGVybV9jb25zdAoKI3VuZGVm IFRBUkdFVF9WRUNUT1JJWkVfUkVMQVRFRF9NT0RFCiNkZWZpbmUgVEFSR0VUX1ZFQ1RPUklaRV9S RUxBVEVEX01PREUgYWFyY2g2NF92ZWN0b3JpemVfcmVsYXRlZF9tb2RlCiN1bmRlZiBUQVJHRVRf VkVDVE9SSVpFX0dFVF9NQVNLX01PREUKI2RlZmluZSBUQVJHRVRfVkVDVE9SSVpFX0dFVF9NQVNL X01PREUgYWFyY2g2NF9nZXRfbWFza19tb2RlCiN1bmRlZiBUQVJHRVRfVkVDVE9SSVpFX0VNUFRZ X01BU0tfSVNfRVhQRU5TSVZFCiNkZWZpbmUgVEFSR0VUX1ZFQ1RPUklaRV9FTVBUWV9NQVNLX0lT X0VYUEVOU0lWRSBcCiAgYWFyY2g2NF9lbXB0eV9tYXNrX2lzX2V4cGVuc2l2ZQojdW5kZWYgVEFS R0VUX1BSRUZFUlJFRF9FTFNFX1ZBTFVFCiNkZWZpbmUgVEFSR0VUX1BSRUZFUlJFRF9FTFNFX1ZB TFVFIFwKICBhYXJjaDY0X3ByZWZlcnJlZF9lbHNlX3ZhbHVlCgojdW5kZWYgVEFSR0VUX0lOSVRf TElCRlVOQ1MKI2RlZmluZSBUQVJHRVRfSU5JVF9MSUJGVU5DUyBhYXJjaDY0X2luaXRfbGliZnVu Y3MKCiN1bmRlZiBUQVJHRVRfRklYRURfQ09ORElUSU9OX0NPREVfUkVHUwojZGVmaW5lIFRBUkdF VF9GSVhFRF9DT05ESVRJT05fQ09ERV9SRUdTIGFhcmNoNjRfZml4ZWRfY29uZGl0aW9uX2NvZGVf cmVncwoKI3VuZGVmIFRBUkdFVF9GTEFHU19SRUdOVU0KI2RlZmluZSBUQVJHRVRfRkxBR1NfUkVH TlVNIENDX1JFR05VTQoKI3VuZGVmIFRBUkdFVF9DQUxMX0ZVU0FHRV9DT05UQUlOU19OT05fQ0FM TEVFX0NMT0JCRVJTCiNkZWZpbmUgVEFSR0VUX0NBTExfRlVTQUdFX0NPTlRBSU5TX05PTl9DQUxM RUVfQ0xPQkJFUlMgdHJ1ZQoKI3VuZGVmIFRBUkdFVF9BU0FOX1NIQURPV19PRkZTRVQKI2RlZmlu ZSBUQVJHRVRfQVNBTl9TSEFET1dfT0ZGU0VUIGFhcmNoNjRfYXNhbl9zaGFkb3dfb2Zmc2V0Cgoj dW5kZWYgVEFSR0VUX0xFR0lUSU1JWkVfQUREUkVTUwojZGVmaW5lIFRBUkdFVF9MRUdJVElNSVpF X0FERFJFU1MgYWFyY2g2NF9sZWdpdGltaXplX2FkZHJlc3MKCiN1bmRlZiBUQVJHRVRfU0NIRURf Q0FOX1NQRUNVTEFURV9JTlNOCiNkZWZpbmUgVEFSR0VUX1NDSEVEX0NBTl9TUEVDVUxBVEVfSU5T TiBhYXJjaDY0X3NjaGVkX2Nhbl9zcGVjdWxhdGVfaW5zbgoKI3VuZGVmIFRBUkdFVF9DQU5fVVNF X0RPTE9PUF9QCiNkZWZpbmUgVEFSR0VUX0NBTl9VU0VfRE9MT09QX1AgY2FuX3VzZV9kb2xvb3Bf aWZfaW5uZXJtb3N0CgojdW5kZWYgVEFSR0VUX1NDSEVEX0FESlVTVF9QUklPUklUWQojZGVmaW5l IFRBUkdFVF9TQ0hFRF9BREpVU1RfUFJJT1JJVFkgYWFyY2g2NF9zY2hlZF9hZGp1c3RfcHJpb3Jp dHkKCiN1bmRlZiBUQVJHRVRfU0NIRURfTUFDUk9fRlVTSU9OX1AKI2RlZmluZSBUQVJHRVRfU0NI RURfTUFDUk9fRlVTSU9OX1AgYWFyY2g2NF9tYWNyb19mdXNpb25fcAoKI3VuZGVmIFRBUkdFVF9T Q0hFRF9NQUNST19GVVNJT05fUEFJUl9QCiNkZWZpbmUgVEFSR0VUX1NDSEVEX01BQ1JPX0ZVU0lP Tl9QQUlSX1AgYWFyY2hfbWFjcm9fZnVzaW9uX3BhaXJfcAoKI3VuZGVmIFRBUkdFVF9TQ0hFRF9G VVNJT05fUFJJT1JJVFkKI2RlZmluZSBUQVJHRVRfU0NIRURfRlVTSU9OX1BSSU9SSVRZIGFhcmNo NjRfc2NoZWRfZnVzaW9uX3ByaW9yaXR5CgojdW5kZWYgVEFSR0VUX1VOU1BFQ19NQVlfVFJBUF9Q CiNkZWZpbmUgVEFSR0VUX1VOU1BFQ19NQVlfVFJBUF9QIGFhcmNoNjRfdW5zcGVjX21heV90cmFw X3AKCiN1bmRlZiBUQVJHRVRfVVNFX1BTRVVET19QSUNfUkVHCiNkZWZpbmUgVEFSR0VUX1VTRV9Q U0VVRE9fUElDX1JFRyBhYXJjaDY0X3VzZV9wc2V1ZG9fcGljX3JlZwoKI3VuZGVmIFRBUkdFVF9Q UklOVF9PUEVSQU5ECiNkZWZpbmUgVEFSR0VUX1BSSU5UX09QRVJBTkQgYWFyY2g2NF9wcmludF9v cGVyYW5kCgojdW5kZWYgVEFSR0VUX1BSSU5UX09QRVJBTkRfQUREUkVTUwojZGVmaW5lIFRBUkdF VF9QUklOVF9PUEVSQU5EX0FERFJFU1MgYWFyY2g2NF9wcmludF9vcGVyYW5kX2FkZHJlc3MKCiN1 bmRlZiBUQVJHRVRfQVNNX09VVFBVVF9BRERSX0NPTlNUX0VYVFJBCiNkZWZpbmUgVEFSR0VUX0FT TV9PVVRQVVRfQUREUl9DT05TVF9FWFRSQSBhYXJjaDY0X291dHB1dF9hZGRyX2NvbnN0X2V4dHJh CgojdW5kZWYgVEFSR0VUX09QVEFCX1NVUFBPUlRFRF9QCiNkZWZpbmUgVEFSR0VUX09QVEFCX1NV UFBPUlRFRF9QIGFhcmNoNjRfb3B0YWJfc3VwcG9ydGVkX3AKCiN1bmRlZiBUQVJHRVRfT01JVF9T VFJVQ1RfUkVUVVJOX1JFRwojZGVmaW5lIFRBUkdFVF9PTUlUX1NUUlVDVF9SRVRVUk5fUkVHIHRy dWUKCiN1bmRlZiBUQVJHRVRfRFdBUkZfUE9MWV9JTkRFVEVSTUlOQVRFX1ZBTFVFCiNkZWZpbmUg VEFSR0VUX0RXQVJGX1BPTFlfSU5ERVRFUk1JTkFURV9WQUxVRSBcCiAgYWFyY2g2NF9kd2FyZl9w b2x5X2luZGV0ZXJtaW5hdGVfdmFsdWUKCi8qIFRoZSBhcmNoaXRlY3R1cmUgcmVzZXJ2ZXMgYml0 cyAwIGFuZCAxIHNvIHVzZSBiaXQgMiBmb3IgZGVzY3JpcHRvcnMuICAqLwojdW5kZWYgVEFSR0VU X0NVU1RPTV9GVU5DVElPTl9ERVNDUklQVE9SUwojZGVmaW5lIFRBUkdFVF9DVVNUT01fRlVOQ1RJ T05fREVTQ1JJUFRPUlMgNAoKI3VuZGVmIFRBUkdFVF9IQVJEX1JFR05PX05SRUdTCiNkZWZpbmUg VEFSR0VUX0hBUkRfUkVHTk9fTlJFR1MgYWFyY2g2NF9oYXJkX3JlZ25vX25yZWdzCiN1bmRlZiBU QVJHRVRfSEFSRF9SRUdOT19NT0RFX09LCiNkZWZpbmUgVEFSR0VUX0hBUkRfUkVHTk9fTU9ERV9P SyBhYXJjaDY0X2hhcmRfcmVnbm9fbW9kZV9vawoKI3VuZGVmIFRBUkdFVF9NT0RFU19USUVBQkxF X1AKI2RlZmluZSBUQVJHRVRfTU9ERVNfVElFQUJMRV9QIGFhcmNoNjRfbW9kZXNfdGllYWJsZV9w CgojdW5kZWYgVEFSR0VUX0hBUkRfUkVHTk9fQ0FMTF9QQVJUX0NMT0JCRVJFRAojZGVmaW5lIFRB UkdFVF9IQVJEX1JFR05PX0NBTExfUEFSVF9DTE9CQkVSRUQgXAogIGFhcmNoNjRfaGFyZF9yZWdu b19jYWxsX3BhcnRfY2xvYmJlcmVkCgojdW5kZWYgVEFSR0VUX0lOU05fQ0FMTEVFX0FCSQojZGVm aW5lIFRBUkdFVF9JTlNOX0NBTExFRV9BQkkgYWFyY2g2NF9pbnNuX2NhbGxlZV9hYmkKCiN1bmRl ZiBUQVJHRVRfQ09OU1RBTlRfQUxJR05NRU5UCiNkZWZpbmUgVEFSR0VUX0NPTlNUQU5UX0FMSUdO TUVOVCBhYXJjaDY0X2NvbnN0YW50X2FsaWdubWVudAoKI3VuZGVmIFRBUkdFVF9TVEFDS19DTEFT SF9QUk9URUNUSU9OX0FMTE9DQV9QUk9CRV9SQU5HRQojZGVmaW5lIFRBUkdFVF9TVEFDS19DTEFT SF9QUk9URUNUSU9OX0FMTE9DQV9QUk9CRV9SQU5HRSBcCiAgYWFyY2g2NF9zdGFja19jbGFzaF9w cm90ZWN0aW9uX2FsbG9jYV9wcm9iZV9yYW5nZQoKI3VuZGVmIFRBUkdFVF9DT01QVVRFX1BSRVNT VVJFX0NMQVNTRVMKI2RlZmluZSBUQVJHRVRfQ09NUFVURV9QUkVTU1VSRV9DTEFTU0VTIGFhcmNo NjRfY29tcHV0ZV9wcmVzc3VyZV9jbGFzc2VzCgojdW5kZWYgVEFSR0VUX0NBTl9DSEFOR0VfTU9E RV9DTEFTUwojZGVmaW5lIFRBUkdFVF9DQU5fQ0hBTkdFX01PREVfQ0xBU1MgYWFyY2g2NF9jYW5f Y2hhbmdlX21vZGVfY2xhc3MKCiN1bmRlZiBUQVJHRVRfU0VMRUNUX0VBUkxZX1JFTUFUX01PREVT CiNkZWZpbmUgVEFSR0VUX1NFTEVDVF9FQVJMWV9SRU1BVF9NT0RFUyBhYXJjaDY0X3NlbGVjdF9l YXJseV9yZW1hdF9tb2RlcwoKI3VuZGVmIFRBUkdFVF9TUEVDVUxBVElPTl9TQUZFX1ZBTFVFCiNk ZWZpbmUgVEFSR0VUX1NQRUNVTEFUSU9OX1NBRkVfVkFMVUUgYWFyY2g2NF9zcGVjdWxhdGlvbl9z YWZlX3ZhbHVlCgojdW5kZWYgVEFSR0VUX0VTVElNQVRFRF9QT0xZX1ZBTFVFCiNkZWZpbmUgVEFS R0VUX0VTVElNQVRFRF9QT0xZX1ZBTFVFIGFhcmNoNjRfZXN0aW1hdGVkX3BvbHlfdmFsdWUKCiN1 bmRlZiBUQVJHRVRfQVRUUklCVVRFX1RBQkxFCiNkZWZpbmUgVEFSR0VUX0FUVFJJQlVURV9UQUJM RSBhYXJjaDY0X2F0dHJpYnV0ZV90YWJsZQoKI3VuZGVmIFRBUkdFVF9TSU1EX0NMT05FX0NPTVBV VEVfVkVDU0laRV9BTkRfU0lNRExFTgojZGVmaW5lIFRBUkdFVF9TSU1EX0NMT05FX0NPTVBVVEVf VkVDU0laRV9BTkRfU0lNRExFTiBcCiAgYWFyY2g2NF9zaW1kX2Nsb25lX2NvbXB1dGVfdmVjc2l6 ZV9hbmRfc2ltZGxlbgoKI3VuZGVmIFRBUkdFVF9TSU1EX0NMT05FX0FESlVTVAojZGVmaW5lIFRB UkdFVF9TSU1EX0NMT05FX0FESlVTVCBhYXJjaDY0X3NpbWRfY2xvbmVfYWRqdXN0CgojdW5kZWYg VEFSR0VUX1NJTURfQ0xPTkVfVVNBQkxFCiNkZWZpbmUgVEFSR0VUX1NJTURfQ0xPTkVfVVNBQkxF IGFhcmNoNjRfc2ltZF9jbG9uZV91c2FibGUKCiN1bmRlZiBUQVJHRVRfQ09NUF9UWVBFX0FUVFJJ QlVURVMKI2RlZmluZSBUQVJHRVRfQ09NUF9UWVBFX0FUVFJJQlVURVMgYWFyY2g2NF9jb21wX3R5 cGVfYXR0cmlidXRlcwoKI3VuZGVmIFRBUkdFVF9HRVRfTVVMVElMSUJfQUJJX05BTUUKI2RlZmlu ZSBUQVJHRVRfR0VUX01VTFRJTElCX0FCSV9OQU1FIGFhcmNoNjRfZ2V0X211bHRpbGliX2FiaV9u YW1lCgojdW5kZWYgVEFSR0VUX0ZOVFlQRV9BQkkKI2RlZmluZSBUQVJHRVRfRk5UWVBFX0FCSSBh YXJjaDY0X2ZudHlwZV9hYmkKCiN1bmRlZiBUQVJHRVRfTUVNVEFHX0NBTl9UQUdfQUREUkVTU0VT CiNkZWZpbmUgVEFSR0VUX01FTVRBR19DQU5fVEFHX0FERFJFU1NFUyBhYXJjaDY0X2Nhbl90YWdf YWRkcmVzc2VzCgojaWYgQ0hFQ0tJTkdfUAojdW5kZWYgVEFSR0VUX1JVTl9UQVJHRVRfU0VMRlRF U1RTCiNkZWZpbmUgVEFSR0VUX1JVTl9UQVJHRVRfU0VMRlRFU1RTIHNlbGZ0ZXN0OjphYXJjaDY0 X3J1bl9zZWxmdGVzdHMKI2VuZGlmIC8qICNpZiBDSEVDS0lOR19QICovCgojdW5kZWYgVEFSR0VU X0FTTV9QT1NUX0NGSV9TVEFSVFBST0MKI2RlZmluZSBUQVJHRVRfQVNNX1BPU1RfQ0ZJX1NUQVJU UFJPQyBhYXJjaDY0X3Bvc3RfY2ZpX3N0YXJ0cHJvYwoKI3VuZGVmIFRBUkdFVF9TVFJJQ1RfQVJH VU1FTlRfTkFNSU5HCiNkZWZpbmUgVEFSR0VUX1NUUklDVF9BUkdVTUVOVF9OQU1JTkcgaG9va19i b29sX0NVTVVMQVRJVkVfQVJHU190cnVlCgojdW5kZWYgVEFSR0VUX01EX0FTTV9BREpVU1QKI2Rl ZmluZSBUQVJHRVRfTURfQVNNX0FESlVTVCBhcm1fbWRfYXNtX2FkanVzdAoKI3VuZGVmIFRBUkdF VF9BU01fRklMRV9FTkQKI2RlZmluZSBUQVJHRVRfQVNNX0ZJTEVfRU5EIGFhcmNoNjRfYXNtX2Zp bGVfZW5kCgojdW5kZWYgVEFSR0VUX0FTTV9GVU5DVElPTl9FUElMT0dVRQojZGVmaW5lIFRBUkdF VF9BU01fRlVOQ1RJT05fRVBJTE9HVUUgYWFyY2g2NF9zbHNfZW1pdF9ibHJfZnVuY3Rpb25fdGh1 bmtzCgojdW5kZWYgVEFSR0VUX0hBVkVfU0hBRE9XX0NBTExfU1RBQ0sKI2RlZmluZSBUQVJHRVRf SEFWRV9TSEFET1dfQ0FMTF9TVEFDSyB0cnVlCgojdW5kZWYgVEFSR0VUX0NPTlNUX0FOQ0hPUgoj ZGVmaW5lIFRBUkdFVF9DT05TVF9BTkNIT1IgMHgxMDAwMDAwCgpzdHJ1Y3QgZ2NjX3RhcmdldCB0 YXJnZXRtID0gVEFSR0VUX0lOSVRJQUxJWkVSOwoKI2luY2x1ZGUgImd0LWFhcmNoNjQuaCIK --000000000000b0eb3505fc754e53--