From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6274 invoked by alias); 2 May 2012 02:45:44 -0000 Received: (qmail 6254 invoked by uid 22791); 2 May 2012 02:45:34 -0000 X-SWARE-Spam-Status: No, hits=-5.1 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_AV,TW_CF,TW_CP,TW_FN,TW_TM,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail-ob0-f175.google.com (HELO mail-ob0-f175.google.com) (209.85.214.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 02 May 2012 02:45:10 +0000 Received: by obhx4 with SMTP id x4so357635obh.20 for ; Tue, 01 May 2012 19:45:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:x-system-of-record:x-gm-message-state; bh=LxfzuVPi2aL5SSGk5gl6Y9fXn48xTpo/bQlm9fiV1pk=; b=TNh3+7O3RIT88Vi+VTWsST/mMOE07uGHpv/fPx7tSO5hYbMIDLnOFU8rLF6kxniO64 41Mqyy8NdHGZKVQwvHDB+VotGj1hsiMuaezKMEwQW7wJSzyURylgNMK0CSjk54AMEWj+ AubPgVzHWWPSUBem6loDaNcTEvrH0TgvmpCQH2gDfq9WYWtmyryPANkOu262tliqz6zO bdNZz64VqkOoc8+rDkKf3SdcNOGqY9t/h7v3Opun3RJn9uG/gzxu/ueqgZF4g2wMH+SB I32p78qCfBqPiyih4LByVLsed2jo5HUUotj1uYrnyqc9kPZikEUeDoPHbNi9V64/UGoi cNvg== Received: by 10.60.22.234 with SMTP id h10mr12685604oef.54.1335926709882; Tue, 01 May 2012 19:45:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.60.22.234 with SMTP id h10mr12685585oef.54.1335926709672; Tue, 01 May 2012 19:45:09 -0700 (PDT) Received: by 10.182.147.104 with HTTP; Tue, 1 May 2012 19:45:09 -0700 (PDT) In-Reply-To: References: <20120307004630.A503DB21B6@azwildcat.mtv.corp.google.com> Date: Wed, 02 May 2012 02:45:00 -0000 Message-ID: Subject: Re: User directed Function Multiversioning via Function Overloading (issue5752064) From: Sriraman Tallam To: "H.J. Lu" Cc: Richard Guenther , Jan Hubicka , Uros Bizjak , reply@codereview.appspotmail.com, gcc-patches@gcc.gnu.org, David Li Content-Type: multipart/mixed; boundary=e89a8fb20170f9da2004bf04acb1 X-System-Of-Record: true X-Gm-Message-State: ALoCoQn5nai8RCLm8WhpGfJDWDEKSq2L41O7WuaHixxcg0PpvRmZiNjR4Cg9c4FyViOUfCb9KIKfi8QBoIROvKJMDIB1iik68ijbPoa1+iSUB5H3ahx0aTtd6OrImHmSjxGujxRzG/gNcVZtBoXap+hTR5mXNUkWsg== X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2012-05/txt/msg00078.txt.bz2 --e89a8fb20170f9da2004bf04acb1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 1889 Hi H.J, Done now. Patch attached. Thanks, -Sri. On Tue, May 1, 2012 at 5:08 PM, H.J. Lu wrote: > On Tue, May 1, 2012 at 4:51 PM, Sriraman Tallam wro= te: >> Hi, >> >> New patch attached, updated test case and fixed bugs related to >> __PRETTY_FUNCTION_. >> >> Patch also available for review here: =A0http://codereview.appspot.com/5= 752064 > > @@ -0,0 +1,39 @@ > +/* Simple test case to check if Multiversioning works. =A0*/ > +/* { dg-do run } */ > +/* { dg-options "-O2 -fPIC" } */ > + > +#include > + > +int foo (); > +int foo () __attribute__ ((target("arch=3Dcorei7,sse4.2,popcnt"))); > +/* The target operands in this declaration and the definition are re-ord= ered. > + =A0 This should still work. =A0*/ > +int foo () __attribute__ ((target("ssse3,avx2"))); > + > +int (*p)() =3D &foo; > +int main () > +{ > + =A0return foo () + (*p)(); > +} > + > +int foo () > +{ > + =A0return 0; > +} > + > +int __attribute__ ((target("arch=3Dcorei7,sse4.2,popcnt"))) > +foo () > +{ > + =A0assert (__builtin_cpu_is ("corei7") > + =A0 =A0 =A0 =A0 && __builtin_cpu_supports ("sse4.2") > + =A0 =A0 =A0 =A0 && __builtin_cpu_supports ("popcnt")); > + =A0return 0; > +} > + > +int __attribute__ ((target("avx2,ssse3"))) > +foo () > +{ > + =A0assert (__builtin_cpu_supports ("avx2") > + =A0 =A0 =A0 =A0 && __builtin_cpu_supports ("ssse3")); > + =A0return 0; > +} > > This test will pass if > > int foo () > { > =A0return 0; > } > > is selected on processors with AVX. =A0The run-time test should > check that the right function is selected on the target processor, > not the selected function matches the target attribute. You can > do it by returning different values for each foo and call cpuid > to check if the right foo is selected. > > You should add a testcase for __builtin_cpu_supports to check > all valid arguments. > > -- > H.J. --e89a8fb20170f9da2004bf04acb1 Content-Type: text/plain; charset=US-ASCII; name="mv_fe_patch.txt" Content-Disposition: attachment; filename="mv_fe_patch.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h1ps8vzo0 Content-length: 93757 T3ZlcnZpZXcgb2YgdGhlIHBhdGNoIHdoaWNoIGFkZHMgZnJvbnQtZW5kIHN1 cHBvcnQgdG8gc3BlY2lmeSBmdW5jdGlvbiB2ZXJzaW9ucy4KCkV4YW1wbGU6 CgppbnQgZm9vICgpOyAgLyogRGVmYXVsdCB2ZXJzaW9uICovCmludCBmb28g KCkgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgiYXZ4LHBvcGNudCIpKSk7LypT cGVjaWFsaXplZCBmb3IgYXZ4IGFuZCBwb3BjbnQgKi8KaW50IGZvbyAoKSBf X2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWNvcmUyLHNzc2UzIikpKTsv KlNwZWNpYWxpemVkIGZvciBjb3JlMiBhbmQgc3NzZTMqLwoKaW50IG1haW4g KCkKewogaW50ICgqcCkoKSA9ICZmb287CiByZXR1cm4gZm9vICgpICsgKCpw KSgpOwp9CgppbnQgZm9vICgpCnsKIHJldHVybiAwOwp9CgppbnQgX19hdHRy aWJ1dGVfXyAoKHRhcmdldCgiYXZ4LHBvcGNudCIpKSkKZm9vICgpCnsKIHJl dHVybiAwOwp9CgppbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgiYXJjaD1j b3JlMixzc3NlMyIpKSkKZm9vICgpCnsKIHJldHVybiAwOwp9CgpUaGUgYWJv dmUgZXhhbXBsZSBoYXMgZm9vIGRlZmluZWQgMyB0aW1lcywgYnV0IGFsbCAz IGRlZmluaXRpb25zIG9mIGZvbyBhcmUKZGlmZmVyZW50IHZlcnNpb25zIG9m IHRoZSBzYW1lIGZ1bmN0aW9uLiBUaGUgY2FsbCB0byBmb28gaW4gbWFpbiwg ZGlyZWN0bHkgYW5kCnZpYSBhIHBvaW50ZXIsIGFyZSBjYWxscyB0byB0aGUg bXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9uIGZvbyB3aGljaCBpcyBkaXNwYXRj aGVkCnRvIHRoZSByaWdodCBmb28gYXQgcnVuLXRpbWUuCgpXaGF0IGRvZXMg dGhlIHBhdGNoIGRvPwoKKiBUcmFja2luZyBkZWNscyB0aGF0IGNvcnJlc3Bv bmQgdG8gZnVuY3Rpb24gdmVyc2lvbnMgb2YgZnVuY3Rpb24KbmFtZSwgc2F5 ICJmb28iOgoKV25lbiB0aGUgZnJvbnQtZW5kIHNlZXMgbW9yZSB0aGFuIG9u ZSBkZWNsIGZvciAiZm9vIiwgd2l0aCBhdGxlYXN0IG9uZSBkZWNsCnRhZ2dl ZCB3aXRoICJ0YXJnZXQiICBhdHRyaWJ1dGVzLCBpdCBtYXJrcyBpdCBhcyBm dW5jdGlvbiB2ZXJzaW9ucy4gVG8KcHJldmVudCBkdXBsaWNhdGUgZGVmaW5p dGlvbiBlcnJvcnMgd2l0aCBvdGhlciB2ZXJzaW9ucyBvZiAiZm9vIiwgSSBj aGFuZ2UKImRlY2xzX21hdGNoIiBmdW5jdGlvbiBpbiBjcC9kZWNsLmMgdG8g cmV0dXJuIGZhbHNlIHdoZW4gMiBkZWNscyBoYXZlIHRoZQpzYW1lIHNpZ25h dHVyZSBidXQgZGlmZmVyZW50IHRhcmdldCBhdHRyaWJ1dGVzLiBUaGlzIHdp bGwgbWFrZSBhbGwgZnVuY3Rpb24KdmVyc2lvbnMgb2YgImZvbyIgdG8gYmUg YWRkZWQgdG8gdGhlIG92ZXJsb2FkIGxpc3Qgb2YgImZvbyIuCgoqIENoYW5n ZSB0aGUgYXNzZW1ibGVyIG5hbWVzIG9mIHRoZSBmdW5jdGlvbiB2ZXJzaW9u cy4KClRoZSBmcm9udC1lbmQgY2hhbmdlcyB0aGUgYXNzZW1ibGVyIG5hbWVz IG9mIHRoZSBmdW5jdGlvbiB2ZXJzaW9ucyBieSBzdWZmaXhpbmcKdGhlIHNv cnRlZCBsaXN0IG9mIGFyZ3MgdG8gInRhcmdldCIgdG8gdGhlIGZ1bmN0aW9u IG5hbWUgb2YgImZvbyIuIEZvciBleGFtcGxlLApoZSBhc3NlbWJsZXIgbmFt ZSBvZiAidm9pZCBmb28gKCkgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCAoInNz ZTQiKSkpIiB3aWxsCmJlY29tZSBfWjNmb292LnNzZTQuCgoqIFNlcGFyYXRl bHkgZ3JvdXAgYWxsIGZ1bmN0aW9uIHZlcnNpb25zIG9mICJmb28iIHRvZ2V0 aGVyLCBpbiBtdWx0aXZlcnNpb24uYzoKCkZpbGUgbXVsdGl2ZXJzaW9uLmMg bWFpbnRhaW5zIGEgaGFzaHRhYiwgZGVjbF92ZXJzaW9uX2h0YWIsICB0aGF0 IG1hcHMKdGhlICBkZWZhdWx0IGZ1bmN0aW9uIGRlY2wgb2YgImZvbyIgdG8g dGhlIGxpc3Qgb2YgYWxsIG90aGVyIHZlcnNpb25zCm9mIHRoaXMgZnVuY3Rp b24gImZvbyIuIFRoaXMgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBkaXNw YXRjaGVyIGZvcgp0aGlzIGZ1bmN0aW9uLgoKKiBPdmVybG9hZCByZXNvbHV0 aW9uOgoKIEZ1bmN0aW9uICJidWlsZF9vdmVyX2NhbGwiIGluIGNwL2NhbGwu YyBzZWVzIGEgY2FsbCB0byBmdW5jdGlvbgoiZm9vIiwgd2hpY2ggaXMgbXVs dGktdmVyc2lvbmVkLiBUaGUgb3ZlcmxvYWQgcmVzb2x1dGlvbiBoYXBwZW5z IGluCmZ1bmN0aW9uICJqb3VzdCIgaW4gImNwL2NhbGwuYyIuIEhlcmUsIHRo ZSBjYWxsIHRvICJmb28iIGhhcyBhbGwKcG9zc2libGUgdmVyc2lvbnMgb2Yg ImZvbyIgYXMgY2FuZGlkYXRlcy4gSWYgdGhlIGNhbGxlciBoYXMgdGFyZ2V0 CmF0dHJpYnV0ZXMgYW5kIGlmIGl0IG1hdGNoZXMgYW55IG9mIHRoZSBmdW5j dGlvbiB2ZXJzaW9uJ3MgdGFyZ2V0CmF0dHJpYnV0ZXMsIHRoZW4gYSBkaXJl Y3QgY2FsbCBpcyBtYWRlIHRvIHRoYXQgZnVuY3Rpb24gdmVyc2lvbi4KCkZv ciBleGFtcGxlOgoKaW50IGJheiBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgi YXZ4LHBvcGNudCIpKSkKewogIGZvbyAoKTsKfQoKaXQgYmF6IGNhbGxzIGZv byB3aGljaCBpcyBtdWx0aS12ZXJzaW9uZWQsIHRoZW4gdGhlIGNhbGwgdG8g Zm9vIGhlcmUKd2lsbCBiZWNvbWUgYSBkaXJlY3QgY2FsbCB0byB0aGUgdmVy c2lvbiBvZiBmb28gdGFyZ2V0ZWQgdG8gYXZ4LHBvcGNudC4KCldoZW4gYSBk aXJlY3QgY2FsbCB0byBhIHZlcnNpb24gY2Fubm90IGJlIG1hZGUgdGhlbiwg dGhlIGRlZmF1bHQKdmVyc2lvbiBvZiAiZm9vIiBpcyB0aGUgd2lubmluZyBj YW5kaWRhdGUuIEJ1dCwgImJ1aWxkX292ZXJfY2FsbCIgcmVhbGl6ZXMKdGhh dCB0aGlzIGlzIGEgdmVyc2lvbmVkIGZ1bmN0aW9uIGFuZCByZXBsYWNlcyB0 aGUgY2FsbC1zaXRlIG9mIGZvbyB3aXRoIGEKImlmdW5jIiBjYWxsIGZvciBm b28sIGJ5IHF1ZXJ5aW5nIGEgZnVuY3Rpb24gaW4gIm11bHRpdmVyc2lvbi5j IiB3aGljaApidWlsZHMgdGhlIGlmdW5jIGRlY2wuIEFmdGVyIHRoaXMsIGFs bCBjYWxsLXNpdGVzIG9mICJmb28iIGNvbnRhaW4gdGhlCmNhbGwgdG8gdGhl IGlmdW5jLgoKKiBDcmVhdGluZyB0aGUgZGlzcGF0Y2hlcjoKClRoZSBkaXNw YXRjaGVyIGlzIGluZGVwZW5kZW50bHkgY3JlYXRlZCBpbiBhIG5ldyBwYXNz LCBjYWxsZWQKInBhc3NfZGlzcGF0Y2hfdmVyc2lvbiIsIHRoYXQgcnVucyBp bW1lZGlhdGVseSBhZnRlciBjZmcgYW5kIGNncmFwaCBhcmUKY3JlYXRlZC4g VGhlIGRpc3BhdGNoZXIgbG9va3MgYXQgYWxsIHBvc3NpYmxlIHZlcnNpb25z IGFuZCBxdWVyaWVzIHRoZQp0YXJnZXQgdG8gZ2l2ZSBpdCB0aGUgQ1BVIGRl dGVjdGlvbiBwcmVkaWNhdGVzIGl0IG11c3QgdXNlIHRvIGRpc3BhdGNoCmVh Y2ggdmVyc2lvbi4gVGhlbiwgdGhlIGRpc3BhdGNoZXIgYm9keSBpcyBjcmVh dGVkIGFuZCB0aGUgaWZ1bmMgaXMKbWFwcGVkIHRvIHVzZSB0aGlzIGRpc3Bh dGNoZXIuCgpOb3RpY2UgdGhhdCBvbmx5IHRoZSBkaXNwYXRjaGVyIGNyZWF0 aW9uIGlzIGRvbmUgYWZ0ZXIgdGhlIGZyb250LWVuZC4KRXZlcnl0aGluZyBl bHNlIG9jY3VycyBpbiB0aGUgZnJvbnQtZW5kIGl0c2VsZi4gSSBjb3VsZCBo YXZlIGNyZWF0ZWQKdGhlIGRpc3BhdGNoZXIgYWxzbyBpbiB0aGUgZnJvbnQt ZW5kLiBJIGRpZCBub3QgZG8gc28gYmVjYXVzZSBJCnRob3VnaHQga2VlcGlu ZyBpdCBhcyBhIHNlcGFyYXRlIHBhc3MgbWFkZSBzZW5zZSB0byBlYXNpbHkg YWRkIG1vcmUKZGlzcGF0Y2ggbWVjaGFuaXNtcy4gTGlrZSB3aGVuIElGVU5D IGlzIG5vdCBhdmFpbGFibGUsIHJlcGxhY2UgaXQgd2l0aAogY29udHJvbC1m bG93IHRvIG1ha2UgZGlyZWN0IGNhbGxzIHRvIHRoZSBmdW5jdGlvbiB2ZXJz aW9ucy4gQWxzbywKbWFraW5nIHRoZSBkaXNwYXRjaGVyIGFmdGVyIGNmZyBp cyBjcmVhdGVkIHdhcyBlYXN5LgoKCgkqIGRvYy90bS50ZXhpLmluOiBBZGQg ZGVzY3JpcHRpb24gZm9yIFRBUkdFVF9ESVNQQVRDSF9WRVJTSU9OLgoJKiBk b2MvdG0udGV4aTogUmVnZW5lcmF0ZS4KCSogdGFyZ2V0LmRlZiAoZGlzcGF0 Y2hfdmVyc2lvbik6IE5ldyB0YXJnZXQgaG9vay4KCSogdHJlZS5oIChERUNM X0ZVTkNUSU9OX1ZFUlNJT05FRCk6IE5ldyBtYWNyby4KCSh0cmVlX2Z1bmN0 aW9uX2RlY2wpOiBOZXcgYml0LWZpZWxkIHZlcnNpb25lZF9mdW5jdGlvbi4K CSogdHJlZS1wYXNzLmggKHBhc3NfZGlzcGF0Y2hfdmVyc2lvbnMpOiBOZXcg cGFzcy4KCSogbXVsdGl2ZXJzaW9uLmM6IE5ldyBmaWxlLgoJKiBtdWx0aXZl cnNpb24uaDogTmV3IGZpbGUuCgkqIGNncmFwaHVuaXQuYzoKCShjZ3JhcGhf ZmluYWxpemVfZnVuY3Rpb24pOiBGb3JjZSBvdXRwdXQgb2YgdmVyc2lvbmVk IGlubGluZQoJZnVuY3Rpb25zLgoJKiBjcC9jbGFzcy5jOiBJbmNsdWRlIG11 bHRpdmVyc2lvbi5oCgkoYWRkX21ldGhvZCk6IGFnZ3JlZ2F0ZSBmdW5jdGlv biB2ZXJzaW9ucy4gQ2hhbmdlIGFzc2VtYmxlciBuYW1lcyBvZgoJdmVyc2lv bmVkIGZ1bmN0aW9ucy4KCShyZXNvbHZlX2FkZHJlc3Nfb2Zfb3ZlcmxvYWRl ZF9mdW5jdGlvbik6IE1hdGNoIGFkZHJlc3Mgb2YgZnVuY3Rpb24KCXZlcnNp b24gd2l0aCBkZWZhdWx0IGZ1bmN0aW9uLiAgUmV0dXJuIGFkZHJlc3Mgb2Yg aWZ1bmMgZGlzcGF0Y2hlcgoJZm9yIGFkZHJlc3Mgb2YgdmVyc2lvbmVkIGZ1 bmN0aW9ucy4KCShjeHhfY29tZGF0X2dyb3VwKTogVXNlIGRlY2wgbmFtZXMg Zm9yIGNvbWRhdCBncm91cHMgb2YgdmVyc2lvbmVkCglmdW5jdGlvbnMuCgkq IGNwL2RlY2wuYyAoZGVjbHNfbWF0Y2gpOiBNYWtlIGRlY2xzIHVubWF0Y2hl ZCBmb3IgdmVyc2lvbmVkCglmdW5jdGlvbnMuCgkoZHVwbGljYXRlX2RlY2xz KTogUmVtb3ZlIGFtYmlndWl0eSBmb3IgdmVyc2lvbmVkIGZ1bmN0aW9ucy4g Tm90aWZ5CglvZiBkZWxldGVkIGZ1bmN0aW9uIHZlcnNpb24gZGVjbHMuCgko c3RhcnRfZGVjbCk6IENoYW5nZSBhc3NlbWJsZXIgbmFtZSBvZiB2ZXJzaW9u ZWQgZnVuY3Rpb25zLgoJKHN0YXJ0X2Z1bmN0aW9uKTogQ2hhbmdlIGFzc2Vt YmxlciBuYW1lIG9mIHZlcnNpb25lZCBmdW5jdGlvbnMuCgkoY3h4X2NvbWRh dF9ncm91cCk6IE1ha2UgY29tZGF0IGdyb3VwIG9mIHZlcnNpb25lZCBmdW5j dGlvbnMgYmUgdGhlCglzYW1lLgoJKiBjcC9zZW1hbnRpY3MuYyAoZXhwYW5k X29yX2RlZmVyX2ZuXzEpOiBNYXJrIGFzIG5lZWRlZCB2ZXJzaW9uZWQKCWZ1 bmN0aW9ucyB0aGF0IGFyZSBhbHNvIG1hcmtlZCBpbmxpbmUuCgkqIGNwL2Rl Y2wyLmM6IEluY2x1ZGUgbXVsdGl2ZXJzaW9uLmgKCShjaGVja19jbGFzc2Zu KTogQ2hlY2sgYXR0cmlidXRlcyBvZiB2ZXJzaW9uZWQgZnVuY3Rpb25zIGZv ciBtYXRjaC4KCSogY3AvY2FsbC5jOiBJbmNsdWRlIG11bHRpdmVyc2lvbi5o CgkoYnVpbGRfb3Zlcl9jYWxsKTogTWFrZSBjYWxscyB0byBtdWx0aXZlcnNp b25lZCBmdW5jdGlvbnMgdG8gY2FsbCB0aGUKCWRpc3BhdGNoZXIuCgkoam91 c3QpOiBGb3IgY2FsbHMgdG8gbXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9ucywg bWFrZSB0aGUgZGVmYXVsdAoJZnVuY3Rpb24gd2luLgoJKiBjcC9tYW5nbGUu YyAod3JpdGVfdW5xdWFsaWZpZWRfbmFtZSk6IFVzZSBhc3NlbWJsZXIgbmFt ZSBmb3IKCXZlcnNpb25lZCBmdW5jdGlvbnMuCgkqIHRpbWV2YXIuZGVmIChU Vl9NVUxUSVZFUlNJT05fRElTUEFUQ0gpOiBOZXcgdGltZSB2YXIuCgkqIHZh cmFzbS5jIChmaW5pc2hfYWxpYXNlc18xKTogQ2hlY2sgaWYgdGhlIGFsaWFz IHBvaW50cyB0byBhIGZ1bmN0aW9uCgl3aXRoIGEgYm9keSBiZWZvcmUgZ2l2 aW5nIGFuIGVycm9yLgoJKiBNYWtlZmlsZS5pbjogQWRkIG11bHRpdmVyc2lv bi5vCgkqIHBhc3Nlcy5jOiBBZGQgcGFzc19kaXNwYXRjaF92ZXJzaW9ucyB0 byB0aGUgcGFzcyBsaXN0LgoJKiBjb25maWcvaTM4Ni9pMzg2LmMgKGFkZF9j b25kaXRpb25fdG9fYmIpOiBOZXcgZnVuY3Rpb24uCgkoZ2V0X2J1aWx0aW5f Y29kZV9mb3JfdmVyc2lvbik6IE5ldyBmdW5jdGlvbi4KCShpeDg2X2Rpc3Bh dGNoX3ZlcnNpb24pOiBOZXcgZnVuY3Rpb24uCgkoVEFSR0VUX0RJU1BBVENI X1ZFUlNJT04pOiBOZXcgbWFjcm8uCgkqIHRlc3RzdWl0ZS9nKysuZGcvbXYx LkM6IE5ldyB0ZXN0LgoKSW5kZXg6IGdjYy9kb2MvdG0udGV4aQo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Ci0tLSBnY2MvZG9jL3RtLnRleGkJKHJldmlzaW9u IDE4Njg4MykKKysrIGdjYy9kb2MvdG0udGV4aQkod29ya2luZyBjb3B5KQpA QCAtMTA5OTcsNiArMTA5OTcsMTQgQEAgVGhlIHJlc3VsdCBpcyBhbm90aGVy IHRyZWUgY29udGFpbmluZyBhIHNpbXBsaWZpZWQKIGNhbGwncyByZXN1bHQu ICBJZiBAdmFye2lnbm9yZX0gaXMgdHJ1ZSB0aGUgdmFsdWUgd2lsbCBiZSBp Z25vcmVkLgogQGVuZCBkZWZ0eXBlZm4KIAorQGRlZnR5cGVmbiB7VGFyZ2V0 IEhvb2t9IGludCBUQVJHRVRfRElTUEFUQ0hfVkVSU0lPTiAodHJlZSBAdmFy e2Rpc3BhdGNoX2RlY2x9LCB2b2lkICpAdmFye2ZuZGVjbHN9LCBiYXNpY19i bG9jayAqQHZhcntlbXB0eV9iYn0pCitGb3IgbXVsdGktdmVyc2lvbmVkIGZ1 bmN0aW9uLCB0aGlzIGhvb2sgc2V0cyB1cCB0aGUgZGlzcGF0Y2hlci4KK0B2 YXJ7ZGlzcGF0Y2hfZGVjbH0gaXMgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBi ZSB1c2VkIHRvIGRpc3BhdGNoIHRoZQordmVyc2lvbi4gQHZhcntmbmRlY2xz fSBhcmUgdGhlIGZ1bmN0aW9uIGNob2ljZXMgZm9yIGRpc3BhdGNoLgorQHZh cntlbXB0eV9iYn0gaXMgYW4gYmFzaWMgYmxvY2sgaW4gQHZhcntkaXNwYXRj aF9kZWNsfSB3aGVyZSB0aGUKK2NvZGUgdG8gZG8gdGhlIGRpc3BhdGNoIHdp bGwgYmUgYWRkZWQuCitAZW5kIGRlZnR5cGVmbgorCiBAZGVmdHlwZWZuIHtU YXJnZXQgSG9va30ge2NvbnN0IGNoYXIgKn0gVEFSR0VUX0lOVkFMSURfV0lU SElOX0RPTE9PUCAoY29uc3RfcnR4IEB2YXJ7aW5zbn0pCiAKIFRha2UgYW4g aW5zdHJ1Y3Rpb24gaW4gQHZhcntpbnNufSBhbmQgcmV0dXJuIE5VTEwgaWYg aXQgaXMgdmFsaWQgd2l0aGluIGEKSW5kZXg6IGdjYy9kb2MvdG0udGV4aS5p bgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvZG9jL3RtLnRleGku aW4JKHJldmlzaW9uIDE4Njg4MykKKysrIGdjYy9kb2MvdG0udGV4aS5pbgko d29ya2luZyBjb3B5KQpAQCAtMTA4NzcsNiArMTA4NzcsMTQgQEAgVGhlIHJl c3VsdCBpcyBhbm90aGVyIHRyZWUgY29udGFpbmluZyBhIHNpbXBsaWZpZWQK IGNhbGwncyByZXN1bHQuICBJZiBAdmFye2lnbm9yZX0gaXMgdHJ1ZSB0aGUg dmFsdWUgd2lsbCBiZSBpZ25vcmVkLgogQGVuZCBkZWZ0eXBlZm4KIAorQGhv b2sgVEFSR0VUX0RJU1BBVENIX1ZFUlNJT04KK0ZvciBtdWx0aS12ZXJzaW9u ZWQgZnVuY3Rpb24sIHRoaXMgaG9vayBzZXRzIHVwIHRoZSBkaXNwYXRjaGVy LgorQHZhcntkaXNwYXRjaF9kZWNsfSBpcyB0aGUgZnVuY3Rpb24gdGhhdCB3 aWxsIGJlIHVzZWQgdG8gZGlzcGF0Y2ggdGhlCit2ZXJzaW9uLiBAdmFye2Zu ZGVjbHN9IGFyZSB0aGUgZnVuY3Rpb24gY2hvaWNlcyBmb3IgZGlzcGF0Y2gu CitAdmFye2VtcHR5X2JifSBpcyBhbiBiYXNpYyBibG9jayBpbiBAdmFye2Rp c3BhdGNoX2RlY2x9IHdoZXJlIHRoZQorY29kZSB0byBkbyB0aGUgZGlzcGF0 Y2ggd2lsbCBiZSBhZGRlZC4KK0BlbmQgZGVmdHlwZWZuCisKIEBob29rIFRB UkdFVF9JTlZBTElEX1dJVEhJTl9ET0xPT1AKIAogVGFrZSBhbiBpbnN0cnVj dGlvbiBpbiBAdmFye2luc259IGFuZCByZXR1cm4gTlVMTCBpZiBpdCBpcyB2 YWxpZCB3aXRoaW4gYQpJbmRleDogZ2NjL3RhcmdldC5kZWYKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gZ2NjL3RhcmdldC5kZWYJKHJldmlzaW9uIDE4 Njg4MykKKysrIGdjYy90YXJnZXQuZGVmCSh3b3JraW5nIGNvcHkpCkBAIC0x MjQ5LDYgKzEyNDksMTUgQEAgREVGSE9PSwogIHRyZWUsICh0cmVlIGZuZGVj bCwgaW50IG5fYXJncywgdHJlZSAqYXJncCwgYm9vbCBpZ25vcmUpLAogIGhv b2tfdHJlZV90cmVlX2ludF90cmVlcF9ib29sX251bGwpCiAKKy8qIFRhcmdl dCBob29rIHRvIGdlbmVyYXRlIHRoZSBkaXNwYXRjaGluZyBjb2RlIGZvciBj YWxscyB0byBtdWx0aS12ZXJzaW9uZWQKKyAgIGZ1bmN0aW9ucy4gIERJU1BB VENIX0RFQ0wgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYXZlIHRoZSBk aXNwYXRjaGluZworICAgbG9naWMuICBGTkRFQ0xTIGFyZSB0aGUgbGlzdCBv ZiBjaG9pY2VzIGZvciBkaXNwYXRjaCBhbmQgRU1QVFlfQkIgaXMgdGhlCisg ICBiYXNpYyBibG9jIGluIERJU1BBVENIX0RFQ0wgd2hpY2ggd2lsbCBjb250 YWluIHRoZSBjb2RlLiAgKi8KK0RFRkhPT0sKKyhkaXNwYXRjaF92ZXJzaW9u LAorICIiLAorIGludCwgKHRyZWUgZGlzcGF0Y2hfZGVjbCwgdm9pZCAqZm5k ZWNscywgYmFzaWNfYmxvY2sgKmVtcHR5X2JiKSwgTlVMTCkKKwogLyogUmV0 dXJucyBhIGNvZGUgZm9yIGEgdGFyZ2V0LXNwZWNpZmljIGJ1aWx0aW4gdGhh dCBpbXBsZW1lbnRzCiAgICByZWNpcHJvY2FsIG9mIHRoZSBmdW5jdGlvbiwg b3IgTlVMTF9UUkVFIGlmIG5vdCBhdmFpbGFibGUuICAqLwogREVGSE9PSwpJ bmRleDogZ2NjL3RyZWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBn Y2MvdHJlZS5oCShyZXZpc2lvbiAxODY4ODMpCisrKyBnY2MvdHJlZS5oCSh3 b3JraW5nIGNvcHkpCkBAIC0zNTM5LDYgKzM1MzksMTIgQEAgZXh0ZXJuIFZF Qyh0cmVlLCBnYykgKipkZWNsX2RlYnVnX2FyZ3NfaW5zZXJ0ICh0cmUKICNk ZWZpbmUgREVDTF9GVU5DVElPTl9TUEVDSUZJQ19PUFRJTUlaQVRJT04oTk9E RSkgXAogICAgKEZVTkNUSU9OX0RFQ0xfQ0hFQ0sgKE5PREUpLT5mdW5jdGlv bl9kZWNsLmZ1bmN0aW9uX3NwZWNpZmljX29wdGltaXphdGlvbikKIAorLyog SW4gRlVOQ1RJT05fREVDTCwgdGhpcyBpcyBzZXQgaWYgdGhpcyBmdW5jdGlv biBoYXMgb3RoZXIgdmVyc2lvbnMgZ2VuZXJhdGVkCisgICB1c2luZyAidGFy Z2V0IiBhdHRyaWJ1dGVzLiAgVGhlIGRlZmF1bHQgdmVyc2lvbiBpcyB0aGUg b25lIHdoaWNoIGRvZXMgbm90CisgICBoYXZlIGFueSAidGFyZ2V0IiBhdHRy aWJ1dGUgc2V0LiAqLworI2RlZmluZSBERUNMX0ZVTkNUSU9OX1ZFUlNJT05F RChOT0RFKVwKKyAgIChGVU5DVElPTl9ERUNMX0NIRUNLIChOT0RFKS0+ZnVu Y3Rpb25fZGVjbC52ZXJzaW9uZWRfZnVuY3Rpb24pCisKIC8qIEZVTkNUSU9O X0RFQ0wgaW5oZXJpdHMgZnJvbSBERUNMX05PTl9DT01NT04gYmVjYXVzZSBv ZiB0aGUgdXNlIG9mIHRoZQogICAgYXJndW1lbnRzL3Jlc3VsdC9zYXZlZF90 cmVlIGZpZWxkcyBieSBmcm9udCBlbmRzLiAgIEl0IHdhcyBlaXRoZXIgaW5o ZXJpdAogICAgRlVOQ1RJT05fREVDTCBmcm9tIG5vbl9jb21tb24sIG9yIGlu aGVyaXQgbm9uX2NvbW1vbiBmcm9tIEZVTkNUSU9OX0RFQ0wsCkBAIC0zNTgz LDggKzM1ODksOCBAQCBzdHJ1Y3QgR1RZKCgpKSB0cmVlX2Z1bmN0aW9uX2Rl Y2wgewogICB1bnNpZ25lZCBsb29waW5nX2NvbnN0X29yX3B1cmVfZmxhZyA6 IDE7CiAgIHVuc2lnbmVkIGhhc19kZWJ1Z19hcmdzX2ZsYWcgOiAxOwogICB1 bnNpZ25lZCB0bV9jbG9uZV9mbGFnIDogMTsKLQotICAvKiAxIGJpdCBsZWZ0 ICovCisgIHVuc2lnbmVkIHZlcnNpb25lZF9mdW5jdGlvbiA6IDE7CisgIC8q IE5vIGJpdHMgbGVmdC4gICovCiB9OwogCiAvKiBUaGUgc291cmNlIGxhbmd1 YWdlIG9mIHRoZSB0cmFuc2xhdGlvbi11bml0LiAgKi8KSW5kZXg6IGdjYy90 cmVlLXBhc3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvdHJl ZS1wYXNzLmgJKHJldmlzaW9uIDE4Njg4MykKKysrIGdjYy90cmVlLXBhc3Mu aAkod29ya2luZyBjb3B5KQpAQCAtNDUzLDYgKzQ1Myw3IEBAIGV4dGVybiBz dHJ1Y3QgZ2ltcGxlX29wdF9wYXNzIHBhc3NfdG1fbWVtb3B0OwogZXh0ZXJu IHN0cnVjdCBnaW1wbGVfb3B0X3Bhc3MgcGFzc190bV9lZGdlczsKIGV4dGVy biBzdHJ1Y3QgZ2ltcGxlX29wdF9wYXNzIHBhc3Nfc3BsaXRfZnVuY3Rpb25z OwogZXh0ZXJuIHN0cnVjdCBnaW1wbGVfb3B0X3Bhc3MgcGFzc19mZWVkYmFj a19zcGxpdF9mdW5jdGlvbnM7CitleHRlcm4gc3RydWN0IGdpbXBsZV9vcHRf cGFzcyBwYXNzX2Rpc3BhdGNoX3ZlcnNpb25zOwogCiAvKiBJUEEgUGFzc2Vz ICovCiBleHRlcm4gc3RydWN0IHNpbXBsZV9pcGFfb3B0X3Bhc3MgcGFzc19p cGFfbG93ZXJfZW11dGxzOwpJbmRleDogZ2NjL211bHRpdmVyc2lvbi5jCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9tdWx0aXZlcnNpb24uYwko cmV2aXNpb24gMCkKKysrIGdjYy9tdWx0aXZlcnNpb24uYwkocmV2aXNpb24g MCkKQEAgLTAsMCArMSw4MzIgQEAKKy8qIEZ1bmN0aW9uIE11bHRpdmVyc2lv bmluZy4KKyAgIENvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFNyaXJhbWFuIFRh bGxhbSAodG1zcmlyYW1AZ29vZ2xlLmNvbSkKKworVGhpcyBmaWxlIGlzIHBh cnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2 ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNI QU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3Ig bW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcg d2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUK KzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gKi8KKworLyogSG9s ZHMgdGhlIHN0YXRlIGZvciBtdWx0aS12ZXJzaW9uZWQgZnVuY3Rpb25zIGhl cmUuIFRoZSBmcm9udC1lbmQKKyAgIHVwZGF0ZXMgdGhlIHN0YXRlIGFzIGFu ZCB3aGVuIGZ1bmN0aW9uIHZlcnNpb25zIGFyZSBlbmNvdW50ZXJlZC4KKyAg IFRoaXMgaXMgdGhlbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkaXNwYXRjaCBj b2RlLiAgQWxzbywgdGhlCisgICBvcHRpbWl6YXRpb24gcGFzc2VzIHRvIGNs b25lIGhvdCBwYXRocyBpbnZvbHZpbmcgdmVyc2lvbmVkIGZ1bmN0aW9ucwor ICAgd2lsbCBiZSBkb25lIGhlcmUuCisKKyAgIEZ1bmN0aW9uIHZlcnNpb25z IGFyZSBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHNpZ25h dHVyZSBidXQKKyAgIGFsc28gdGFnZ2luZyBhdHRyaWJ1dGUgInRhcmdldCIg dG8gc3BlY2lmeSB0aGUgcGxhdGZvcm0gdHlwZSBmb3Igd2hpY2gKKyAgIHRo ZSB2ZXJzaW9uIG11c3QgYmUgZXhlY3V0ZWQuICBIZXJlIGlzIGFuIGV4YW1w bGU6CisKKyAgIGludCBmb28gKCkKKyAgIHsKKyAgICAgcHJpbnRmICgiRXhl Y3V0ZSBhcyBkZWZhdWx0Iik7CisgICAgIHJldHVybiAwOworICAgfQorCisg ICBpbnQgIF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCJhcmNoPWNvcmVpNyIp KSkKKyAgIGZvbyAoKQorICAgeworICAgICBwcmludGYgKCJFeGVjdXRlIGZv ciBjb3JlaTciKTsKKyAgICAgcmV0dXJuIDA7CisgICB9CisgICAKKyAgIGlu dCBtYWluICgpCisgICB7CisgICAgIHJldHVybiBmb28gKCk7CisgICB9IAor CisgICBUaGUgY2FsbCB0byBmb28gaW4gbWFpbiBpcyByZXBsYWNlZCB3aXRo IGEgY2FsbCB0byBhbiBJRlVOQyBmdW5jdGlvbiB0aGF0CisgICBjb250YWlu cyB0aGUgZGlzcGF0Y2ggY29kZSB0byBjYWxsIHRoZSBjb3JyZWN0IGZ1bmN0 aW9uIHZlcnNpb24gYXQKKyAgIHJ1bi10aW1lLiAgKi8KKworCisjaW5jbHVk ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisjaW5jbHVkZSAi Y29yZXR5cGVzLmgiCisjaW5jbHVkZSAidG0uaCIKKyNpbmNsdWRlICJ0cmVl LmgiCisjaW5jbHVkZSAidHJlZS1pbmxpbmUuaCIKKyNpbmNsdWRlICJsYW5n aG9va3MuaCIKKyNpbmNsdWRlICJmbGFncy5oIgorI2luY2x1ZGUgImNncmFw aC5oIgorI2luY2x1ZGUgImRpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJ0b3Bs ZXYuaCIKKyNpbmNsdWRlICJ0aW1ldmFyLmgiCisjaW5jbHVkZSAicGFyYW1z LmgiCisjaW5jbHVkZSAiZmliaGVhcC5oIgorI2luY2x1ZGUgImludGwuaCIK KyNpbmNsdWRlICJ0cmVlLXBhc3MuaCIKKyNpbmNsdWRlICJoYXNodGFiLmgi CisjaW5jbHVkZSAiY292ZXJhZ2UuaCIKKyNpbmNsdWRlICJnZ2MuaCIKKyNp bmNsdWRlICJ0cmVlLWZsb3cuaCIKKyNpbmNsdWRlICJydGwuaCIKKyNpbmNs dWRlICJpcGEtcHJvcC5oIgorI2luY2x1ZGUgImJhc2ljLWJsb2NrLmgiCisj aW5jbHVkZSAidG9wbGV2LmgiCisjaW5jbHVkZSAiZGJnY250LmgiCisjaW5j bHVkZSAidHJlZS1kdW1wLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5j bHVkZSAidmVjcHJpbS5oIgorI2luY2x1ZGUgImdpbXBsZS1wcmV0dHktcHJp bnQuaCIKKyNpbmNsdWRlICJpcGEtaW5saW5lLmgiCisjaW5jbHVkZSAidGFy Z2V0LmgiCisjaW5jbHVkZSAibXVsdGl2ZXJzaW9uLmgiCisKK3R5cGVkZWYg dm9pZCAqIHZvaWRfcDsKKworREVGX1ZFQ19QICh2b2lkX3ApOworREVGX1ZF Q19BTExPQ19QICh2b2lkX3AsIGhlYXApOworCisvKiBFYWNoIGZ1bmN0aW9u IGRlY2wgdGhhdCBpcyBhIGZ1bmN0aW9uIHZlcnNpb24gZ2V0cyBhbiBpbnN0 YW5jZSBvZiB0aGlzCisgICBzdHJ1Y3R1cmUuICAgU2luY2UgdGhpcyBpcyBj YWxsZWQgYnkgdGhlIGZyb250LWVuZCwgZGVjbCBtZXJnaW5nIGNhbgorICAg aGFwcGVuLCB3aGVyZSBhIGRlY2wgY3JlYXRlZCBmb3IgYSBuZXcgZGVjbGFy YXRpb24gaXMgbWVyZ2VkIHdpdGggCisgICB0aGUgb2xkLiBJbiB0aGlzIGNh c2UsIHRoZSBuZXcgZGVjbCBpcyBkZWxldGVkIGFuZCB0aGUgSVNfREVMRVRF RAorICAgZmllbGQgaXMgc2V0IGZvciB0aGUgc3RydWN0IGluc3RhbmNlIGNv cnJlc3BvbmRpbmcgdG8gdGhlIG5ldyBkZWNsLgorICAgSUZVTkNfREVDTCBp cyB0aGUgZGVjbCBvZiB0aGUgaWZ1bmMgZnVuY3Rpb24gZm9yIGRlZmF1bHQg ZGVjbHMuCisgICBJRlVOQ19SRVNPTFZFUl9ERUNMIGlzIHRoZSBkZWNsIG9m IHRoZSBkaXNwYXRjaCBmdW5jdGlvbi4gIFZFUlNJT05TCisgICBpcyBhIHZl Y3RvciBjb250YWluaW5nIHRoZSBsaXN0IG9mIGZ1bmN0aW9uIHZlcnNpb25z ICB0aGF0IGFyZQorICAgdGhlIGNhbmRpZGF0ZXMgZm9yIGRpc3BhdGNoLiAg Ki8KKwordHlwZWRlZiBzdHJ1Y3QgdmVyc2lvbl9mdW5jdGlvbl9kIHsKKyAg dHJlZSBkZWNsOworICB0cmVlIGlmdW5jX2RlY2w7CisgIHRyZWUgaWZ1bmNf cmVzb2x2ZXJfZGVjbDsKKyAgVkVDICh2b2lkX3AsIGhlYXApICp2ZXJzaW9u czsKKyAgYm9vbCBpc19kZWxldGVkOworfSB2ZXJzaW9uX2Z1bmN0aW9uOwor CisvKiBIYXNobWFwIGhhcyBhbiBlbnRyeSBmb3IgZXZlcnkgZnVuY3Rpb24g ZGVjbCB0aGF0IGhhcyBvdGhlciBmdW5jdGlvbgorICAgdmVyc2lvbnMuICBG b3IgZnVuY3Rpb24gZGVjbHMgdGhhdCBhcmUgdGhlIGRlZmF1bHQsIGl0IGFs c28gc3RvcmVzIHRoZQorICAgbGlzdCBvZiBhbGwgdGhlIG90aGVyIGZ1bmN0 aW9uIHZlcnNpb25zLiAgRWFjaCBlbnRyeSBpcyBhIHN0cnVjdHVyZQorICAg b2YgdHlwZSB2ZXJzaW9uX2Z1bmN0aW9uX2QuICAqLworc3RhdGljIGh0YWJf dCBkZWNsX3ZlcnNpb25faHRhYiA9IE5VTEw7CisKKy8qIEhhc2h0YWJsZSBo ZWxwZXJzIGZvciBkZWNsX3ZlcnNpb25faHRhYi4gKi8KKworc3RhdGljIGhh c2h2YWxfdAorZGVjbF92ZXJzaW9uX2h0YWJfaGFzaF9kZXNjcmlwdG9yIChj b25zdCB2b2lkICpwKQoreworICBjb25zdCB2ZXJzaW9uX2Z1bmN0aW9uICp0 ID0gKGNvbnN0IHZlcnNpb25fZnVuY3Rpb24gKikgcDsKKyAgcmV0dXJuIGh0 YWJfaGFzaF9wb2ludGVyICh0LT5kZWNsKTsKK30KKworLyogSGFzaHRhYmxl IGhlbHBlciBmb3IgZGVjbF92ZXJzaW9uX2h0YWIuICovCisKK3N0YXRpYyBp bnQKK2RlY2xfdmVyc2lvbl9odGFiX2VxX2Rlc2NyaXB0b3IgKGNvbnN0IHZv aWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKyAgY29uc3QgdmVyc2lvbl9m dW5jdGlvbiAqdDEgPSAoY29uc3QgdmVyc2lvbl9mdW5jdGlvbiAqKSBwMTsK KyAgcmV0dXJuIGh0YWJfZXFfcG9pbnRlciAoKGNvbnN0IHZvaWRfcCkgdDEt PmRlY2wsIHAyKTsKK30KKworLyogQ3JlYXRlIHRoZSBkZWNsX3ZlcnNpb25f aHRhYi4gICovCitzdGF0aWMgdm9pZAorY3JlYXRlX2RlY2xfdmVyc2lvbl9o dGFiICh2b2lkKQoreworICBpZiAoZGVjbF92ZXJzaW9uX2h0YWIgPT0gTlVM TCkKKyAgICBkZWNsX3ZlcnNpb25faHRhYiA9IGh0YWJfY3JlYXRlICgxMCwg ZGVjbF92ZXJzaW9uX2h0YWJfaGFzaF9kZXNjcmlwdG9yLAorCQkJCSAgICAg ZGVjbF92ZXJzaW9uX2h0YWJfZXFfZGVzY3JpcHRvciwgTlVMTCk7Cit9CisK Ky8qIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdmVyc2lvbl9mdW5jdGlvbiBm b3IgZGVjbCBERUNMLiAgKi8KKworc3RhdGljIHZlcnNpb25fZnVuY3Rpb24q CituZXdfdmVyc2lvbl9mdW5jdGlvbiAoY29uc3QgdHJlZSBkZWNsKQorewor ICB2ZXJzaW9uX2Z1bmN0aW9uICp2OworICB2ID0gKHZlcnNpb25fZnVuY3Rp b24gKil4bWFsbG9jKHNpemVvZiAodmVyc2lvbl9mdW5jdGlvbikpOworICB2 LT5kZWNsID0gZGVjbDsKKyAgdi0+aWZ1bmNfZGVjbCA9IE5VTEw7CisgIHYt PmlmdW5jX3Jlc29sdmVyX2RlY2wgPSBOVUxMOworICB2LT52ZXJzaW9ucyA9 IE5VTEw7CisgIHYtPmlzX2RlbGV0ZWQgPSBmYWxzZTsKKyAgcmV0dXJuIHY7 Cit9CisKKy8qIENvbXBhcmF0b3IgZnVuY3Rpb24gdG8gYmUgdXNlZCBpbiBx c29ydCByb3V0aW5lIHRvIHNvcnQgYXR0cmlidXRlCisgICBzcGVjaWZpY2F0 aW9uIHN0cmluZ3MgdG8gInRhcmdldCIuICAqLworCitzdGF0aWMgaW50Cith dHRyX3N0cmNtcCAoY29uc3Qgdm9pZCAqdjEsIGNvbnN0IHZvaWQgKnYyKQor eworICBjb25zdCBjaGFyICpjMSA9ICooY2hhciAqY29uc3QqKXYxOworICBj b25zdCBjaGFyICpjMiA9ICooY2hhciAqY29uc3QqKXYyOworICByZXR1cm4g c3RyY21wIChjMSwgYzIpOworfQorCisvKiBTVFIgaXMgdGhlIGFyZ3VtZW50 IHRvIHRhcmdldCBhdHRyaWJ1dGUuICBUaGlzIGZ1bmN0aW9uIHRva2VuaXpl cworICAgdGhlIGNvbW1hIHNlcGFyYXRlZCBhcmd1bWVudHMsIHNvcnRzIHRo ZW0gYW5kIHJldHVybnMgYSBzdHJpbmcgd2hpY2gKKyAgIGlzIGEgdW5pcXVl IGlkZW50aWZpZXIgZm9yIHRoZSBjb21tYSBzZXBhcmF0ZWQgYXJndW1lbnRz LiAgKi8KKworc3RhdGljIGNoYXIgKgorc29ydGVkX2F0dHJfc3RyaW5nIChj b25zdCBjaGFyICpzdHIpCit7CisgIGNoYXIgKiphcmdzID0gTlVMTDsKKyAg Y2hhciAqYXR0cl9zdHIsICpyZXRfc3RyOworICBjaGFyICphdHRyID0gTlVM TDsKKyAgdW5zaWduZWQgaW50IGFyZ251bSA9IDE7CisgIHVuc2lnbmVkIGlu dCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzdHJsZW4gKHN0cik7IGkrKykK KyAgICBpZiAoc3RyW2ldID09ICcsJykKKyAgICAgIGFyZ251bSsrOworCisg IGF0dHJfc3RyID0gKGNoYXIgKil4bWFsbG9jIChzdHJsZW4gKHN0cikgKyAx KTsKKyAgc3RyY3B5IChhdHRyX3N0ciwgc3RyKTsKKworICBmb3IgKGkgPSAw OyBpIDwgc3RybGVuIChhdHRyX3N0cik7IGkrKykKKyAgICBpZiAoYXR0cl9z dHJbaV0gPT0gJz0nKQorICAgICAgYXR0cl9zdHJbaV0gPSAnXyc7CisKKyAg aWYgKGFyZ251bSA9PSAxKQorICAgIHJldHVybiBhdHRyX3N0cjsKKworICBh cmdzID0gKGNoYXIgKiopeG1hbGxvYyAoYXJnbnVtICogc2l6ZW9mIChjaGFy ICopKTsKKworICBpID0gMDsKKyAgYXR0ciA9IHN0cnRvayAoYXR0cl9zdHIs ICIsIik7CisgIHdoaWxlIChhdHRyICE9IE5VTEwpCisgICAgeworICAgICAg YXJnc1tpXSA9IGF0dHI7CisgICAgICBpKys7CisgICAgICBhdHRyID0gc3Ry dG9rIChOVUxMLCAiLCIpOworICAgIH0KKworICBxc29ydCAoYXJncywgYXJn bnVtLCBzaXplb2YgKGNoYXIqKSwgYXR0cl9zdHJjbXApOworCisgIHJldF9z dHIgPSAoY2hhciAqKXhtYWxsb2MgKHN0cmxlbiAoc3RyKSArIDEpOworICBz dHJjcHkgKHJldF9zdHIsIGFyZ3NbMF0pOworICBmb3IgKGkgPSAxOyBpIDwg YXJnbnVtOyBpKyspCisgICAgeworICAgICAgc3RyY2F0IChyZXRfc3RyLCAi XyIpOworICAgICAgc3RyY2F0IChyZXRfc3RyLCBhcmdzW2ldKTsKKyAgICB9 CisKKyAgZnJlZSAoYXJncyk7CisgIGZyZWUgKGF0dHJfc3RyKTsKKyAgcmV0 dXJuIHJldF9zdHI7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSB3aGVuIG9ubHkg b25lIG9mIERFQ0wxIGFuZCBERUNMMiBpcyBtYXJrZWQgd2l0aCAidGFyZ2V0 IgorICAgb3IgaWYgdGhlICJ0YXJnZXQiIGF0dHJpYnV0ZSBzdHJpbmdzIG9m IERFQ0wxIGFuZCBERUNMMiBkb250IG1hdGNoLiAgKi8KKworYm9vbAoraGFz X2RpZmZlcmVudF92ZXJzaW9uX2F0dHJpYnV0ZXMgKGNvbnN0IHRyZWUgZGVj bDEsIGNvbnN0IHRyZWUgZGVjbDIpCit7CisgIHRyZWUgYXR0cjEsIGF0dHIy OworICBjaGFyICpjMSwgKmMyOworICBib29sIHJldCA9IGZhbHNlOworCisg IGlmIChUUkVFX0NPREUgKGRlY2wxKSAhPSBGVU5DVElPTl9ERUNMCisgICAg ICB8fCBUUkVFX0NPREUgKGRlY2wyKSAhPSBGVU5DVElPTl9ERUNMKQorICAg IHJldHVybiBmYWxzZTsKKworICBhdHRyMSA9IGxvb2t1cF9hdHRyaWJ1dGUg KCJ0YXJnZXQiLCBERUNMX0FUVFJJQlVURVMgKGRlY2wxKSk7CisgIGF0dHIy ID0gbG9va3VwX2F0dHJpYnV0ZSAoInRhcmdldCIsIERFQ0xfQVRUUklCVVRF UyAoZGVjbDIpKTsKKworICBpZiAoYXR0cjEgPT0gTlVMTF9UUkVFICYmIGF0 dHIyID09IE5VTExfVFJFRSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYg KChhdHRyMSA9PSBOVUxMX1RSRUUgJiYgYXR0cjIgIT0gTlVMTF9UUkVFKQor ICAgICAgfHwgKGF0dHIxICE9IE5VTExfVFJFRSAmJiBhdHRyMiA9PSBOVUxM X1RSRUUpKQorICAgIHJldHVybiB0cnVlOworCisgIGMxID0gc29ydGVkX2F0 dHJfc3RyaW5nICgKKwlUUkVFX1NUUklOR19QT0lOVEVSIChUUkVFX1ZBTFVF IChUUkVFX1ZBTFVFIChhdHRyMSkpKSk7CisgIGMyID0gc29ydGVkX2F0dHJf c3RyaW5nICgKKwlUUkVFX1NUUklOR19QT0lOVEVSIChUUkVFX1ZBTFVFIChU UkVFX1ZBTFVFIChhdHRyMikpKSk7CisKKyAgaWYgKHN0cmNtcCAoYzEsIGMy KSAhPSAwKQorICAgICByZXQgPSB0cnVlOworCisgIGZyZWUgKGMxKTsKKyAg ZnJlZSAoYzIpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIElmIHRoaXMg ZGVjbCBjb3JyZXNwb25kcyB0byBhIGZ1bmN0aW9uIGFuZCBoYXMgInRhcmdl dCIgYXR0cmlidXRlLAorICAgYXBwZW5kIHRoZSBhdHRyaWJ1dGUgc3RyaW5n IHRvIGl0cyBhc3NlbWJsZXIgbmFtZS4gICovCisKK3N0YXRpYyB2b2lkCit2 ZXJzaW9uX2Fzc2VtYmxlcl9uYW1lIChjb25zdCB0cmVlIGRlY2wpCit7Cisg IHRyZWUgdmVyc2lvbl9hdHRyOworICBjb25zdCBjaGFyICpvcmlnX25hbWUs ICp2ZXJzaW9uX3N0cmluZywgKmF0dHJfc3RyOworICBjaGFyICphc3NlbWJs ZXJfbmFtZTsKKyAgdHJlZSBhc3NlbWJsZXJfbmFtZV90cmVlOworICAKKyAg aWYgKFRSRUVfQ09ERSAoZGVjbCkgIT0gRlVOQ1RJT05fREVDTCkKKyAgICBy ZXR1cm47CisKKyAgaWYgKERFQ0xfREVDTEFSRURfSU5MSU5FX1AgKGRlY2wp CisgICAgICAmJmxvb2t1cF9hdHRyaWJ1dGUgKCJnbnVfaW5saW5lIiwKKwkJ CSAgREVDTF9BVFRSSUJVVEVTIChkZWNsKSkpCisgICAgZXJyb3JfYXQgKERF Q0xfU09VUkNFX0xPQ0FUSU9OIChkZWNsKSwKKwkgICAgICAiRnVuY3Rpb24g dmVyc2lvbnMgY2Fubm90IGJlIG1hcmtlZCBhcyBnbnVfaW5saW5lLCIKKwkg ICAgICAiIGJvZGllcyBoYXZlIHRvIGJlIGdlbmVyYXRlZFxuIik7CisKKyAg aWYgKERFQ0xfVklSVFVBTF9QIChkZWNsKQorICAgICAgfHwgREVDTF9WSU5E RVggKGRlY2wpKQorICAgIGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElP TiAoZGVjbCksCisJICAgICAgIlZpcnR1YWwgZnVuY3Rpb24gdmVyc2lvbmlu ZyBub3Qgc3VwcG9ydGVkXG4iKTsKKworICB2ZXJzaW9uX2F0dHIgPSBsb29r dXBfYXR0cmlidXRlICgidGFyZ2V0IiwgREVDTF9BVFRSSUJVVEVTIChkZWNs KSk7CisgIC8qIHRhcmdldCBhdHRyaWJ1dGUgc3RyaW5nIGlzIE5VTEwgZm9y IGRlZmF1bHQgZnVuY3Rpb25zLiAgKi8KKyAgaWYgKHZlcnNpb25fYXR0ciA9 PSBOVUxMX1RSRUUpCisgICAgcmV0dXJuOworCisgIG9yaWdfbmFtZSA9IElE RU5USUZJRVJfUE9JTlRFUiAoREVDTF9BU1NFTUJMRVJfTkFNRSAoZGVjbCkp OworICB2ZXJzaW9uX3N0cmluZworICAgID0gVFJFRV9TVFJJTkdfUE9JTlRF UiAoVFJFRV9WQUxVRSAoVFJFRV9WQUxVRSAodmVyc2lvbl9hdHRyKSkpOwor CisgIGF0dHJfc3RyID0gc29ydGVkX2F0dHJfc3RyaW5nICh2ZXJzaW9uX3N0 cmluZyk7CisgIGFzc2VtYmxlcl9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAo c3RybGVuIChvcmlnX25hbWUpCisJCQkJICAgICArIHN0cmxlbiAoYXR0cl9z dHIpICsgMik7CisKKyAgc3ByaW50ZiAoYXNzZW1ibGVyX25hbWUsICIlcy4l cyIsIG9yaWdfbmFtZSwgYXR0cl9zdHIpOworICBpZiAoZHVtcF9maWxlKQor ICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIkFzc2VtYmxlciBuYW1lIHNldCB0 byAlcyBmb3IgZnVuY3Rpb24gdmVyc2lvbiAlc1xuIiwKKwkgICAgIGFzc2Vt Ymxlcl9uYW1lLCBJREVOVElGSUVSX1BPSU5URVIgKERFQ0xfTkFNRSAoZGVj bCkpKTsKKworICBhc3NlbWJsZXJfbmFtZV90cmVlID0gZ2V0X2lkZW50aWZp ZXIgKGFzc2VtYmxlcl9uYW1lKTsKKworICBTRVRfREVDTF9BU1NFTUJMRVJf TkFNRSAoZGVjbCwgYXNzZW1ibGVyX25hbWVfdHJlZSk7CisgIFNFVF9ERUNM X1JUTCAoZGVjbCwgTlVMTCk7Cit9CisKK3ZvaWQKK21hcmtfZnVuY3Rpb25f YXNfdmVyc2lvbiAoY29uc3QgdHJlZSBkZWNsKQoreworICBpZiAoREVDTF9G VU5DVElPTl9WRVJTSU9ORUQgKGRlY2wpKQorICAgIHJldHVybjsKKyAgREVD TF9GVU5DVElPTl9WRVJTSU9ORUQgKGRlY2wpID0gMTsKKyAgdmVyc2lvbl9h c3NlbWJsZXJfbmFtZSAoZGVjbCk7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBp ZiBmdW5jdGlvbiBERUNMIGhhcyB0YXJnZXQgYXR0cmlidXRlIHNldC4gIFRo aXMgY291bGQgYmUKKyAgIGEgdmVyc2lvbi4gICovCisKK2Jvb2wKK2lzX3Rh cmdldF9hdHRyaWJ1dGVfc2V0IChjb25zdCB0cmVlIGRlY2wpCit7CisgIHJl dHVybiAoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCisJICAm JiAobG9va3VwX2F0dHJpYnV0ZSAoInRhcmdldCIsIERFQ0xfQVRUUklCVVRF UyAoZGVjbCkpCisJICAgICAgIT0gTlVMTF9UUkVFKSk7Cit9CisKKy8qIFJl dHVybnMgdHJ1ZSBpZiBkZWNsIGlzIG11bHRpLXZlcnNpb25lZCBhbmQgREVD TCBpcyB0aGUgZGVmYXVsdCBmdW5jdGlvbiwKKyAgIHRoYXQgaXMgaXQgaXMg bm90IHRhZ2dlZCB3aXRoICJ0YXJnZXQiIGF0dHJpYnV0ZS4gICovCisKK2Jv b2wKK2lzX2RlZmF1bHRfZnVuY3Rpb24gKGNvbnN0IHRyZWUgZGVjbCkKK3sK KyAgcmV0dXJuIChUUkVFX0NPREUgKGRlY2wpID09IEZVTkNUSU9OX0RFQ0wK KwkgICYmIERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChkZWNsKQorCSAgJiYg KGxvb2t1cF9hdHRyaWJ1dGUgKCJ0YXJnZXQiLCBERUNMX0FUVFJJQlVURVMg KGRlY2wpKQorCSAgICAgID09IE5VTExfVFJFRSkpOwkKK30KKworLyogRm9y IGZ1bmN0aW9uIGRlY2wgREVDTCwgZmluZCB0aGUgdmVyc2lvbl9mdW5jdGlv biBzdHJ1Y3QgaW4gdGhlCisgICBkZWNsX3ZlcnNpb25faHRhYi4gICovCisK K3N0YXRpYyB2ZXJzaW9uX2Z1bmN0aW9uICoKK2ZpbmRfZnVuY3Rpb25fdmVy c2lvbiAoY29uc3QgdHJlZSBkZWNsKQoreworICB2b2lkICpzbG90OworCisg IGlmICghREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKGRlY2wpKQorICAgIHJl dHVybiBOVUxMOworCisgIGlmICghZGVjbF92ZXJzaW9uX2h0YWIpCisgICAg cmV0dXJuIE5VTEw7CisKKyAgc2xvdCA9IGh0YWJfZmluZF93aXRoX2hhc2gg KGRlY2xfdmVyc2lvbl9odGFiLCBkZWNsLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaHRhYl9oYXNoX3BvaW50ZXIgKGRlY2wpKTsKKworICBp ZiAoc2xvdCAhPSBOVUxMKQorICAgIHJldHVybiAodmVyc2lvbl9mdW5jdGlv biAqKXNsb3Q7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJlY29yZCBE RUNMIGFzIGEgZnVuY3Rpb24gdmVyc2lvbiBieSBjcmVhdGluZyBhIHZlcnNp b25fZnVuY3Rpb24gc3RydWN0CisgICBmb3IgaXQgYW5kIHN0b3JpbmcgaXQg aW4gdGhlIGhhc2h0YWJsZS4gICovCisKK3N0YXRpYyB2ZXJzaW9uX2Z1bmN0 aW9uICoKK2FkZF9mdW5jdGlvbl92ZXJzaW9uIChjb25zdCB0cmVlIGRlY2wp Cit7CisgIHZvaWQgKipzbG90OworICB2ZXJzaW9uX2Z1bmN0aW9uICp2Owor CisgIGlmICghREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKGRlY2wpKQorICAg IHJldHVybiBOVUxMOworCisgIGNyZWF0ZV9kZWNsX3ZlcnNpb25faHRhYiAo KTsKKworICBzbG90ID0gaHRhYl9maW5kX3Nsb3Rfd2l0aF9oYXNoIChkZWNs X3ZlcnNpb25faHRhYiwgKGNvbnN0IHZvaWRfcClkZWNsLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBodGFiX2hhc2hfcG9pbnRlciAo KGNvbnN0IHZvaWRfcClkZWNsKSwKKwkJCQkgICBJTlNFUlQpOworCisgIGlm ICgqc2xvdCAhPSBOVUxMKQorICAgIHJldHVybiAodmVyc2lvbl9mdW5jdGlv biAqKSpzbG90OworCisgIHYgPSBuZXdfdmVyc2lvbl9mdW5jdGlvbiAoZGVj bCk7CisgICpzbG90ID0gdjsKKworICByZXR1cm4gdjsKK30KKworLyogUHVz aCBWIGludG8gVkVDIG9ubHkgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2Vu dC4gIElmIGFscmVhZHkgcHJlc2VudAorICAgcmV0dXJucyBmYWxzZS4gICov CisKK3N0YXRpYyBib29sCitwdXNoX2Z1bmN0aW9uX3ZlcnNpb24gKHZlcnNp b25fZnVuY3Rpb24gKnYsIFZFQyAodm9pZF9wLCBoZWFwKSAqKnZlYykKK3sK KyAgaW50IGl4OworICB2b2lkX3AgZWxlOyAKKyAgZm9yIChpeCA9IDA7IFZF Q19pdGVyYXRlICh2b2lkX3AsICp2ZWMsIGl4LCBlbGUpOyArK2l4KQorICAg IHsKKyAgICAgIGlmIChlbGUgPT0gKHZvaWRfcCl2KQorICAgICAgICByZXR1 cm4gZmFsc2U7CisgICAgfQorCisgIFZFQ19zYWZlX3B1c2ggKHZvaWRfcCwg aGVhcCwgKnZlYywgKHZvaWQqKXYpOworICByZXR1cm4gdHJ1ZTsKK30KKyAK Ky8qIE1hcmsgREVDTCBhcyBkZWxldGVkLiAgVGhpcyBpcyBjYWxsZWQgYnkg dGhlIGZyb250LWVuZCB3aGVuIGEgZHVwbGljYXRlCisgICBkZWNsIGlzIG1l cmdlZCB3aXRoIHRoZSBvcmlnaW5hbCBkZWNsIGFuZCB0aGUgZHVwbGljYXRl IGRlY2wgaXMgZGVsZXRlZC4KKyAgIFRoaXMgZnVuY3Rpb24gbWFya3MgdGhl IGR1cGxpY2F0ZV9kZWNsIGFzIGludmFsaWQuICBDYWxsZWQgYnkKKyAgIGR1 cGxpY2F0ZV9kZWNscyBpbiBjcC9kZWNsLmMuICAqLworCit2b2lkCittYXJr X2RlbGV0ZV9kZWNsX3ZlcnNpb24gKGNvbnN0IHRyZWUgZGVjbCkKK3sKKyAg dmVyc2lvbl9mdW5jdGlvbiAqZGVjbF92OworCisgIGRlY2xfdiA9IGZpbmRf ZnVuY3Rpb25fdmVyc2lvbiAoZGVjbCk7CisKKyAgaWYgKGRlY2xfdiA9PSBO VUxMKQorICAgIHJldHVybjsKKworICBkZWNsX3YtPmlzX2RlbGV0ZWQgPSB0 cnVlOworCisgIGlmIChpc19kZWZhdWx0X2Z1bmN0aW9uIChkZWNsKQorICAg ICAgJiYgZGVjbF92LT52ZXJzaW9ucyAhPSBOVUxMKQorICAgIHsKKyAgICAg IFZFQ190cnVuY2F0ZSAodm9pZF9wLCBkZWNsX3YtPnZlcnNpb25zLCAwKTsK KyAgICAgIFZFQ19mcmVlICh2b2lkX3AsIGhlYXAsIGRlY2xfdi0+dmVyc2lv bnMpOworICAgICAgZGVjbF92LT52ZXJzaW9ucyA9IE5VTEw7CisgICAgfQor fQorCisvKiBNYXJrIERFQ0wxIGFuZCBERUNMMiB0byBiZSBmdW5jdGlvbiB2 ZXJzaW9ucyBpbiB0aGUgc2FtZSBncm91cC4gIE9uZQorICAgb2YgREVDTDEg YW5kIERFQ0wyIG11c3QgYmUgdGhlIGRlZmF1bHQsIG90aGVyd2lzZSB0aGlz IGZ1bmN0aW9uIGRvZXMKKyAgIG5vdGhpbmcuICBUaGlzIGZ1bmN0aW9uIGFn Z3JlZ2F0ZXMgdGhlIHZlcnNpb25zLiAgKi8KKworaW50Citncm91cF9mdW5j dGlvbl92ZXJzaW9ucyAoY29uc3QgdHJlZSBkZWNsMSwgY29uc3QgdHJlZSBk ZWNsMikKK3sKKyAgdHJlZSBkZWZhdWx0X2RlY2wsIHZlcnNpb25fZGVjbDsK KyAgdmVyc2lvbl9mdW5jdGlvbiAqZGVmYXVsdF92LCAqdmVyc2lvbl92Owor CisgIGdjY19hc3NlcnQgKERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChkZWNs MSkKKwkgICAgICAmJiBERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAoZGVjbDIp KTsKKworICAvKiBUaGUgdmVyc2lvbiBkZWNscyBhcmUgYWRkZWQgb25seSB0 byB0aGUgZGVmYXVsdCBkZWNsLiAgKi8KKyAgaWYgKCFpc19kZWZhdWx0X2Z1 bmN0aW9uIChkZWNsMSkKKyAgICAgICYmICFpc19kZWZhdWx0X2Z1bmN0aW9u IChkZWNsMikpCisgICAgcmV0dXJuIDA7CisKKyAgLyogVGhpcyBjYW4gaGFw cGVuIHdpdGggZHVwbGljYXRlIGRlY2xhcmF0aW9ucy4gIEp1c3QgaWdub3Jl LiAgKi8KKyAgaWYgKGlzX2RlZmF1bHRfZnVuY3Rpb24gKGRlY2wxKQorICAg ICAgJiYgaXNfZGVmYXVsdF9mdW5jdGlvbiAoZGVjbDIpKQorICAgIHJldHVy biAwOworCisgIGRlZmF1bHRfZGVjbCA9IChpc19kZWZhdWx0X2Z1bmN0aW9u IChkZWNsMSkpID8gZGVjbDEgOiBkZWNsMjsKKyAgdmVyc2lvbl9kZWNsID0g KGRlZmF1bHRfZGVjbCA9PSBkZWNsMSkgPyBkZWNsMiA6IGRlY2wxOworCisg IGdjY19hc3NlcnQgKGRlZmF1bHRfZGVjbCAhPSB2ZXJzaW9uX2RlY2wpOwor ICBjcmVhdGVfZGVjbF92ZXJzaW9uX2h0YWIgKCk7CisKKyAgLyogSWYgdGhl IHZlcnNpb24gZnVuY3Rpb24gaXMgZm91bmQsIGl0IGhhcyBiZWVuIGFkZGVk LiAgKi8KKyAgaWYgKGZpbmRfZnVuY3Rpb25fdmVyc2lvbiAodmVyc2lvbl9k ZWNsKSkKKyAgICByZXR1cm4gMDsKKworICBkZWZhdWx0X3YgPSBhZGRfZnVu Y3Rpb25fdmVyc2lvbiAoZGVmYXVsdF9kZWNsKTsKKyAgdmVyc2lvbl92ID0g YWRkX2Z1bmN0aW9uX3ZlcnNpb24gKHZlcnNpb25fZGVjbCk7CisKKyAgaWYg KGRlZmF1bHRfdi0+dmVyc2lvbnMgPT0gTlVMTCkKKyAgICBkZWZhdWx0X3Yt PnZlcnNpb25zID0gVkVDX2FsbG9jICh2b2lkX3AsIGhlYXAsIDEpOworCisg IHB1c2hfZnVuY3Rpb25fdmVyc2lvbiAodmVyc2lvbl92LCAmZGVmYXVsdF92 LT52ZXJzaW9ucyk7CisgIHJldHVybiAwOworfQorCisvKiBNYWtlcyBhIGZ1 bmN0aW9uIGF0dHJpYnV0ZSBvZiB0aGUgZm9ybSBOQU1FKEFSR19OQU1FKSBh bmQgY2hhaW5zCisgICBpdCB0byBDSEFJTi4gICovCisKK3N0YXRpYyB0cmVl CittYWtlX2F0dHJpYnV0ZSAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hh ciAqYXJnX25hbWUsIHRyZWUgY2hhaW4pCit7CisgIHRyZWUgYXR0cl9uYW1l OworICB0cmVlIGF0dHJfYXJnX25hbWU7CisgIHRyZWUgYXR0cl9hcmdzOwor ICB0cmVlIGF0dHI7CisKKyAgYXR0cl9uYW1lID0gZ2V0X2lkZW50aWZpZXIg KG5hbWUpOworICBhdHRyX2FyZ19uYW1lID0gYnVpbGRfc3RyaW5nIChzdHJs ZW4gKGFyZ19uYW1lKSwgYXJnX25hbWUpOworICBhdHRyX2FyZ3MgPSB0cmVl X2NvbnMgKE5VTExfVFJFRSwgYXR0cl9hcmdfbmFtZSwgTlVMTF9UUkVFKTsK KyAgYXR0ciA9IHRyZWVfY29ucyAoYXR0cl9uYW1lLCBhdHRyX2FyZ3MsIGNo YWluKTsKKyAgcmV0dXJuIGF0dHI7Cit9CisKKy8qIFJldHVybiBhIG5ldyBu YW1lIGJ5IGFwcGVuZGluZyBTVUZGSVggdG8gdGhlIERFQ0wgbmFtZS4gIElm CisgICBtYWtlX3VuaXF1ZSBpcyB0cnVlLCBhcHBlbmQgdGhlIGZ1bGwgcGF0 aCBuYW1lLiAgKi8KKworc3RhdGljIGNoYXIgKgorbWFrZV9uYW1lICh0cmVl IGRlY2wsIGNvbnN0IGNoYXIgKnN1ZmZpeCwgYm9vbCBtYWtlX3VuaXF1ZSkK K3sKKyAgY2hhciAqZ2xvYmFsX3Zhcl9uYW1lOworICBpbnQgbmFtZV9sZW47 CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKnVuaXF1ZV9u YW1lID0gTlVMTDsKKworICBuYW1lID0gSURFTlRJRklFUl9QT0lOVEVSIChE RUNMX0FTU0VNQkxFUl9OQU1FIChkZWNsKSk7CisKKyAgLyogR2V0IGEgdW5p cXVlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBnbG9iYWxseSB3aXRob3V0IGFu eSBjaGFuY2VzCisgICAgIG9mIGNvbGxpc2lvbiBhdCBsaW5rIHRpbWUuICAq LworICBpZiAobWFrZV91bmlxdWUpCisgICAgdW5pcXVlX25hbWUgPSBJREVO VElGSUVSX1BPSU5URVIgKGdldF9maWxlX2Z1bmN0aW9uX25hbWUgKCJcMCIp KTsKKworICBuYW1lX2xlbiA9IHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHN1 ZmZpeCkgKyAyOworCisgIGlmIChtYWtlX3VuaXF1ZSkKKyAgICBuYW1lX2xl biArPSBzdHJsZW4gKHVuaXF1ZV9uYW1lKSArIDE7CisgIGdsb2JhbF92YXJf bmFtZSA9IChjaGFyICopIHhtYWxsb2MgKG5hbWVfbGVuKTsKKworICAvKiBV c2UgJy4nIHRvIGNvbmNhdGVuYXRlIG5hbWVzIGFzIGl0IGlzIGRlbWFuZ2xl ciBmcmllbmRseS4gICovCisgIGlmIChtYWtlX3VuaXF1ZSkKKyAgICAgIHNu cHJpbnRmIChnbG9iYWxfdmFyX25hbWUsIG5hbWVfbGVuLCAiJXMuJXMuJXMi LCBuYW1lLAorCQl1bmlxdWVfbmFtZSwgc3VmZml4KTsKKyAgZWxzZQorICAg ICAgc25wcmludGYgKGdsb2JhbF92YXJfbmFtZSwgbmFtZV9sZW4sICIlcy4l cyIsIG5hbWUsIHN1ZmZpeCk7CisKKyAgcmV0dXJuIGdsb2JhbF92YXJfbmFt ZTsKK30KKworLyogTWFrZSB0aGUgcmVzb2x2ZXIgZnVuY3Rpb24gZGVjbCBm b3IgaWZ1bmMgKElGVU5DX0RFQ0wpIHRvIGRpc3BhdGNoCisgICB0aGUgdmVy c2lvbnMgb2YgbXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9uIERFRkFVTFRfREVD TC4gIENyZWF0ZSBhbmQKKyAgIGVtcHR5IGJhc2ljIGJsb2NrIGluIHRoZSBy ZXNvbHZlciBhbmQgc3RvcmUgdGhlIHBvaW50ZXIgaW4KKyAgIEVNUFRZX0JC LiAgUmV0dXJuIHRoZSBkZWNsIG9mIHRoZSByZXNvbHZlciBmdW5jdGlvbi4g ICovCisKK3N0YXRpYyB0cmVlCittYWtlX2lmdW5jX3Jlc29sdmVyX2Z1bmMg KGNvbnN0IHRyZWUgZGVmYXVsdF9kZWNsLAorCQkJICBjb25zdCB0cmVlIGlm dW5jX2RlY2wsCisJCQkgIGJhc2ljX2Jsb2NrICplbXB0eV9iYikKK3sKKyAg Y2hhciAqcmVzb2x2ZXJfbmFtZTsKKyAgdHJlZSBkZWNsLCB0eXBlLCBkZWNs X25hbWUsIHQ7CisgIGJhc2ljX2Jsb2NrIG5ld19iYjsKKyAgdHJlZSBvbGRf Y3VycmVudF9mdW5jdGlvbl9kZWNsOworICBib29sIG1ha2VfdW5pcXVlID0g ZmFsc2U7CisKKyAgLyogSUZVTkMncyBoYXZlIHRvIGJlIGdsb2JhbGx5IHZp c2libGUuICBTbywgaWYgdGhlIGRlZmF1bHRfZGVjbCBpcworICAgICBub3Qs IHRoZW4gdGhlIG5hbWUgb2YgdGhlIElGVU5DIHNob3VsZCBiZSBtYWRlIHVu aXF1ZS4gICovCisgIGlmIChUUkVFX1BVQkxJQyAoZGVmYXVsdF9kZWNsKSA9 PSAwKQorICAgIG1ha2VfdW5pcXVlID0gdHJ1ZTsKKworICAvKiBBcHBlbmQg dGhlIGZpbGVuYW1lIHRvIHRoZSByZXNvbHZlciBmdW5jdGlvbiBpZiB0aGUg dmVyc2lvbnMgYXJlCisgICAgIG5vdCBleHRlcm5hbGx5IHZpc2libGUuICBU aGlzIGlzIGJlY2F1c2UgdGhlIHJlc29sdmVyIGZ1bmN0aW9uIGhhcworICAg ICB0byBiZSBleHRlcm5hbGx5IHZpc2libGUgZm9yIHRoZSBsb2FkZXIgdG8g ZmluZCBpdC4gIFNvLCBhcHBlbmRpbmcKKyAgICAgdGhlIGZpbGVuYW1lIHdp bGwgcHJldmVudCBjb25mbGljdHMgd2l0aCBhIHJlc29sdmVyIGZ1bmN0aW9u IGZyb20KKyAgICAgYW5vdGhlciBtb2R1bGUgd2hpY2ggaXMgYmFzZWQgb24g dGhlIHNhbWUgdmVyc2lvbiBuYW1lLiAgKi8KKyAgcmVzb2x2ZXJfbmFtZSA9 IG1ha2VfbmFtZSAoZGVmYXVsdF9kZWNsLCAicmVzb2x2ZXIiLCBtYWtlX3Vu aXF1ZSk7CisKKyAgLyogVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHNob3VsZCBy ZXR1cm4gYSAodm9pZCAqKS4gKi8KKyAgdHlwZSA9IGJ1aWxkX2Z1bmN0aW9u X3R5cGVfbGlzdCAocHRyX3R5cGVfbm9kZSwgTlVMTF9UUkVFKTsKKworICBk ZWNsID0gYnVpbGRfZm5fZGVjbCAocmVzb2x2ZXJfbmFtZSwgdHlwZSk7Cisg IGRlY2xfbmFtZSA9IGdldF9pZGVudGlmaWVyIChyZXNvbHZlcl9uYW1lKTsK KyAgU0VUX0RFQ0xfQVNTRU1CTEVSX05BTUUgKGRlY2wsIGRlY2xfbmFtZSk7 CisKKyAgREVDTF9OQU1FIChkZWNsKSA9IGRlY2xfbmFtZTsKKyAgVFJFRV9V U0VEIChkZWNsKSA9IFRSRUVfVVNFRCAoZGVmYXVsdF9kZWNsKTsKKyAgREVD TF9BUlRJRklDSUFMIChkZWNsKSA9IDE7CisgIERFQ0xfSUdOT1JFRF9QIChk ZWNsKSA9IDA7CisgIC8qIElGVU5DIHJlc29sdmVycyBoYXZlIHRvIGJlIGV4 dGVybmFsbHkgdmlzaWJsZS4gICovCisgIFRSRUVfUFVCTElDIChkZWNsKSA9 IDE7CisgIERFQ0xfVU5JTkxJTkFCTEUgKGRlY2wpID0gMTsKKworICBERUNM X0VYVEVSTkFMIChkZWNsKSA9IERFQ0xfRVhURVJOQUwgKGRlZmF1bHRfZGVj bCk7CisgIERFQ0xfRVhURVJOQUwgKGlmdW5jX2RlY2wpID0gMDsKKworICBE RUNMX0NPTlRFWFQgKGRlY2wpID0gTlVMTF9UUkVFOworICBERUNMX0lOSVRJ QUwgKGRlY2wpID0gbWFrZV9ub2RlIChCTE9DSyk7CisgIERFQ0xfU1RBVElD X0NPTlNUUlVDVE9SIChkZWNsKSA9IDA7CisgIFRSRUVfUkVBRE9OTFkgKGRl Y2wpID0gMDsKKyAgREVDTF9QVVJFX1AgKGRlY2wpID0gMDsKKyAgREVDTF9D T01EQVQgKGRlY2wpID0gREVDTF9DT01EQVQgKGRlZmF1bHRfZGVjbCk7Cisg IGlmIChERUNMX0NPTURBVF9HUk9VUCAoZGVmYXVsdF9kZWNsKSkKKyAgICB7 CisgICAgICBtYWtlX2RlY2xfb25lX29ubHkgKGRlY2wsIERFQ0xfQ09NREFU X0dST1VQIChkZWZhdWx0X2RlY2wpKTsKKyAgICB9CisgIC8qIEJ1aWxkIHJl c3VsdCBkZWNsIGFuZCBhZGQgdG8gZnVuY3Rpb25fZGVjbC4gKi8KKyAgdCA9 IGJ1aWxkX2RlY2wgKFVOS05PV05fTE9DQVRJT04sIFJFU1VMVF9ERUNMLCBO VUxMX1RSRUUsIHB0cl90eXBlX25vZGUpOworICBERUNMX0FSVElGSUNJQUwg KHQpID0gMTsKKyAgREVDTF9JR05PUkVEX1AgKHQpID0gMTsKKyAgREVDTF9S RVNVTFQgKGRlY2wpID0gdDsKKworICBnaW1wbGlmeV9mdW5jdGlvbl90cmVl IChkZWNsKTsKKyAgb2xkX2N1cnJlbnRfZnVuY3Rpb25fZGVjbCA9IGN1cnJl bnRfZnVuY3Rpb25fZGVjbDsKKyAgcHVzaF9jZnVuIChERUNMX1NUUlVDVF9G VU5DVElPTiAoZGVjbCkpOworICBjdXJyZW50X2Z1bmN0aW9uX2RlY2wgPSBk ZWNsOworICBpbml0X2VtcHR5X3RyZWVfY2ZnX2Zvcl9mdW5jdGlvbiAoREVD TF9TVFJVQ1RfRlVOQ1RJT04gKGRlY2wpKTsKKyAgY2Z1bi0+Y3Vycl9wcm9w ZXJ0aWVzIHw9CisgICAgKFBST1BfZ2ltcGxlX2xjZiB8IFBST1BfZ2ltcGxl X2xlaCB8IFBST1BfY2ZnIHwgUFJPUF9yZWZlcmVuY2VkX3ZhcnMgfAorICAg ICBQUk9QX3NzYSk7CisgIG5ld19iYiA9IGNyZWF0ZV9lbXB0eV9iYiAoRU5U UllfQkxPQ0tfUFRSKTsKKyAgbWFrZV9lZGdlIChFTlRSWV9CTE9DS19QVFIs IG5ld19iYiwgRURHRV9GQUxMVEhSVSk7CisgIG1ha2VfZWRnZSAobmV3X2Ji LCBFWElUX0JMT0NLX1BUUiwgMCk7CisgICplbXB0eV9iYiA9IG5ld19iYjsK KworICBjZ3JhcGhfYWRkX25ld19mdW5jdGlvbiAoZGVjbCwgdHJ1ZSk7Cisg IGNncmFwaF9jYWxsX2Z1bmN0aW9uX2luc2VydGlvbl9ob29rcyAoY2dyYXBo X2dldF9jcmVhdGVfbm9kZSAoZGVjbCkpOworICBjZ3JhcGhfbWFya19mb3Jj ZV9vdXRwdXRfbm9kZSAoY2dyYXBoX2dldF9jcmVhdGVfbm9kZSAoZGVjbCkp OworCisgIGlmIChERUNMX0NPTURBVF9HUk9VUCAoZGVmYXVsdF9kZWNsKSkK KyAgICB7CisgICAgICBnY2NfYXNzZXJ0IChjZ3JhcGhfZ2V0X25vZGUgKGRl ZmF1bHRfZGVjbCkpOworICAgICAgY2dyYXBoX2FkZF90b19zYW1lX2NvbWRh dF9ncm91cCAoY2dyYXBoX2dldF9ub2RlIChkZWNsKSwKKwkJCQkgICAgICAg Y2dyYXBoX2dldF9ub2RlIChkZWZhdWx0X2RlY2wpKTsKKyAgICB9CisKKyAg cG9wX2NmdW4gKCk7CisgIGN1cnJlbnRfZnVuY3Rpb25fZGVjbCA9IG9sZF9j dXJyZW50X2Z1bmN0aW9uX2RlY2w7CisKKyAgZ2NjX2Fzc2VydCAoaWZ1bmNf ZGVjbCAhPSBOVUxMKTsKKyAgLyogTWFyayBpZnVuY19kZWNsIGFzICJpZnVu YyIgd2l0aCByZXNvbHZlciBhcyByZXNvbHZlcl9uYW1lLiAgKi8KKyAgREVD TF9BVFRSSUJVVEVTIChpZnVuY19kZWNsKSAKKyAgICA9IG1ha2VfYXR0cmli dXRlICgiaWZ1bmMiLCByZXNvbHZlcl9uYW1lLCBERUNMX0FUVFJJQlVURVMg KGlmdW5jX2RlY2wpKTsKKworICAvKiBDcmVhdGUgdGhlIGFsaWFzIGhlcmUu ICAqLworICBjZ3JhcGhfY3JlYXRlX2Z1bmN0aW9uX2FsaWFzIChpZnVuY19k ZWNsLCBkZWNsKTsKKyAgcmV0dXJuIGRlY2w7Cit9CisKKy8qIE1ha2UgYW5k IGlmdW5jIGRlY2xhcmF0aW9uIGZvciB0aGUgbXVsdGktdmVyc2lvbmVkIGZ1 bmN0aW9uIERFQ0wuICBDYWxscyB0bworICAgREVDTCBmdW5jdGlvbiB3aWxs IGJlIHJlcGxhY2VkIHdpdGggY2FsbHMgdG8gdGhlIGlmdW5jLiAgIFJldHVy biB0aGUgZGVjbAorICAgb2YgdGhlIGlmdW5jIGNyZWF0ZWQuICAqLworCitz dGF0aWMgdHJlZQorbWFrZV9pZnVuY19mdW5jIChjb25zdCB0cmVlIGRlY2wp Cit7CisgIHRyZWUgaWZ1bmNfZGVjbDsKKyAgY2hhciAqaWZ1bmNfbmFtZSwg KnJlc29sdmVyX25hbWU7CisgIHRyZWUgZm5fdHlwZSwgaWZ1bmNfdHlwZTsK KyAgYm9vbCBtYWtlX3VuaXF1ZSA9IGZhbHNlOworCisgIGlmIChUUkVFX1BV QkxJQyAoZGVjbCkgPT0gMCkKKyAgICBtYWtlX3VuaXF1ZSA9IHRydWU7CisK KyAgaWZ1bmNfbmFtZSA9IG1ha2VfbmFtZSAoZGVjbCwgImlmdW5jIiwgbWFr ZV91bmlxdWUpOworICByZXNvbHZlcl9uYW1lID0gbWFrZV9uYW1lIChkZWNs LCAicmVzb2x2ZXIiLCBtYWtlX3VuaXF1ZSk7CisgIGdjY19hc3NlcnQgKHJl c29sdmVyX25hbWUpOworCisgIGZuX3R5cGUgPSBUUkVFX1RZUEUgKGRlY2wp OworICBpZnVuY190eXBlID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoVFJFRV9U WVBFIChmbl90eXBlKSwKKwkJCQkgICAgVFlQRV9BUkdfVFlQRVMgKGZuX3R5 cGUpKTsKKyAgCisgIGlmdW5jX2RlY2wgPSBidWlsZF9mbl9kZWNsIChpZnVu Y19uYW1lLCBpZnVuY190eXBlKTsKKyAgVFJFRV9VU0VEIChpZnVuY19kZWNs KSA9IDE7CisgIERFQ0xfQ09OVEVYVCAoaWZ1bmNfZGVjbCkgPSBOVUxMX1RS RUU7CisgIERFQ0xfSU5JVElBTCAoaWZ1bmNfZGVjbCkgPSBlcnJvcl9tYXJr X25vZGU7CisgIERFQ0xfQVJUSUZJQ0lBTCAoaWZ1bmNfZGVjbCkgPSAxOwor ICAvKiBNYXJrIHRoaXMgaWZ1bmMgYXMgZXh0ZXJuYWwsIHRoZSByZXNvbHZl ciB3aWxsIGZsaXAgaXQgYWdhaW4gaWYKKyAgICAgaXQgZ2V0cyBnZW5lcmF0 ZWQuICAqLworICBERUNMX0VYVEVSTkFMIChpZnVuY19kZWNsKSA9IDE7Cisg IC8qIElGVU5DcyBoYXZlIHRvIGJlIGV4dGVybmFsbHkgdmlzaWJsZS4gICov CisgIFRSRUVfUFVCTElDIChpZnVuY19kZWNsKSA9IDE7CisKKyAgcmV0dXJu IGlmdW5jX2RlY2w7ICAKK30KKworLyogRm9yIG11bHRpLXZlcnNpb25lZCBm dW5jdGlvbiBkZWNsLCB3aGljaCBzaG91bGQgYWxzbyBiZSB0aGUgZGVmYXVs dCwKKyAgIHJldHVybiB0aGUgZGVjbCBvZiB0aGUgaWZ1bmMgcmVzb2x2ZXIs IGNyZWF0ZSBpdCBpZiBpdCBkb2VzIG5vdAorICAgZXhpc3QuICAqLworCit0 cmVlCitnZXRfaWZ1bmNfZm9yX3ZlcnNpb24gKGNvbnN0IHRyZWUgZGVjbCkK K3sKKyAgdmVyc2lvbl9mdW5jdGlvbiAqZGVjbF92OworICBpbnQgaXg7Cisg IHZvaWRfcCBlbGU7CisKKyAgLyogREVDTCBoYXMgdG8gYmUgdGhlIGRlZmF1 bHQgdmVyc2lvbiwgb3RoZXJ3aXNlIGl0IGlzIG1pc3NpbmcgYW5kCisgICAg IHRoYXQgaXMgbm90IGFsbG93ZWQuICAqLworICBpZiAoIWlzX2RlZmF1bHRf ZnVuY3Rpb24gKGRlY2wpKQorICAgIHsKKyAgICAgIGVycm9yX2F0IChERUNM X1NPVVJDRV9MT0NBVElPTiAoZGVjbCksICJEZWZhdWx0IHZlcnNpb24gbm90 IGZvdW5kIik7CisgICAgICByZXR1cm4gZGVjbDsKKyAgICB9CisKKyAgZGVj bF92ID0gZmluZF9mdW5jdGlvbl92ZXJzaW9uIChkZWNsKTsKKyAgZ2NjX2Fz c2VydCAoZGVjbF92ICE9IE5VTEwpOworICBpZiAoZGVjbF92LT5pZnVuY19k ZWNsID09IE5VTEwpCisgICAgeworICAgICAgdHJlZSBpZnVuY19kZWNsOwor ICAgICAgaWZ1bmNfZGVjbCA9IG1ha2VfaWZ1bmNfZnVuYyAoZGVjbCk7Cisg ICAgICBkZWNsX3YtPmlmdW5jX2RlY2wgPSBpZnVuY19kZWNsOworICAgIH0K KworICBpZiAoY2dyYXBoX2dldF9ub2RlIChkZWNsKSkKKyAgICBjZ3JhcGhf bWFya19mb3JjZV9vdXRwdXRfbm9kZSAoY2dyYXBoX2dldF9ub2RlIChkZWNs KSk7CisKKyAgZm9yIChpeCA9IDA7IFZFQ19pdGVyYXRlICh2b2lkX3AsIGRl Y2xfdi0+dmVyc2lvbnMsIGl4LCBlbGUpOyArK2l4KQorICAgIHsKKyAgICAg IHZlcnNpb25fZnVuY3Rpb24gKnYgPSAodmVyc2lvbl9mdW5jdGlvbiAqKSBl bGU7CisgICAgICAvKiBUaGlzIGNvdWxkIGJlIGEgZGVsZXRlZCB2ZXJzaW9u LiAgSGFwcGVucyB3aXRoCisJIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMuICov CisgICAgICBpZiAodi0+aXNfZGVsZXRlZCkKKwljb250aW51ZTsKKyAgICAg IGdjY19hc3NlcnQgKHYtPmRlY2wgIT0gTlVMTCk7CisgICAgICBpZiAoY2dy YXBoX2dldF9ub2RlICh2LT5kZWNsKSkKKwljZ3JhcGhfbWFya19mb3JjZV9v dXRwdXRfbm9kZSAoY2dyYXBoX2dldF9ub2RlICh2LT5kZWNsKSk7CisgICAg fQorCisgIHJldHVybiBkZWNsX3YtPmlmdW5jX2RlY2w7Cit9CisKKy8qIEdl bmVyYXRlIHRoZSBkaXNwYXRjaGluZyBjb2RlIHRvIGRpc3BhdGNoIG11bHRp LXZlcnNpb25lZCBmdW5jdGlvbgorICAgREVDTC4gIE1ha2UgYSBuZXcgZnVu Y3Rpb24gZGVjbCBmb3IgZGlzcGF0Y2hpbmcgYW5kIGNhbGwgdGhlIHRhcmdl dAorICAgaG9vayB0byBwcm9jZXNzIHRoZSAidGFyZ2V0IiBhdHRyaWJ1dGVz IGFuZCBwcm92aWRlIHRoZSBjb2RlIHRvCisgICBkaXNwYXRjaCB0aGUgcmln aHQgZnVuY3Rpb24gYXQgcnVuLXRpbWUuICAqLworCitzdGF0aWMgdHJlZQor bWFrZV9pZnVuY19yZXNvbHZlcl9mb3JfdmVyc2lvbiAoY29uc3QgdHJlZSBk ZWNsKQoreworICB2ZXJzaW9uX2Z1bmN0aW9uICpkZWNsX3Y7CisgIHRyZWUg aWZ1bmNfcmVzb2x2ZXJfZGVjbCwgaWZ1bmNfZGVjbDsKKyAgYmFzaWNfYmxv Y2sgZW1wdHlfYmI7CisgIGludCBpeDsKKyAgdm9pZF9wIGVsZTsKKyAgVkVD ICh0cmVlLCBoZWFwKSAqZm5fdmVyX3ZlYyA9IE5VTEw7CisgIHRyZWUgb2xk X2N1cnJlbnRfZnVuY3Rpb25fZGVjbDsKKworICBnY2NfYXNzZXJ0IChpc19k ZWZhdWx0X2Z1bmN0aW9uIChkZWNsKSk7CisKKyAgZGVjbF92ID0gZmluZF9m dW5jdGlvbl92ZXJzaW9uIChkZWNsKTsKKyAgZ2NjX2Fzc2VydCAoZGVjbF92 ICE9IE5VTEwpOworCisgIGlmIChkZWNsX3YtPmlmdW5jX3Jlc29sdmVyX2Rl Y2wgIT0gTlVMTCkKKyAgICByZXR1cm4gZGVjbF92LT5pZnVuY19yZXNvbHZl cl9kZWNsOworCisgIGlmdW5jX2RlY2wgPSBkZWNsX3YtPmlmdW5jX2RlY2w7 CisKKyAgaWYgKGlmdW5jX2RlY2wgPT0gTlVMTCkKKyAgICBpZnVuY19kZWNs ID0gZGVjbF92LT5pZnVuY19kZWNsID0gbWFrZV9pZnVuY19mdW5jIChkZWNs KTsKKworICBpZnVuY19yZXNvbHZlcl9kZWNsID0gbWFrZV9pZnVuY19yZXNv bHZlcl9mdW5jIChkZWNsLCBpZnVuY19kZWNsLAorCQkJCQkJICAmZW1wdHlf YmIpOworCisgIG9sZF9jdXJyZW50X2Z1bmN0aW9uX2RlY2wgPSBjdXJyZW50 X2Z1bmN0aW9uX2RlY2w7CisgIHB1c2hfY2Z1biAoREVDTF9TVFJVQ1RfRlVO Q1RJT04gKGlmdW5jX3Jlc29sdmVyX2RlY2wpKTsKKyAgY3VycmVudF9mdW5j dGlvbl9kZWNsID0gaWZ1bmNfcmVzb2x2ZXJfZGVjbDsKKworICBmbl92ZXJf dmVjID0gVkVDX2FsbG9jICh0cmVlLCBoZWFwLCAyKTsKKyAgVkVDX3NhZmVf cHVzaCAodHJlZSwgaGVhcCwgZm5fdmVyX3ZlYywgZGVjbCk7CisKKyAgZm9y IChpeCA9IDA7IFZFQ19pdGVyYXRlICh2b2lkX3AsIGRlY2xfdi0+dmVyc2lv bnMsIGl4LCBlbGUpOyArK2l4KQorICAgIHsKKyAgICAgIHZlcnNpb25fZnVu Y3Rpb24gKnYgPSAodmVyc2lvbl9mdW5jdGlvbiAqKSBlbGU7CisgICAgICBn Y2NfYXNzZXJ0ICh2LT5kZWNsICE9IE5VTEwpOworICAgICAgLyogQ2hlY2sg Zm9yIHZpcnR1YWwgZnVuY3Rpb25zIGhlcmUgYWdhaW4sIGFzIGJ5IHRoaXMg dGltZSBpdCBzaG91bGQKKwkgaGF2ZSBiZWVuIGRldGVybWluZWQgaWYgdGhp cyBmdW5jdGlvbiBuZWVkcyBhIHZ0YWJsZSBpbmRleCBvcgorCSBub3QuICBU aGlzIGhhcHBlbnMgZm9yIG1ldGhvZHMgaW4gZGVyaXZlZCBjbGFzc2VzIHRo YXQgb3ZlcnJpZGUKKwkgdmlydHVhbCBtZXRob2RzIGluIGJhc2UgY2xhc3Nl cyBidXQgYXJlIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBhcworCSB2aXJ0dWFs LiAgKi8KKyAgICAgIGlmIChERUNMX1ZJTkRFWCAodi0+ZGVjbCkpCisgICAg ICAgIGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAodi0+ZGVjbCks CisJCSAgIlZpcnR1YWwgZnVuY3Rpb24gdmVyc2lvbmluZyBub3Qgc3VwcG9y dGVkXG4iKTsKKyAgICAgIGlmICghdi0+aXNfZGVsZXRlZCkKKwlWRUNfc2Fm ZV9wdXNoICh0cmVlLCBoZWFwLCBmbl92ZXJfdmVjLCB2LT5kZWNsKTsKKyAg ICB9CisKKyAgZ2NjX2Fzc2VydCAodGFyZ2V0bS5kaXNwYXRjaF92ZXJzaW9u KTsKKyAgdGFyZ2V0bS5kaXNwYXRjaF92ZXJzaW9uIChpZnVuY19yZXNvbHZl cl9kZWNsLCBmbl92ZXJfdmVjLCAmZW1wdHlfYmIpOworICBkZWNsX3YtPmlm dW5jX3Jlc29sdmVyX2RlY2wgPSBpZnVuY19yZXNvbHZlcl9kZWNsOworCisg IHBvcF9jZnVuICgpOworICBjdXJyZW50X2Z1bmN0aW9uX2RlY2wgPSBvbGRf Y3VycmVudF9mdW5jdGlvbl9kZWNsOworICByZXR1cm4gaWZ1bmNfcmVzb2x2 ZXJfZGVjbDsKK30KKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBwYXNzX2Rp c3BhdGNoX3ZlcnNpb25zLiBGb3IgbXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9u cywKKyAgIGdlbmVyYXRlIHRoZSBkaXNwYXRjaGluZyBjb2RlLiAgKi8KKwor c3RhdGljIHVuc2lnbmVkIGludAorZG9fZGlzcGF0Y2hfdmVyc2lvbnMgKHZv aWQpCit7CisgIC8qIEEgbmV3IHBhc3MgZm9yIGdlbmVyYXRpbmcgZGlzcGF0 Y2ggY29kZSBmb3IgbXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9ucy4KKyAgICAg T3RoZXIgZm9ybXMgb2YgZGlzcGF0Y2ggY2FuIGJlIGFkZGVkIHdoZW4gaWZ1 bmMgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlCisgICAgIGxpa2UganVzdCBj YWxsaW5nIHRoZSBmdW5jdGlvbiBkaXJlY3RseSBhZnRlciBjaGVja2luZyBm b3IgdGFyZ2V0IHR5cGUuCisgICAgIEN1cnJlbnRseSwgZGlzcGF0Y2hpbmcg aXMgZG9uZSB0aHJvdWdoIElGVU5DLiAgVGhpcyBwYXNzIHdpbGwgYmVjb21l CisgICAgIG1vcmUgbWVhbmluZ2Z1bCB3aGVuIG90aGVyIGRpc3BhdGNoIG1l Y2hhbmlzbXMgYXJlIGFkZGVkLiAgKi8KKworICAvKiBDbG9uaW5nIGEgZnVu Y3Rpb24gdG8gcHJvZHVjZSBtb3JlIHZlcnNpb25zIHdpbGwgaGFwcGVuIGhl cmUgd2hlbiB0aGUKKyAgICAgdXNlciByZXF1ZXN0cyB0aGF0IHZpYSB0aGUg dGFyZ2V0IGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGUsCisgICAgIGludCBmb28g KCkgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgoImFyY2g9Y29yZTIiKSwgKCJh cmNoPWNvcmVpNyIpKSkpOworICAgICBtZWFucyB0aGF0IHRoZSB1c2VyIHdh bnRzIHRoZSBzYW1lIGJvZHkgb2YgZm9vIHRvIGJlIHZlcnNpb25lZCBmb3Ig Y29yZTIKKyAgICAgYW5kIGNvcmVpNy4gIEluIHRoYXQgY2FzZSwgdGhpcyBm dW5jdGlvbiB3aWxsIGJlIGNsb25lZCBkdXJpbmcgdGhpcworICAgICBwYXNz LiAgKi8KKyAgCisgIGlmIChERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAoY3Vy cmVudF9mdW5jdGlvbl9kZWNsKQorICAgICAgJiYgaXNfZGVmYXVsdF9mdW5j dGlvbiAoY3VycmVudF9mdW5jdGlvbl9kZWNsKSkKKyAgICB7CisgICAgICB0 cmVlIGRlY2wgPSBtYWtlX2lmdW5jX3Jlc29sdmVyX2Zvcl92ZXJzaW9uIChj dXJyZW50X2Z1bmN0aW9uX2RlY2wpOworICAgICAgaWYgKGR1bXBfZmlsZSAm JiBkZWNsKQorCWR1bXBfZnVuY3Rpb25fdG9fZmlsZSAoZGVjbCwgZHVtcF9m aWxlLCBUREZfQkxPQ0tTKTsKKyAgICB9CisgIHJldHVybiAwOworfQorCitz dGF0aWMgIGJvb2wKK2dhdGVfZGlzcGF0Y2hfdmVyc2lvbnMgKHZvaWQpCit7 CisgIHJldHVybiB0cnVlOworfQorCisvKiBBIHBhc3MgdG8gZ2VuZXJhdGUg dGhlIGRpc3BhdGNoIGNvZGUgdG8gZXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUg dmVyc2lvbgorICAgb2YgYSBtdWx0aS12ZXJzaW9uZWQgZnVuY3Rpb24gYXQg cnVuLXRpbWUuICAqLworCitzdHJ1Y3QgZ2ltcGxlX29wdF9wYXNzIHBhc3Nf ZGlzcGF0Y2hfdmVyc2lvbnMgPQoreworIHsKKyAgR0lNUExFX1BBU1MsCisg ICJkaXNwYXRjaF9tdWx0aXZlcnNpb25fZnVuY3Rpb25zIiwgICAgLyogbmFt ZSAqLworICBnYXRlX2Rpc3BhdGNoX3ZlcnNpb25zLAkJLyogZ2F0ZSAqLwor ICBkb19kaXNwYXRjaF92ZXJzaW9ucywJCQkvKiBleGVjdXRlICovCisgIE5V TEwsCQkJCQkvKiBzdWIgKi8KKyAgTlVMTCwJCQkJCS8qIG5leHQgKi8KKyAg MCwJCQkJCS8qIHN0YXRpY19wYXNzX251bWJlciAqLworICBUVl9NVUxUSVZF UlNJT05fRElTUEFUQ0gsCQkvKiB0dl9pZCAqLworICBQUk9QX2NmZywJCQkJ LyogcHJvcGVydGllc19yZXF1aXJlZCAqLworICBQUk9QX2NmZywJCQkJLyog cHJvcGVydGllc19wcm92aWRlZCAqLworICAwLAkJCQkJLyogcHJvcGVydGll c19kZXN0cm95ZWQgKi8KKyAgMCwJCQkJCS8qIHRvZG9fZmxhZ3Nfc3RhcnQg Ki8KKyAgMAkJCQkJLyogdG9kb19mbGFnc19maW5pc2ggKi8KKyB9Cit9OwpJ bmRleDogZ2NjL2NncmFwaHVuaXQuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBnY2MvY2dyYXBodW5pdC5jCShyZXZpc2lvbiAxODY4ODMpCisrKyBn Y2MvY2dyYXBodW5pdC5jCSh3b3JraW5nIGNvcHkpCkBAIC00MTEsNiArNDEx LDEzIEBAIGNncmFwaF9maW5hbGl6ZV9mdW5jdGlvbiAodHJlZSBkZWNsLCBi b29sIG5lc3RlZCkKICAgICAgICYmICFERUNMX0RJU1JFR0FSRF9JTkxJTkVf TElNSVRTIChkZWNsKSkKICAgICBub2RlLT5zeW1ib2wuZm9yY2Vfb3V0cHV0 ID0gMTsKIAorICAvKiBXaXRoIGZ1bmN0aW9uIHZlcnNpb25zLCBrZWVwIGlu bGluZSBmdW5jdGlvbnMgYW5kIGRvIG5vdCB3b3JyeSBhYm91dAorICAgICBp bmxpbmUgbGltaXRzLiAgKi8KKyAgaWYgKERFQ0xfRlVOQ1RJT05fVkVSU0lP TkVEIChkZWNsKQorICAgICAgJiYgREVDTF9ERUNMQVJFRF9JTkxJTkVfUCAo ZGVjbCkKKyAgICAgICYmICFERUNMX0VYVEVSTkFMIChkZWNsKSkKKyAgICBu b2RlLT5zeW1ib2wuZm9yY2Vfb3V0cHV0ID0gMTsKKwogICAvKiBXaGVuIG5v dCBvcHRpbWl6aW5nLCBhbHNvIG91dHB1dCB0aGUgc3RhdGljIGZ1bmN0aW9u cy4gKHNlZQogICAgICBQUjI0NTYxKSwgYnV0IGRvbid0IGRvIHNvIGZvciBh bHdheXNfaW5saW5lIGZ1bmN0aW9ucywgZnVuY3Rpb25zCiAgICAgIGRlY2xh cmVkIGlubGluZSBhbmQgbmVzdGVkIGZ1bmN0aW9ucy4gIFRoZXNlIHdlcmUg b3B0aW1pemVkIG91dApJbmRleDogZ2NjL211bHRpdmVyc2lvbi5oCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9tdWx0aXZlcnNpb24uaAkocmV2 aXNpb24gMCkKKysrIGdjYy9tdWx0aXZlcnNpb24uaAkocmV2aXNpb24gMCkK QEAgLTAsMCArMSw1NSBAQAorLyogRnVuY3Rpb24gTXVsdGl2ZXJzaW9uaW5n LgorICAgQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgU3JpcmFtYW4gVGFsbGFt ICh0bXNyaXJhbUBnb29nbGUuY29tKQorCitUaGlzIGZpbGUgaXMgcGFydCBv ZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNp b24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRB QklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3Jl IGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRo IEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAqLworCisvKiBUaGlzIGlz IHRoZSBoZWFkZXIgZmlsZSB3aGljaCBwcm92aWRlcyB0aGUgZnVuY3Rpb25z IHRvIGtlZXAgdHJhY2sKKyAgIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSBtdWx0 aS12ZXJzaW9uZWQgYW5kIHRvIGdlbmVyYXRlIHRoZSBkaXNwYXRjaAorICAg Y29kZSB0byBjYWxsIHRoZSByaWdodCB2ZXJzaW9uIGF0IHJ1bi10aW1lLiAg Ki8KKworI2lmbmRlZiBHQ0NfTVVMVElWRVJTSU9OX0gKKyNkZWZpbmUgR0ND X01VTFRJVkVSSU9OX0gKKworI2luY2x1ZGUgInRyZWUuaCIKKworLyogTWFy ayBERUNMMSBhbmQgREVDTDIgYXMgZnVuY3Rpb24gdmVyc2lvbnMuICAqLwor aW50IGdyb3VwX2Z1bmN0aW9uX3ZlcnNpb25zIChjb25zdCB0cmVlIGRlY2wx LCBjb25zdCB0cmVlIGRlY2wyKTsKKworLyogTWFyayBERUNMIGFzIGRlbGV0 ZWQgYW5kIG5vIGxvbmdlciBhIHZlcnNpb24uICAqLwordm9pZCBtYXJrX2Rl bGV0ZV9kZWNsX3ZlcnNpb24gKGNvbnN0IHRyZWUgZGVjbCk7CisKKy8qIFJl dHVybnMgdHJ1ZSBpZiBERUNMIGlzIHRoZSBkZWZhdWx0IHZlcnNpb24gdG8g YmUgZXhlY3V0ZWQgaWYgYWxsCisgICBvdGhlciB2ZXJzaW9ucyBhcmUgaW5h cHByb3ByaWF0ZSBhdCBydW4tdGltZS4gICovCitib29sIGlzX2RlZmF1bHRf ZnVuY3Rpb24gKGNvbnN0IHRyZWUgZGVjbCk7CisKKy8qIEdldHMgdGhlIElG VU5DIGRpc3BhdGNoZXIgZm9yIHRoaXMgbXVsdGktdmVyc2lvbmVkIGZ1bmN0 aW9uIERFQ0wuIERFQ0wKKyAgIG11c3QgYmUgdGhlIGRlZmF1bHQgZnVuY3Rp b24gaW4gdGhlIG11bHRpLXZlcnNpb25lZCBncm91cC4gICovCit0cmVlIGdl dF9pZnVuY19mb3JfdmVyc2lvbiAoY29uc3QgdHJlZSBkZWNsKTsKKworLyog UmV0dXJucyB0cnVlIHdoZW4gb25seSBvbmUgb2YgREVDTDEgYW5kIERFQ0wy IGlzIG1hcmtlZCB3aXRoICJ0YXJnZXQiCisgICBvciBpZiB0aGUgInRhcmdl dCIgYXR0cmlidXRlIHN0cmluZ3Mgb2YgIERFQ0wxIGFuZCBERUNMMiBkb250 IG1hdGNoLiAgKi8KK2Jvb2wgaGFzX2RpZmZlcmVudF92ZXJzaW9uX2F0dHJp YnV0ZXMgKGNvbnN0IHRyZWUgZGVjbDEsIGNvbnN0IHRyZWUgZGVjbDIpOwor CisvKiBGdW5jdGlvbiBERUNMIGlzIG1hcmtlZCB0byBiZSBhIG11bHRpLXZl cnNpb25lZCBmdW5jdGlvbi4gIElmIERFQ0wgaXMKKyAgIG5vdCB0aGUgZGVm YXVsdCB2ZXJzaW9uLCB0aGUgYXNzZW1ibGVyIG5hbWUgb2YgREVDTCBpcyBj aGFuZ2VkIHRvIGluY2x1ZGUKKyAgIHRoZSBhdHRyaWJ1dGUgc3RyaW5nIHRv IGtlZXAgdGhlIG5hbWUgdW5hbWJpZ3VvdXMuICAqLwordm9pZCBtYXJrX2Z1 bmN0aW9uX2FzX3ZlcnNpb24gKGNvbnN0IHRyZWUgZGVjbCk7CisKKy8qIENo ZWNrIGlmIGRlY2wgaXMgRlVOQ1RJT05fREVDTCB3aXRoIHRhcmdldCBhdHRy aWJ1dGUgc2V0LiAgKi8KK2Jvb2wgaXNfdGFyZ2V0X2F0dHJpYnV0ZV9zZXQg KGNvbnN0IHRyZWUgZGVjbCk7CisjZW5kaWYKSW5kZXg6IGdjYy9jcC9jbGFz cy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jcC9jbGFzcy5j CShyZXZpc2lvbiAxODY4ODMpCisrKyBnY2MvY3AvY2xhc3MuYwkod29ya2lu ZyBjb3B5KQpAQCAtMzgsNiArMzgsNyBAQCBhbG9uZyB3aXRoIEdDQzsgc2Vl IHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgInRy ZWUtZHVtcC5oIgogI2luY2x1ZGUgInNwbGF5LXRyZWUuaCIKICNpbmNsdWRl ICJwb2ludGVyLXNldC5oIgorI2luY2x1ZGUgIm11bHRpdmVyc2lvbi5oIgog CiAvKiBUaGUgbnVtYmVyIG9mIG5lc3RlZCBjbGFzc2VzIGJlaW5nIHByb2Nl c3NlZC4gIElmIHdlIGFyZSBub3QgaW4gdGhlCiAgICBzY29wZSBvZiBhbnkg Y2xhc3MsIHRoaXMgaXMgemVyby4gICovCkBAIC0xMDkyLDcgKzEwOTMsMjEg QEAgYWRkX21ldGhvZCAodHJlZSB0eXBlLCB0cmVlIG1ldGhvZCwgdHJlZSB1 c2luZ19kZWMKIAkgICAgICB8fCBzYW1lX3R5cGVfcCAoVFJFRV9UWVBFIChm bl90eXBlKSwKIAkJCSAgICAgIFRSRUVfVFlQRSAobWV0aG9kX3R5cGUpKSkp CiAJewotCSAgaWYgKHVzaW5nX2RlY2wpCisJICAvKiBGb3IgZnVuY3Rpb24g dmVyc2lvbnMsIHRoZWlyIHBhcm1zIGFuZCB0eXBlcyBtYXRjaAorCSAgICAg YnV0IHRoZXkgYXJlIG5vdCBkdXBsaWNhdGVzLiAgUmVjb3JkIGZ1bmN0aW9u IHZlcnNpb25zCisJICAgICBhcyBhbmQgd2hlbiB0aGV5IGFyZSBmb3VuZC4g ICovCisJICBpZiAoVFJFRV9DT0RFIChmbikgPT0gRlVOQ1RJT05fREVDTAor CSAgICAgICYmIFRSRUVfQ09ERSAobWV0aG9kKSA9PSBGVU5DVElPTl9ERUNM CisJICAgICAgJiYgKGlzX3RhcmdldF9hdHRyaWJ1dGVfc2V0IChmbikKKwkJ ICB8fCBpc190YXJnZXRfYXR0cmlidXRlX3NldCAobWV0aG9kKSkKKwkgICAg ICAmJiBoYXNfZGlmZmVyZW50X3ZlcnNpb25fYXR0cmlidXRlcyAoZm4sIG1l dGhvZCkpCisgCSAgICB7CisJICAgICAgbWFya19mdW5jdGlvbl9hc192ZXJz aW9uIChmbik7CisJICAgICAgbWFya19mdW5jdGlvbl9hc192ZXJzaW9uICht ZXRob2QpOworCSAgICAgIGdyb3VwX2Z1bmN0aW9uX3ZlcnNpb25zIChmbiwg bWV0aG9kKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgZWxzZSBp ZiAodXNpbmdfZGVjbCkKIAkgICAgewogCSAgICAgIGlmIChERUNMX0NPTlRF WFQgKGZuKSA9PSB0eXBlKQogCQkvKiBEZWZlciB0byB0aGUgbG9jYWwgZnVu Y3Rpb24uICAqLwpAQCAtMTE1MCw2ICsxMTY1LDcgQEAgYWRkX21ldGhvZCAo dHJlZSB0eXBlLCB0cmVlIG1ldGhvZCwgdHJlZSB1c2luZ19kZWMKICAgZWxz ZQogICAgIC8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgc2xvdC4gICovCiAgICAg VkVDX3JlcGxhY2UgKHRyZWUsIG1ldGhvZF92ZWMsIHNsb3QsIG92ZXJsb2Fk KTsKKwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNjkzMCw4ICs2OTQ2LDEx IEBAIHJlc29sdmVfYWRkcmVzc19vZl9vdmVybG9hZGVkX2Z1bmN0aW9uICh0 cmVlIHRhcmdlCiAJICBpZiAoREVDTF9BTlRJQ0lQQVRFRCAoZm4pKQogCSAg ICBjb250aW51ZTsKIAotCSAgLyogU2VlIGlmIHRoZXJlJ3MgYSBtYXRjaC4g ICovCi0JICBpZiAoc2FtZV90eXBlX3AgKHRhcmdldF9mbl90eXBlLCBzdGF0 aWNfZm5fdHlwZSAoZm4pKSkKKwkgIC8qIFNlZSBpZiB0aGVyZSdzIGEgbWF0 Y2guICAgRm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBtdWx0aS12ZXJzaW9uZWQK KwkgICAgIG1hdGNoIGl0IHRvIHRoZSBkZWZhdWx0IGZ1bmN0aW9uLiAgKi8K KwkgIGlmIChzYW1lX3R5cGVfcCAodGFyZ2V0X2ZuX3R5cGUsIHN0YXRpY19m bl90eXBlIChmbikpCisJICAgICAgJiYgKCFERUNMX0ZVTkNUSU9OX1ZFUlNJ T05FRCAoZm4pCisJCSAgfHwgaXNfZGVmYXVsdF9mdW5jdGlvbiAoZm4pKSkK IAkgICAgbWF0Y2hlcyA9IHRyZWVfY29ucyAoZm4sIE5VTExfVFJFRSwgbWF0 Y2hlcyk7CiAJfQogICAgIH0KQEAgLTcwOTMsNiArNzExMiwyMiBAQCByZXNv bHZlX2FkZHJlc3Nfb2Zfb3ZlcmxvYWRlZF9mdW5jdGlvbiAodHJlZSB0YXJn ZQogICAgICAgcGVyZm9ybV9vcl9kZWZlcl9hY2Nlc3NfY2hlY2sgKGFjY2Vz c19wYXRoLCBmbiwgZm4pOwogICAgIH0KIAorICAvKiBJZiBhIHBvaW50ZXIg dG8gYSBmdW5jdGlvbiB0aGF0IGlzIG11bHRpLXZlcnNpb25lZCBpcyByZXF1 ZXN0ZWQsIHRoZQorICAgICBwb2ludGVyIHRvIHRoZSBkaXNwYXRjaGVyIGZ1 bmN0aW9uIGlzIHJldHVybmVkIGluc3RlYWQuICBUaGlzIHdvcmtzCisgICAg IHdlbGwgYmVjYXVzZSBpbmRpcmVjdGx5IGNhbGxpbmcgdGhlIGZ1bmN0aW9u IHdpbGwgZGlzcGF0Y2ggdGhlIHJpZ2h0CisgICAgIGZ1bmN0aW9uIHZlcnNp b24gYXQgcnVuLXRpbWUuIEFsc28sIHRoZSBmdW5jdGlvbiBhZGRyZXNzIGlz IGtlcHQKKyAgICAgdW5pcXVlLiAgKi8KKyAgaWYgKERFQ0xfRlVOQ1RJT05f VkVSU0lPTkVEIChmbikKKyAgICAgICYmIGlzX2RlZmF1bHRfZnVuY3Rpb24g KGZuKSkKKyAgICB7CisgICAgICB0cmVlIGlmdW5jX2RlY2w7CisgICAgICBp ZnVuY19kZWNsID0gZ2V0X2lmdW5jX2Zvcl92ZXJzaW9uIChmbik7CisgICAg ICByZXRyb2ZpdF9sYW5nX2RlY2wgKGlmdW5jX2RlY2wpOworICAgICAgZ2Nj X2Fzc2VydCAoaWZ1bmNfZGVjbCAhPSBOVUxMKTsKKyAgICAgIG1hcmtfdXNl ZCAoZm4pOworICAgICAgcmV0dXJuIGJ1aWxkX2ZvbGRfYWRkcl9leHByIChp ZnVuY19kZWNsKTsKKyAgICB9CisKICAgaWYgKFRZUEVfUFRSRk5fUCAodGFy Z2V0X3R5cGUpIHx8IFRZUEVfUFRSTUVNRlVOQ19QICh0YXJnZXRfdHlwZSkp CiAgICAgcmV0dXJuIGNwX2J1aWxkX2FkZHJfZXhwciAoZm4sIGZsYWdzKTsK ICAgZWxzZQpJbmRleDogZ2NjL2NwL2RlY2wuYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09Ci0tLSBnY2MvY3AvZGVjbC5jCShyZXZpc2lvbiAxODY4ODMpCisr KyBnY2MvY3AvZGVjbC5jCSh3b3JraW5nIGNvcHkpCkBAIC01NCw2ICs1NCw3 IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJ ZiBub3Qgc2VlCiAjaW5jbHVkZSAicG9pbnRlci1zZXQuaCIKICNpbmNsdWRl ICJzcGxheS10cmVlLmgiCiAjaW5jbHVkZSAicGx1Z2luLmgiCisjaW5jbHVk ZSAibXVsdGl2ZXJzaW9uLmgiCiAKIC8qIFBvc3NpYmxlIGNhc2VzIG9mIGJh ZCBzcGVjaWZpZXJzIHR5cGUgdXNlZCBieSBiYWRfc3BlY2lmaWVycy4gKi8K IGVudW0gYmFkX3NwZWNfcGxhY2UgewpAQCAtOTczLDYgKzk3NCwyMSBAQCBk ZWNsc19tYXRjaCAodHJlZSBuZXdkZWNsLCB0cmVlIG9sZGRlY2wpCiAgICAg ICBpZiAodDEgIT0gdDIpCiAJcmV0dXJuIDA7CiAKKyAgICAgIC8qIFRoZSBk ZWNscyBkb250IG1hdGNoIGlmIHRoZXkgY29ycmVzcG9uZCB0byB0d28gZGlm ZmVyZW50IHZlcnNpb25zCisJIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLiAgKi8K KyAgICAgIGlmIChjb21wcGFybXMgKHAxLCBwMikKKwkgICYmIHNhbWVfdHlw ZV9wIChUUkVFX1RZUEUgKGYxKSwgVFJFRV9UWVBFIChmMikpIAorCSAgJiYg aGFzX2RpZmZlcmVudF92ZXJzaW9uX2F0dHJpYnV0ZXMgKG5ld2RlY2wsIG9s ZGRlY2wpKQorCXsKKwkgIC8qIE9uZSBvZiB0aGUgZGVjbHMgY291bGQgYmUg dGhlIGRlZmF1bHQgd2l0aG91dCB0aGUgInRhcmdldCIKKwkgICAgIGF0dHJp YnV0ZS4gU2V0IGl0IHRvIGJlIGEgdmVyc2lvbmVkIGZ1bmN0aW9uIGhlcmUu ICAqLworCSAgbWFya19mdW5jdGlvbl9hc192ZXJzaW9uIChuZXdkZWNsKTsK KwkgIG1hcmtfZnVuY3Rpb25fYXNfdmVyc2lvbiAob2xkZGVjbCk7CisJICAv KiBBY2N1bXVsYXRlIGFsbCB0aGUgdmVyc2lvbnMgb2YgYSBmdW5jdGlvbi4g ICovCisJICBncm91cF9mdW5jdGlvbl92ZXJzaW9ucyAob2xkZGVjbCwgbmV3 ZGVjbCk7CisJICByZXR1cm4gMDsKKwl9CisKICAgICAgIGlmIChDUF9ERUNM X0NPTlRFWFQgKG5ld2RlY2wpICE9IENQX0RFQ0xfQ09OVEVYVCAob2xkZGVj bCkKIAkgICYmICEgKERFQ0xfRVhURVJOX0NfUCAobmV3ZGVjbCkKIAkJJiYg REVDTF9FWFRFUk5fQ19QIChvbGRkZWNsKSkpCkBAIC0xNDkwLDcgKzE1MDYs MTEgQEAgZHVwbGljYXRlX2RlY2xzICh0cmVlIG5ld2RlY2wsIHRyZWUgb2xk ZGVjbCwgYm9vbAogCSAgICAgIGVycm9yICgicHJldmlvdXMgZGVjbGFyYXRp b24gJXErI0QgaGVyZSIsIG9sZGRlY2wpOwogCSAgICAgIHJldHVybiBOVUxM X1RSRUU7CiAJICAgIH0KLQkgIGVsc2UgaWYgKGNvbXBwYXJtcyAoVFlQRV9B UkdfVFlQRVMgKFRSRUVfVFlQRSAobmV3ZGVjbCkpLAorCSAgLyogRm9yIGZ1 bmN0aW9uIHZlcnNpb25zLCBwYXJhbXMgYW5kIHR5cGVzIG1hdGNoLCBidXQg dGhleQorCSAgICAgYXJlIG5vdCBhbWJpZ3VvdXMuICAqLworCSAgZWxzZSBp ZiAoKCFERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAobmV3ZGVjbCkKKwkJICAg ICYmICFERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAob2xkZGVjbCkpCisJCSAg ICYmIGNvbXBwYXJtcyAoVFlQRV9BUkdfVFlQRVMgKFRSRUVfVFlQRSAobmV3 ZGVjbCkpLAogCQkJICAgICAgVFlQRV9BUkdfVFlQRVMgKFRSRUVfVFlQRSAo b2xkZGVjbCkpKSkKIAkgICAgewogCSAgICAgIGVycm9yICgibmV3IGRlY2xh cmF0aW9uICVxI0QiLCBuZXdkZWNsKTsKQEAgLTIyNjIsNiArMjI4MiwxNiBA QCBkdXBsaWNhdGVfZGVjbHMgKHRyZWUgbmV3ZGVjbCwgdHJlZSBvbGRkZWNs LCBib29sCiAgIGVsc2UgaWYgKERFQ0xfUFJFU0VSVkVfUCAobmV3ZGVjbCkp CiAgICAgREVDTF9QUkVTRVJWRV9QIChvbGRkZWNsKSA9IDE7CiAKKyAgLyog SWYgdGhlIG9sZGRlY2wgaXMgYSB2ZXJzaW9uLCBzbyBpcyB0aGUgbmV3ZGVj bC4gICovCisgIGlmIChUUkVFX0NPREUgKG5ld2RlY2wpID09IEZVTkNUSU9O X0RFQ0wKKyAgICAgICYmIERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChvbGRk ZWNsKSkKKyAgICB7CisgICAgICBERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAo bmV3ZGVjbCkgPSAxOworICAgICAgLyogUmVjb3JkIHRoYXQgbmV3ZGVjbCBp cyBub3QgYSB2YWxpZCB2ZXJzaW9uIGFuZCBoYXMKKwkgYmVlbiBkZWxldGVk LiAgKi8KKyAgICAgIG1hcmtfZGVsZXRlX2RlY2xfdmVyc2lvbiAobmV3ZGVj bCk7CisgICAgfQorCiAgIGlmIChUUkVFX0NPREUgKG5ld2RlY2wpID09IEZV TkNUSU9OX0RFQ0wpCiAgICAgewogICAgICAgaW50IGZ1bmN0aW9uX3NpemU7 CkBAIC0zODEwLDYgKzM4NDAsNyBAQCBjcF9tYWtlX2ZuYW1lX2RlY2wgKGxv Y2F0aW9uX3QgbG9jLCB0cmVlIGlkLCBpbnQgdAogCQkJICAgID8gTlVMTCA6 IGZuYW1lX2FzX3N0cmluZyAodHlwZV9kZXApKTsKICAgdHJlZSB0eXBlOwog ICB0cmVlIGluaXQgPSBjcF9mbmFtZV9pbml0IChuYW1lLCAmdHlwZSk7CisK ICAgdHJlZSBkZWNsID0gYnVpbGRfZGVjbCAobG9jLCBWQVJfREVDTCwgaWQs IHR5cGUpOwogCiAgIGlmIChuYW1lKQpAQCAtMTQwMzUsNyArMTQwNjYsMTEg QEAgY3h4X2NvbWRhdF9ncm91cCAodHJlZSBkZWNsKQogCSAgZWxzZQogCSAg ICBicmVhazsKIAl9Ci0gICAgICBuYW1lID0gREVDTF9BU1NFTUJMRVJfTkFN RSAoZGVjbCk7CisgICAgICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5D VElPTl9ERUNMCisJICAmJiBERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAoZGVj bCkpCisJbmFtZSA9IERFQ0xfTkFNRSAoZGVjbCk7CisgICAgICBlbHNlCisg ICAgICAgIG5hbWUgPSBERUNMX0FTU0VNQkxFUl9OQU1FIChkZWNsKTsKICAg ICB9CiAKICAgcmV0dXJuIG5hbWU7CkluZGV4OiBnY2MvY3Avc2VtYW50aWNz LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL2NwL3NlbWFudGlj cy5jCShyZXZpc2lvbiAxODY4ODMpCisrKyBnY2MvY3Avc2VtYW50aWNzLmMJ KHdvcmtpbmcgY29weSkKQEAgLTM3ODMsOCArMzc4MywxMSBAQCBleHBhbmRf b3JfZGVmZXJfZm5fMSAodHJlZSBmbikKICAgICAgIC8qIElmIHRoZSB1c2Vy IHdhbnRzIHVzIHRvIGtlZXAgYWxsIGlubGluZSBmdW5jdGlvbnMsIHRoZW4g bWFyawogCSB0aGlzIGZ1bmN0aW9uIGFzIG5lZWRlZCBzbyB0aGF0IGZpbmlz aF9maWxlIHdpbGwgbWFrZSBzdXJlIHRvCiAJIG91dHB1dCBpdCBsYXRlci4g IFNpbWlsYXJseSwgYWxsIGRsbGV4cG9ydCdkIGZ1bmN0aW9ucyBtdXN0Ci0J IGJlIGVtaXR0ZWQ7IHRoZXJlIG1heSBiZSBjYWxsZXJzIGluIG90aGVyIERM THMuICAqLwotICAgICAgaWYgKChmbGFnX2tlZXBfaW5saW5lX2Z1bmN0aW9u cworCSBiZSBlbWl0dGVkOyB0aGVyZSBtYXkgYmUgY2FsbGVycyBpbiBvdGhl ciBETExzLgorCSBBbHNvLCBtYXJrIHRoaXMgZnVuY3Rpb24gYXMgbmVlZGVk IGlmIGl0IGlzIG1hcmtlZCBpbmxpbmUgYnV0CisJIGlzIGEgbXVsdGktdmVy c2lvbmVkIGZ1bmN0aW9uLiAgKi8KKyAgICAgIGlmICgoKGZsYWdfa2VlcF9p bmxpbmVfZnVuY3Rpb25zCisJICAgIHx8IERFQ0xfRlVOQ1RJT05fVkVSU0lP TkVEIChmbikpCiAJICAgJiYgREVDTF9ERUNMQVJFRF9JTkxJTkVfUCAoZm4p CiAJICAgJiYgIURFQ0xfUkVBTExZX0VYVEVSTiAoZm4pKQogCSAgfHwgKGZs YWdfa2VlcF9pbmxpbmVfZGxsZXhwb3J0CkluZGV4OiBnY2MvY3AvZGVjbDIu Ywo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvY3AvZGVjbDIuYwko cmV2aXNpb24gMTg2ODgzKQorKysgZ2NjL2NwL2RlY2wyLmMJKHdvcmtpbmcg Y29weSkKQEAgLTUzLDYgKzUzLDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0 aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpbmNsdWRlICJzcGxh eS10cmVlLmgiCiAjaW5jbHVkZSAibGFuZ2hvb2tzLmgiCiAjaW5jbHVkZSAi Yy1mYW1pbHkvYy1hZGEtc3BlYy5oIgorI2luY2x1ZGUgIm11bHRpdmVyc2lv bi5oIgogCiBleHRlcm4gY3BwX3JlYWRlciAqcGFyc2VfaW47CiAKQEAgLTY3 Nyw5ICs2NzgsMTMgQEAgY2hlY2tfY2xhc3NmbiAodHJlZSBjdHlwZSwgdHJl ZSBmdW5jdGlvbiwgdHJlZSB0ZW0KIAkgIGlmIChpc190ZW1wbGF0ZSAhPSAo VFJFRV9DT0RFIChmbmRlY2wpID09IFRFTVBMQVRFX0RFQ0wpKQogCSAgICBj b250aW51ZTsKIAorCSAgLyogV2hpbGUgZmluZGluZyBhIG1hdGNoLCBzYW1l IHR5cGVzIGFuZCBwYXJhbXMgYXJlIG5vdCBlbm91Z2gKKwkgICAgIGlmIHRo ZSBmdW5jdGlvbiBpcyB2ZXJzaW9uZWQuICBBbHNvIGNoZWNrIHZlcnNpb24g KCJ0YXJnZXQiKQorCSAgICAgYXR0cmlidXRlcy4gICovCiAJICBpZiAoc2Ft ZV90eXBlX3AgKFRSRUVfVFlQRSAoVFJFRV9UWVBFIChmdW5jdGlvbikpLAog CQkJICAgVFJFRV9UWVBFIChUUkVFX1RZUEUgKGZuZGVjbCkpKQogCSAgICAg ICYmIGNvbXBwYXJtcyAocDEsIHAyKQorCSAgICAgICYmICFoYXNfZGlmZmVy ZW50X3ZlcnNpb25fYXR0cmlidXRlcyAoZnVuY3Rpb24sIGZuZGVjbCkKIAkg ICAgICAmJiAoIWlzX3RlbXBsYXRlCiAJCSAgfHwgY29tcF90ZW1wbGF0ZV9w YXJtcyAodGVtcGxhdGVfcGFybXMsCiAJCQkJCSAgREVDTF9URU1QTEFURV9Q QVJNUyAoZm5kZWNsKSkpCkluZGV4OiBnY2MvY3AvY2FsbC5jCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIGdjYy9jcC9jYWxsLmMJKHJldmlzaW9uIDE4 Njg4MykKKysrIGdjYy9jcC9jYWxsLmMJKHdvcmtpbmcgY29weSkKQEAgLTQx LDYgKzQxLDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZ SU5HMy4gIElmIG5vdCBzZWUKICNpbmNsdWRlICJsYW5naG9va3MuaCIKICNp bmNsdWRlICJjLWZhbWlseS9jLW9iamMuaCIKICNpbmNsdWRlICJ0aW1ldmFy LmgiCisjaW5jbHVkZSAibXVsdGl2ZXJzaW9uLmgiCiAKIC8qIFRoZSB2YXJp b3VzIGtpbmRzIG9mIGNvbnZlcnNpb24uICAqLwogCkBAIC0zOTAzLDYgKzM5 MDQsMTYgQEAgYnVpbGRfbmV3X2Z1bmN0aW9uX2NhbGwgKHRyZWUgZm4sIFZF Qyh0cmVlLGdjKSAqKmEKICAgICB7CiAgICAgICBpZiAoY29tcGxhaW4gJiB0 Zl9lcnJvcikKIAl7CisJICAvKiBJZiB0aGUgY2FsbCBpcyB0byBhIG11bHRp dmVyc2lvbmVkIGZ1bmN0aW9uIHdpdGhvdXQKKwkgICAgIGEgZGVmYXVsdCB2 ZXJzaW9uLCBvdmVybG9hZCByZXNvbHV0aW9uIHdpbGwgZmFpbC4gICovCisJ ICBpZiAoY2FuZGlkYXRlcworCSAgICAgICYmIFRSRUVfQ09ERSAoY2FuZGlk YXRlcy0+Zm4pID09IEZVTkNUSU9OX0RFQ0wKKwkgICAgICAmJiBERUNMX0ZV TkNUSU9OX1ZFUlNJT05FRCAoY2FuZGlkYXRlcy0+Zm4pKQorCSAgICBlcnJv cl9hdCAobG9jYXRpb25fb2YgKERFQ0xfTkFNRSAoT1ZMX0NVUlJFTlQgKGZu KSkpLAorCQkgICAgICAiQ2FsbCB0byBtdWx0aXZlcnNpb25lZCBmdW5jdGlv biAlPCVEKCVBKSU+IHdpdGgiCisJCSAgICAgICIgbm8gZGVmYXVsdCB2ZXJz aW9uIiwgREVDTF9OQU1FIChPVkxfQ1VSUkVOVCAoZm4pKSwKKwkJICAgICAg YnVpbGRfdHJlZV9saXN0X3ZlYyAoKmFyZ3MpKTsKKwogCSAgaWYgKCFhbnlf dmlhYmxlX3AgJiYgY2FuZGlkYXRlcyAmJiAhIGNhbmRpZGF0ZXMtPm5leHQK IAkgICAgICAmJiAoVFJFRV9DT0RFIChjYW5kaWRhdGVzLT5mbikgPT0gRlVO Q1RJT05fREVDTCkpCiAJICAgIHJldHVybiBjcF9idWlsZF9mdW5jdGlvbl9j YWxsX3ZlYyAoY2FuZGlkYXRlcy0+Zm4sIGFyZ3MsIGNvbXBsYWluKTsKQEAg LTY4MDksNiArNjgyMCwxOSBAQCBidWlsZF9vdmVyX2NhbGwgKHN0cnVjdCB6 X2NhbmRpZGF0ZSAqY2FuZCwgaW50IGZsYQogICBpZiAoIWFscmVhZHlfdXNl ZCkKICAgICBtYXJrX3VzZWQgKGZuKTsKIAorICAvKiBGb3IgYSBjYWxsIHRv IGEgbXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9uLCB0aGUgY2FsbCBzaG91bGQg YWN0dWFsbHkgYmUgdG8KKyAgICAgdGhlIGRpc3BhdGNoZXIuICAqLworICBp ZiAoREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKGZuKQorICAgICAgJiYgaXNf ZGVmYXVsdF9mdW5jdGlvbiAoZm4pKQorICAgIHsKKyAgICAgIHRyZWUgaWZ1 bmNfZGVjbDsKKyAgICAgIGlmdW5jX2RlY2wgPSBnZXRfaWZ1bmNfZm9yX3Zl cnNpb24gKGZuKTsKKyAgICAgIHJldHJvZml0X2xhbmdfZGVjbCAoaWZ1bmNf ZGVjbCk7CisgICAgICBnY2NfYXNzZXJ0IChpZnVuY19kZWNsICE9IE5VTEwp OworICAgICAgcmV0dXJuIGJ1aWxkX2NhbGxfZXhwcl9sb2NfYXJyYXkgKFVO S05PV05fTE9DQVRJT04sIGlmdW5jX2RlY2wsCisJCQkJCW5hcmdzLCBhcmdh cnJheSk7CisgICAgfQorCiAgIGlmIChERUNMX1ZJTkRFWCAoZm4pICYmIChm bGFncyAmIExPT0tVUF9OT05WSVJUVUFMKSA9PSAwKQogICAgIHsKICAgICAg IHRyZWUgdDsKQEAgLTgwNjcsNiArODA5MSw2MCBAQCBqb3VzdCAoc3RydWN0 IHpfY2FuZGlkYXRlICpjYW5kMSwgc3RydWN0IHpfY2FuZGlkYQogICBzaXpl X3QgaTsKICAgc2l6ZV90IGxlbjsKIAorICAvKiBGb3IgQ2FuZGlkYXRlcyBv ZiBhIG11bHRpLXZlcnNpb25lZCBmdW5jdGlvbiwgZmlyc3QgY2hlY2sgaWYg dGhlCisgICAgIHRhcmdldCBmbGFncyBvZiB0aGUgY2FsbGVyIG1hdGNoIGFu eSBvZiB0aGUgY2FuZGlkYXRlcy4gSWYgc28sCisgICAgIHRoZSBjYWxsZXIg Y2FuIGRpcmVjdGx5IGNhbGwgdGhpcyBjYW5kaWRhdGUgb3RoZXJ3aXNlIHRo ZSBvbmUgbWFya2VkCisgICAgIGRlZmF1bHQgd2lucy4gIFRoaXMgaXMgYmVj YXVzZSB0aGUgZGVmYXVsdCBkZWNsIGlzIHVzZWQgYXMga2V5IHRvCisgICAg IGFnZ3JlZ2F0ZSBhbGwgdGhlIG90aGVyIHZlcnNpb25zIHByb3ZpZGVkIGZv ciBpdCBpbiBtdWx0aXZlcnNpb24uYy4KKyAgICAgV2hlbiBnZW5lcmF0aW5n IHRoZSBhY3R1YWwgY2FsbCwgdGhlIGFwcHJvcHJpYXRlIGRpc3BhdGNoZXIg aXMgY3JlYXRlZAorICAgICB0byBjYWxsIHRoZSByaWdodCBmdW5jdGlvbiB2 ZXJzaW9uIGF0IHJ1bi10aW1lLiAgKi8KKworICBpZiAoKFRSRUVfQ09ERSAo Y2FuZDEtPmZuKSA9PSBGVU5DVElPTl9ERUNMCisgICAgICAgJiYgREVDTF9G VU5DVElPTl9WRVJTSU9ORUQgKGNhbmQxLT5mbikpCisgICAgICB8fChUUkVF X0NPREUgKGNhbmQyLT5mbikgPT0gRlVOQ1RJT05fREVDTAorCSAmJiBERUNM X0ZVTkNUSU9OX1ZFUlNJT05FRCAoY2FuZDItPmZuKSkpCisgICAgeworICAg ICAgLyogQm90aCBmdW5jdGlvbnMgbXVzdCBiZSBtYXJrZWQgdmVyc2lvbmVk LiAgKi8KKyAgICAgIGdjY19hc3NlcnQgKERFQ0xfRlVOQ1RJT05fVkVSU0lP TkVEIChjYW5kMS0+Zm4pCisJCSAgJiYgREVDTF9GVU5DVElPTl9WRVJTSU9O RUQgKGNhbmQyLT5mbikpOworCisgICAgICAvKiBUcnkgdG8gc2VlIGlmIGEg ZGlyZWN0IGNhbGwgY2FuIGJlIG1hZGUgdG8gYSB2ZXJzaW9uLiAgVGhpcyBp cworCSBwb3NzaWJsZSBpZiB0aGUgY2FsbGVyIGFuZCBjYWxsZWUgaGF2ZSB0 aGUgc2FtZSB0YXJnZXQgZmxhZ3MuCisJIElmIGNhbmQtPmZuIGlzIG1hcmtl ZCB3aXRoIHRhcmdldCBhdHRyaWJ1dGVzLCAgY2hlY2sgaWYgdGhlCisJIHRh cmdldCBhcHByb3ZlcyBpbmxpbmluZyB0aGlzIGludG8gdGhlIGNhbGxlci4g IElmIHNvLCB0aGlzIGlzCisJIHRoZSB2ZXJzaW9uIHdlIHdhbnQuICAqLwor CisgICAgICBpZiAoaXNfdGFyZ2V0X2F0dHJpYnV0ZV9zZXQgKGNhbmQxLT5m bikKKwkgICYmIHRhcmdldG0udGFyZ2V0X29wdGlvbi5jYW5faW5saW5lX3Ag KGN1cnJlbnRfZnVuY3Rpb25fZGVjbCwKKwkJCQkJCSBjYW5kMS0+Zm4pKQor CXJldHVybiAxOworCisgICAgICBpZiAoaXNfdGFyZ2V0X2F0dHJpYnV0ZV9z ZXQgKGNhbmQyLT5mbikKKwkgICYmIHRhcmdldG0udGFyZ2V0X29wdGlvbi5j YW5faW5saW5lX3AgKGN1cnJlbnRfZnVuY3Rpb25fZGVjbCwKKwkJCQkJCSBj YW5kMi0+Zm4pKQorCXJldHVybiAtMTsKKworICAgICAgLyogQSBkaXJlY3Qg Y2FsbCB0byBhIHZlcnNpb24gaXMgbm90IHBvc3NpYmxlLCBzbyBmaW5kIHRo ZSBkZWZhdWx0CisJIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXQuICBUaGlzIHdp bGwgbGF0ZXIgYmUgY29udmVydGVkIHRvIGRpc3BhdGNoCisJIHRoZSByaWdo dCB2ZXJzaW9uIGF0IHJ1biB0aW1lLiAgKi8KKworICAgICAgaWYgKGlzX2Rl ZmF1bHRfZnVuY3Rpb24gKGNhbmQxLT5mbikpCisJeworICAgICAgICAgIG1h cmtfdXNlZCAoY2FuZDItPmZuKTsKKwkgIHJldHVybiAxOworCX0KKworICAg ICAgaWYgKGlzX2RlZmF1bHRfZnVuY3Rpb24gKGNhbmQyLT5mbikpCisJewor ICAgICAgICAgIG1hcmtfdXNlZCAoY2FuZDEtPmZuKTsKKwkgIHJldHVybiAt MTsKKwl9CisKKyAgICAgIC8qIElmIGEgZGVmYXVsdCBmdW5jdGlvbiBpcyBh YnNlbnQsIHRoaXMgd2lsbCBuZXZlciBnZXQgcmVzb2x2ZWQgbGVhZGluZwor CSB0byBhbiBhbWJpZ3VvdXMgY2FsbCBlcnJvci4gICovCisgICAgICByZXR1 cm4gMDsKKyAgICB9CisKICAgLyogQ2FuZGlkYXRlcyB0aGF0IGludm9sdmUg YmFkIGNvbnZlcnNpb25zIGFyZSBhbHdheXMgd29yc2UgdGhhbiB0aG9zZQog ICAgICB0aGF0IGRvbid0LiAgKi8KICAgaWYgKGNhbmQxLT52aWFibGUgPiBj YW5kMi0+dmlhYmxlKQpJbmRleDogZ2NjL3RpbWV2YXIuZGVmCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIGdjYy90aW1ldmFyLmRlZgkocmV2aXNpb24g MTg2ODgzKQorKysgZ2NjL3RpbWV2YXIuZGVmCSh3b3JraW5nIGNvcHkpCkBA IC0yNTMsNiArMjUzLDcgQEAgREVGVElNRVZBUiAoVFZfVFJFRV9JRkNPTUJJ TkUgICAgICAgICwgInRyZWUgaWYtY28KIERFRlRJTUVWQVIgKFRWX1RSRUVf VU5JTklUICAgICAgICAgICAsICJ1bmluaXQgdmFyIGFuYWx5c2lzIikKIERF RlRJTUVWQVIgKFRWX1BMVUdJTl9JTklUICAgICAgICAgICAsICJwbHVnaW4g aW5pdGlhbGl6YXRpb24iKQogREVGVElNRVZBUiAoVFZfUExVR0lOX1JVTiAg ICAgICAgICAgICwgInBsdWdpbiBleGVjdXRpb24iKQorREVGVElNRVZBUiAo VFZfTVVMVElWRVJTSU9OX0RJU1BBVENIICwgIm11bHRpdmVyc2lvbiBkaXNw YXRjaCIpCiAKIC8qIEV2ZXJ5dGhpbmcgZWxzZSBpbiByZXN0X29mX2NvbXBp bGF0aW9uIG5vdCBpbmNsdWRlZCBhYm92ZS4gICovCiBERUZUSU1FVkFSIChU Vl9FQVJMWV9MT0NBTAkgICAgICwgImVhcmx5IGxvY2FsIHBhc3NlcyIpCklu ZGV4OiBnY2MvTWFrZWZpbGUuaW4KPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gZ2NjL01ha2VmaWxlLmluCShyZXZpc2lvbiAxODY4ODMpCisrKyBnY2Mv TWFrZWZpbGUuaW4JKHdvcmtpbmcgY29weSkKQEAgLTEyOTQsNiArMTI5NCw3 IEBAIE9CSlMgPSBcCiAJbWNmLm8gXAogCW1vZGUtc3dpdGNoaW5nLm8gXAog CW1vZHVsby1zY2hlZC5vIFwKKwltdWx0aXZlcnNpb24ubyBcCiAJb21lZ2Eu byBcCiAJb21wLWxvdy5vIFwKIAlvcHRhYnMubyBcCkBAIC0zMDMwLDYgKzMw MzEsMTEgQEAgcmVlLm8gOiByZWUuYyAkKENPTkZJR19IKSAkKFNZU1RFTV9I KSBjb3JldHlwZXMuaAogICAgJChERl9IKSAkKFRJTUVWQVJfSCkgdHJlZS1w YXNzLmggJChSRUNPR19IKSAkKEVYUFJfSCkgXAogICAgJChSRUdTX0gpICQo VFJFRV9IKSAkKFRNX1BfSCkgaW5zbi1jb25maWcuaCAkKElOU05fQVRUUl9I KSAkKERJQUdOT1NUSUNfQ09SRV9IKSBcCiAgICAkKFRBUkdFVF9IKSAkKE9Q VEFCU19IKSBpbnNuLWNvZGVzLmggcnRsaG9va3MtZGVmLmggJChQQVJBTVNf SCkgJChDR1JBUEhfSCkKK211bHRpdmVyc2lvbi5vIDogbXVsdGl2ZXJzaW9u LmMgJChDT05GSUdfSCkgJChTWVNURU1fSCkgY29yZXR5cGVzLmggJChUTV9I KSBcCisgICAkKFRSRUVfSCkgbGFuZ2hvb2tzLmggJChUUkVFX0lOTElORV9I KSAkKEZMQUdTX0gpICQoQ0dSQVBIX0gpIGludGwuaCBcCisgICAkKERJQUdO T1NUSUNfSCkgJChGSUJIRUFQX0gpICQoUEFSQU1TX0gpICQoVElNRVZBUl9I KSB0cmVlLXBhc3MuaCBcCisgICAkKEhBU0hUQUJfSCkgJChDT1ZFUkFHRV9I KSAkKEdHQ19IKSAkKFRSRUVfRkxPV19IKSAkKFJUTF9IKSAkKElQQV9QUk9Q X0gpIFwKKyAgICQoQkFTSUNfQkxPQ0tfSCkgJChUT1BMRVZfSCkgJChUUkVF X0RVTVBfSCkgaXBhLWlubGluZS5oCiBjcHJvcC5vIDogY3Byb3AuYyAkKENP TkZJR19IKSAkKFNZU1RFTV9IKSBjb3JldHlwZXMuaCAkKFRNX0gpICQoUlRM X0gpIFwKICAgICQoUkVHU19IKSBoYXJkLXJlZy1zZXQuaCAkKEZMQUdTX0gp IGluc24tY29uZmlnLmggJChHR0NfSCkgXAogICAgJChSRUNPR19IKSAkKEVY UFJfSCkgJChCQVNJQ19CTE9DS19IKSAkKEZVTkNUSU9OX0gpIG91dHB1dC5o IHRvcGxldi5oICQoRElBR05PU1RJQ19DT1JFX0gpIFwKSW5kZXg6IGdjYy9w YXNzZXMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvcGFzc2Vz LmMJKHJldmlzaW9uIDE4Njg4MykKKysrIGdjYy9wYXNzZXMuYwkod29ya2lu ZyBjb3B5KQpAQCAtMTI4Nyw2ICsxMjg3LDcgQEAgaW5pdF9vcHRpbWl6YXRp b25fcGFzc2VzICh2b2lkKQogICBORVhUX1BBU1MgKHBhc3NfYnVpbGRfY2Zn KTsKICAgTkVYVF9QQVNTIChwYXNzX3dhcm5fZnVuY3Rpb25fcmV0dXJuKTsK ICAgTkVYVF9QQVNTIChwYXNzX2J1aWxkX2NncmFwaF9lZGdlcyk7CisgIE5F WFRfUEFTUyAocGFzc19kaXNwYXRjaF92ZXJzaW9ucyk7CiAgICpwID0gTlVM TDsKIAogICAvKiBJbnRlcnByb2NlZHVyYWwgb3B0aW1pemF0aW9uIHBhc3Nl cy4gICovCkluZGV4OiBnY2MvY3AvbWFuZ2xlLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gZ2NjL2NwL21hbmdsZS5jCShyZXZpc2lvbiAxODY4ODMp CisrKyBnY2MvY3AvbWFuZ2xlLmMJKHdvcmtpbmcgY29weSkKQEAgLTEyNDUs NyArMTI0NSwxMiBAQCB3cml0ZV91bnF1YWxpZmllZF9uYW1lIChjb25zdCB0 cmVlIGRlY2wpCiAgICAgewogICAgICAgTUFOR0xFX1RSQUNFX1RSRUUgKCJs b2NhbC1zb3VyY2UtbmFtZSIsIGRlY2wpOwogICAgICAgd3JpdGVfY2hhciAo J0wnKTsKLSAgICAgIHdyaXRlX3NvdXJjZV9uYW1lIChERUNMX05BTUUgKGRl Y2wpKTsKKyAgICAgIGlmIChUUkVFX0NPREUgKGRlY2wpID09IEZVTkNUSU9O X0RFQ0wKKwkgICYmIERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChkZWNsKQor CSAgJiYgREVDTF9BU1NFTUJMRVJfTkFNRV9TRVRfUCAoZGVjbCkpCisJd3Jp dGVfc291cmNlX25hbWUgKERFQ0xfQVNTRU1CTEVSX05BTUUgKGRlY2wpKTsK KyAgICAgIGVsc2UKKwl3cml0ZV9zb3VyY2VfbmFtZSAoREVDTF9OQU1FIChk ZWNsKSk7CiAgICAgICAvKiBUaGUgZGVmYXVsdCBkaXNjcmltaW5hdG9yIGlz IDEsIGFuZCB0aGF0J3MgYWxsIHdlIGV2ZXIgdXNlLAogCSBzbyB0aGVyZSdz IG5vIGNvZGUgdG8gb3V0cHV0IG9uZSBoZXJlLiAgKi8KICAgICB9CkBAIC0x MjYwLDcgKzEyNjUsMTQgQEAgd3JpdGVfdW5xdWFsaWZpZWRfbmFtZSAoY29u c3QgdHJlZSBkZWNsKQogICAgICAgICAgICAgICAgJiYgTEFNQkRBX1RZUEVf UCAodHlwZSkpCiAgICAgICAgIHdyaXRlX2Nsb3N1cmVfdHlwZV9uYW1lICh0 eXBlKTsKICAgICAgIGVsc2UKLSAgICAgICAgd3JpdGVfc291cmNlX25hbWUg KERFQ0xfTkFNRSAoZGVjbCkpOworCXsKKwkgIGlmIChUUkVFX0NPREUgKGRl Y2wpID09IEZVTkNUSU9OX0RFQ0wKKwkgICAgICAmJiBERUNMX0ZVTkNUSU9O X1ZFUlNJT05FRCAoZGVjbCkKKwkgICAgICAmJiBERUNMX0FTU0VNQkxFUl9O QU1FX1NFVF9QIChkZWNsKSkKKwkgICAgd3JpdGVfc291cmNlX25hbWUgKERF Q0xfQVNTRU1CTEVSX05BTUUgKGRlY2wpKTsKKwkgIGVsc2UKKwkgICAgd3Jp dGVfc291cmNlX25hbWUgKERFQ0xfTkFNRSAoZGVjbCkpOworCX0KICAgICB9 CiB9CiAKSW5kZXg6IGdjYy9jb25maWcvaTM4Ni9pMzg2LmMKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gZ2NjL2NvbmZpZy9pMzg2L2kzODYuYwkocmV2 aXNpb24gMTg2ODgzKQorKysgZ2NjL2NvbmZpZy9pMzg2L2kzODYuYwkod29y a2luZyBjb3B5KQpAQCAtMjc2NzgsNiArMjc2NzgsMzI2IEBAIGl4ODZfaW5p dF9tbXhfc3NlX2J1aWx0aW5zICh2b2lkKQogICAgIH0KIH0KIAorCisvKiBU aGlzIGFkZHMgYSBjb25kaXRpb24gdG8gdGhlIGJhc2ljX2Jsb2NrIE5FV19C QiBpbiBmdW5jdGlvbiBGVU5DVElPTl9ERUNMCisgICB0byByZXR1cm4gYSBw b2ludGVyIHRvIFZFUlNJT05fREVDTCBpZiB0aGUgb3V0Y29tZSBvZiB0aGUg ZXhwcmVzc2lvbgorICAgZm9ybWVkIGJ5IFBSRURJQ0FURV9DSEFJTiBpcyB0 cnVlLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBkdXJpbmcKKyAg IHZlcnNpb24gZGlzcGF0Y2ggdG8gZGVjaWRlIHdoaWNoIGZ1bmN0aW9uIHZl cnNpb24gdG8gZXhlY3V0ZS4gIEl0IHJldHVybnMKKyAgIHRoZSBiYXNpYyBi bG9jayBhdCB0aGUgZW5kIHRvIHdoaWNoIG1vcmUgY29uZGl0aW9ucyBjYW4g YmUgYWRkZWQuICAqLworCitzdGF0aWMgYmFzaWNfYmxvY2sKK2FkZF9jb25k aXRpb25fdG9fYmIgKHRyZWUgZnVuY3Rpb25fZGVjbCwgdHJlZSB2ZXJzaW9u X2RlY2wsCisJCSAgICAgdHJlZSBwcmVkaWNhdGVfY2hhaW4sIGJhc2ljX2Js b2NrIG5ld19iYikKK3sKKyAgZ2ltcGxlIHJldHVybl9zdG10OworICB0cmVl IGNvbnZlcnRfZXhwciwgcmVzdWx0X3ZhcjsKKyAgZ2ltcGxlIGNvbnZlcnRf c3RtdDsKKyAgZ2ltcGxlIGNhbGxfY29uZF9zdG10OworICBnaW1wbGUgaWZf ZWxzZV9zdG10OworCisgIGJhc2ljX2Jsb2NrIGJiMSwgYmIyLCBiYjM7Cisg IGVkZ2UgZTEyLCBlMjM7CisKKyAgdHJlZSBjb25kX3ZhciwgYW5kX2V4cHJf dmFyID0gTlVMTF9UUkVFOworICBnaW1wbGVfc2VxIGdzZXE7CisKKyAgdHJl ZSBvbGRfY3VycmVudF9mdW5jdGlvbl9kZWNsOworICB0cmVlIHByZWRpY2F0 ZV9kZWNsLCBwcmVkaWNhdGVfYXJnOworCisgIG9sZF9jdXJyZW50X2Z1bmN0 aW9uX2RlY2wgPSBjdXJyZW50X2Z1bmN0aW9uX2RlY2w7CisgIHB1c2hfY2Z1 biAoREVDTF9TVFJVQ1RfRlVOQ1RJT04gKGZ1bmN0aW9uX2RlY2wpKTsKKyAg Y3VycmVudF9mdW5jdGlvbl9kZWNsID0gZnVuY3Rpb25fZGVjbDsKKworICBn Y2NfYXNzZXJ0IChuZXdfYmIgIT0gTlVMTCk7CisgIGdzZXEgPSBiYl9zZXEg KG5ld19iYik7CisKKworICBjb252ZXJ0X2V4cHIgPSBidWlsZDEgKENPTlZF UlRfRVhQUiwgcHRyX3R5cGVfbm9kZSwKKwkgICAgIAkJIGJ1aWxkX2ZvbGRf YWRkcl9leHByICh2ZXJzaW9uX2RlY2wpKTsKKyAgcmVzdWx0X3ZhciA9IGNy ZWF0ZV90bXBfdmFyIChwdHJfdHlwZV9ub2RlLCBOVUxMKTsKKyAgY29udmVy dF9zdG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAocmVzdWx0X3ZhciwgY29u dmVydF9leHByKTsgCisgIHJldHVybl9zdG10ID0gZ2ltcGxlX2J1aWxkX3Jl dHVybiAocmVzdWx0X3Zhcik7CisKKyAgaWYgKHByZWRpY2F0ZV9jaGFpbiA9 PSBOVUxMX1RSRUUpCisgICAgeworICAgICAgZ2ltcGxlX3NlcV9hZGRfc3Rt dCAoJmdzZXEsIGNvbnZlcnRfc3RtdCk7CisgICAgICBnaW1wbGVfc2VxX2Fk ZF9zdG10ICgmZ3NlcSwgcmV0dXJuX3N0bXQpOworICAgICAgc2V0X2JiX3Nl cSAobmV3X2JiLCBnc2VxKTsKKyAgICAgIGdpbXBsZV9zZXRfYmIgKGNvbnZl cnRfc3RtdCwgbmV3X2JiKTsKKyAgICAgIGdpbXBsZV9zZXRfYmIgKHJldHVy bl9zdG10LCBuZXdfYmIpOworICAgICAgcG9wX2NmdW4gKCk7CisgICAgICBj dXJyZW50X2Z1bmN0aW9uX2RlY2wgPSBvbGRfY3VycmVudF9mdW5jdGlvbl9k ZWNsOworICAgICAgcmV0dXJuIG5ld19iYjsKKyAgICB9CisKKyAgd2hpbGUg KHByZWRpY2F0ZV9jaGFpbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbmRf dmFyID0gY3JlYXRlX3RtcF92YXIgKGludGVnZXJfdHlwZV9ub2RlLCBOVUxM KTsKKyAgICAgIHByZWRpY2F0ZV9kZWNsID0gVFJFRV9QVVJQT1NFIChwcmVk aWNhdGVfY2hhaW4pOworICAgICAgcHJlZGljYXRlX2FyZyA9IFRSRUVfVkFM VUUgKHByZWRpY2F0ZV9jaGFpbik7CisgICAgICBjYWxsX2NvbmRfc3RtdCA9 IGdpbXBsZV9idWlsZF9jYWxsIChwcmVkaWNhdGVfZGVjbCwgMSwgcHJlZGlj YXRlX2FyZyk7CisgICAgICBnaW1wbGVfY2FsbF9zZXRfbGhzIChjYWxsX2Nv bmRfc3RtdCwgY29uZF92YXIpOworCisgICAgICBnaW1wbGVfc2V0X2Jsb2Nr IChjYWxsX2NvbmRfc3RtdCwgREVDTF9JTklUSUFMIChmdW5jdGlvbl9kZWNs KSk7CisgICAgICBnaW1wbGVfc2V0X2JiIChjYWxsX2NvbmRfc3RtdCwgbmV3 X2JiKTsKKyAgICAgIGdpbXBsZV9zZXFfYWRkX3N0bXQgKCZnc2VxLCBjYWxs X2NvbmRfc3RtdCk7CisKKyAgICAgIHByZWRpY2F0ZV9jaGFpbiA9IFRSRUVf Q0hBSU4gKHByZWRpY2F0ZV9jaGFpbik7CisgICAgICAKKyAgICAgIGlmIChh bmRfZXhwcl92YXIgPT0gTlVMTCkKKyAgICAgICAgYW5kX2V4cHJfdmFyID0g Y29uZF92YXI7CisgICAgICBlbHNlCisJeworCSAgZ2ltcGxlIGFzc2lnbl9z dG10OworCSAgLyogVXNlIE1JTl9FWFBSIHRvIGNoZWNrIGlmIGFueSBpbnRl Z2VyIGlzIHplcm8/LgorCSAgICAgYW5kX2V4cHJfdmFyID0gbWluX2V4cHIg PGNvbmRfdmFyLCBhbmRfZXhwcl92YXI+ICAqLworCSAgYXNzaWduX3N0bXQg PSBnaW1wbGVfYnVpbGRfYXNzaWduIChhbmRfZXhwcl92YXIsCisJCQkgIGJ1 aWxkMiAoTUlOX0VYUFIsIGludGVnZXJfdHlwZV9ub2RlLAorCQkJCSAgY29u ZF92YXIsIGFuZF9leHByX3ZhcikpOworCisJICBnaW1wbGVfc2V0X2Jsb2Nr IChhc3NpZ25fc3RtdCwgREVDTF9JTklUSUFMIChmdW5jdGlvbl9kZWNsKSk7 CisJICBnaW1wbGVfc2V0X2JiIChhc3NpZ25fc3RtdCwgbmV3X2JiKTsKKwkg IGdpbXBsZV9zZXFfYWRkX3N0bXQgKCZnc2VxLCBhc3NpZ25fc3RtdCk7CisJ fQorICAgIH0KKworICBpZl9lbHNlX3N0bXQgPSBnaW1wbGVfYnVpbGRfY29u ZCAoR1RfRVhQUiwgYW5kX2V4cHJfdmFyLAorCSAgCQkgICAgICAgICAgICBp bnRlZ2VyX3plcm9fbm9kZSwKKwkJCQkgICAgTlVMTF9UUkVFLCBOVUxMX1RS RUUpOworICBnaW1wbGVfc2V0X2Jsb2NrIChpZl9lbHNlX3N0bXQsIERFQ0xf SU5JVElBTCAoZnVuY3Rpb25fZGVjbCkpOworICBnaW1wbGVfc2V0X2JiIChp Zl9lbHNlX3N0bXQsIG5ld19iYik7CisgIGdpbXBsZV9zZXFfYWRkX3N0bXQg KCZnc2VxLCBpZl9lbHNlX3N0bXQpOworCisgIGdpbXBsZV9zZXFfYWRkX3N0 bXQgKCZnc2VxLCBjb252ZXJ0X3N0bXQpOworICBnaW1wbGVfc2VxX2FkZF9z dG10ICgmZ3NlcSwgcmV0dXJuX3N0bXQpOworICBzZXRfYmJfc2VxIChuZXdf YmIsIGdzZXEpOworCisgIGJiMSA9IG5ld19iYjsKKyAgZTEyID0gc3BsaXRf YmxvY2sgKGJiMSwgaWZfZWxzZV9zdG10KTsKKyAgYmIyID0gZTEyLT5kZXN0 OworICBlMTItPmZsYWdzICY9IH5FREdFX0ZBTExUSFJVOworICBlMTItPmZs YWdzIHw9IEVER0VfVFJVRV9WQUxVRTsKKworICBlMjMgPSBzcGxpdF9ibG9j ayAoYmIyLCByZXR1cm5fc3RtdCk7CisKKyAgZ2ltcGxlX3NldF9iYiAoY29u dmVydF9zdG10LCBiYjIpOworICBnaW1wbGVfc2V0X2JiIChyZXR1cm5fc3Rt dCwgYmIyKTsKKworICBiYjMgPSBlMjMtPmRlc3Q7CisgIG1ha2VfZWRnZSAo YmIxLCBiYjMsIEVER0VfRkFMU0VfVkFMVUUpOyAKKworICByZW1vdmVfZWRn ZSAoZTIzKTsKKyAgbWFrZV9lZGdlIChiYjIsIEVYSVRfQkxPQ0tfUFRSLCAw KTsKKworICByZWJ1aWxkX2NncmFwaF9lZGdlcyAoKTsKKworICBwb3BfY2Z1 biAoKTsKKyAgY3VycmVudF9mdW5jdGlvbl9kZWNsID0gb2xkX2N1cnJlbnRf ZnVuY3Rpb25fZGVjbDsKKworICByZXR1cm4gYmIzOworfQorCisvKiBUaGlz IHBhcnNlcyB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cyB0byB0YXJnZXQgaW4g REVDTCBhbmQgZGV0ZXJtaW5lcworICAgdGhlIHJpZ2h0IGJ1aWx0aW4gdG8g dXNlIHRvIG1hdGNoIHRoZSBwbGF0Zm9ybSBzcGVjaWZpY2F0aW9uLgorICAg Rm9yIG5vdywgb25seSBvbmUgdGFyZ2V0IGFyZ3VtZW50ICgiYXJjaD0iIG9y ICI8LW0+eHh4IikgaXMgYWxsb3dlZC4gICovCisKK3N0YXRpYyB0cmVlIAor Z2V0X2J1aWx0aW5fY29kZV9mb3JfdmVyc2lvbiAodHJlZSBkZWNsKQorewor ICB0cmVlIGF0dHJzOworICBzdHJ1Y3QgY2xfdGFyZ2V0X29wdGlvbiBjdXJf dGFyZ2V0OworICB0cmVlIHRhcmdldF9ub2RlOworICBzdHJ1Y3QgY2xfdGFy Z2V0X29wdGlvbiAqbmV3X3RhcmdldDsKKyAgY29uc3QgY2hhciAqYXJnX3N0 ciA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKmF0dHJzX3N0ciA9IE5VTEw7Cisg IGNoYXIgKnRva19zdHIgPSBOVUxMOworICBjaGFyICp0b2tlbjsKKyAgLyog VGhlc2UgYXJlIHRoZSB0YXJnZXQgYXR0cmlidXRlIHN0cmluZ3MgZm9yIHdo aWNoIGEgZGlzcGF0Y2hlciBpcworICAgICBhdmFpbGFibGUsIGZyb20gZm9s ZF9idWlsdGluX2NwdS4gICovCisgIGNvbnN0IGNoYXIgKmZlYXR1cmVfbGlz dFtdID0geyJtbXgiLCAicG9wY250IiwgInNzZSIsICJzc2UyIiwgInNzZTMi LAorCQkJCSJzc3NlMyIsICJzc2U0LjEiLCAic3NlNC4yIiwgImF2eCIsICJh dngyIn07CisgIHVuc2lnbmVkIGludCBOVU1fRkVBVFVSRVMgPSBzaXplb2Yg KGZlYXR1cmVfbGlzdCkgLyBzaXplb2YgKGNvbnN0IGNoYXIgKik7CisgIHVu c2lnbmVkIGludCBpOworICB0cmVlIHByZWRpY2F0ZV9jaGFpbiA9IE5VTExf VFJFRTsKKyAgdHJlZSBwcmVkaWNhdGVfZGVjbCwgcHJlZGljYXRlX2FyZzsK KworICBhdHRycyA9IGxvb2t1cF9hdHRyaWJ1dGUgKCJ0YXJnZXQiLCBERUNM X0FUVFJJQlVURVMgKGRlY2wpKTsKKyAgZ2NjX2Fzc2VydCAoYXR0cnMgIT0g TlVMTCk7CisKKyAgYXR0cnMgPSBUUkVFX1ZBTFVFIChUUkVFX1ZBTFVFIChh dHRycykpOworCisgIGdjY19hc3NlcnQgKFRSRUVfQ09ERSAoYXR0cnMpID09 IFNUUklOR19DU1QpOworICBhdHRyc19zdHIgPSBUUkVFX1NUUklOR19QT0lO VEVSIChhdHRycyk7CisKKyAgLyogSGFuZGxlIGFyY2g9IGlmIHNwZWNpZmll ZC4gICovCisgIGlmIChzdHJzdHIgKGF0dHJzX3N0ciwgImFyY2g9IikgIT0g TlVMTCkKKyAgICB7CisgICAgICBjbF90YXJnZXRfb3B0aW9uX3NhdmUgKCZj dXJfdGFyZ2V0LCAmZ2xvYmFsX29wdGlvbnMpOworICAgICAgdGFyZ2V0X25v ZGUgPSBpeDg2X3ZhbGlkX3RhcmdldF9hdHRyaWJ1dGVfdHJlZSAoYXR0cnMp OworICAgIAorICAgICAgZ2NjX2Fzc2VydCAodGFyZ2V0X25vZGUpOworICAg ICAgbmV3X3RhcmdldCA9IFRSRUVfVEFSR0VUX09QVElPTiAodGFyZ2V0X25v ZGUpOworICAgICAgZ2NjX2Fzc2VydCAobmV3X3RhcmdldCk7CisgICAgICAK KyAgICAgIGlmIChuZXdfdGFyZ2V0LT5hcmNoX3NwZWNpZmllZCAmJiBuZXdf dGFyZ2V0LT5hcmNoID4gMCkKKwl7CisJICBzd2l0Y2ggKG5ld190YXJnZXQt PmFyY2gpCisJICAgIHsKKwkgICAgY2FzZSBQUk9DRVNTT1JfQ09SRTJfMzI6 CisJICAgIGNhc2UgUFJPQ0VTU09SX0NPUkUyXzY0OgorCSAgICAgIGFyZ19z dHIgPSAiY29yZTIiOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBST0NF U1NPUl9DT1JFSTdfMzI6CisJICAgIGNhc2UgUFJPQ0VTU09SX0NPUkVJN182 NDoKKwkgICAgICBhcmdfc3RyID0gImNvcmVpNyI7CisJICAgICAgYnJlYWs7 CisJICAgIGNhc2UgUFJPQ0VTU09SX0FUT006CisJICAgICAgYXJnX3N0ciA9 ICJhdG9tIjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQUk9DRVNTT1Jf QU1ERkFNMTA6CisJICAgICAgYXJnX3N0ciA9ICJhbWRmYW0xMGgiOworCSAg ICAgIGJyZWFrOworCSAgICBjYXNlIFBST0NFU1NPUl9CRFZFUjE6CisJICAg ICAgYXJnX3N0ciA9ICJiZHZlcjEiOworCSAgICAgIGJyZWFrOworCSAgICBj YXNlIFBST0NFU1NPUl9CRFZFUjI6CisJICAgICAgYXJnX3N0ciA9ICJiZHZl cjIiOworCSAgICAgIGJyZWFrOworCSAgICB9ICAKKwl9ICAgIAorICAgIAor ICAgICAgY2xfdGFyZ2V0X29wdGlvbl9yZXN0b3JlICgmZ2xvYmFsX29wdGlv bnMsICZjdXJfdGFyZ2V0KTsKKyAgICAgIGlmIChhcmdfc3RyID09IE5VTEwp CisJeworCSAgZXJyb3JfYXQgKERFQ0xfU09VUkNFX0xPQ0FUSU9OIChkZWNs KSwKKwkgICAgCSJObyBkaXNwYXRjaGVyIGZvdW5kIGZvciB0aGUgdmVyc2lv bmluZyBhdHRyaWJ1dGVzIik7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAg CisgICAgICBwcmVkaWNhdGVfZGVjbCA9IGl4ODZfYnVpbHRpbnMgWyhpbnQp IElYODZfQlVJTFRJTl9DUFVfSVNdOworICAgICAgLyogRm9yIGEgQyBzdHJp bmcgbGl0ZXJhbCB0aGUgbGVuZ3RoIGluY2x1ZGVzIHRoZSB0cmFpbGluZyBO VUxMLiAgKi8KKyAgICAgIHByZWRpY2F0ZV9hcmcgPSBidWlsZF9zdHJpbmdf bGl0ZXJhbCAoc3RybGVuIChhcmdfc3RyKSArIDEsIGFyZ19zdHIpOworICAg ICAgcHJlZGljYXRlX2NoYWluID0gdHJlZV9jb25zIChwcmVkaWNhdGVfZGVj bCwgcHJlZGljYXRlX2FyZywKKwkJCQkgICBwcmVkaWNhdGVfY2hhaW4pOwor ICAgIH0KKworICAvKiBQcm9jZXNzIGZlYXR1cmUgbmFtZS4gICovCisgIHRv a19zdHIgPSAgKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChhdHRyc19zdHIp ICsgMSk7CisgIHN0cmNweSAodG9rX3N0ciwgYXR0cnNfc3RyKTsKKyAgdG9r ZW4gPSBzdHJ0b2sgKHRva19zdHIsICIsIik7CisgIHByZWRpY2F0ZV9kZWNs ID0gaXg4Nl9idWlsdGlucyBbKGludCkgSVg4Nl9CVUlMVElOX0NQVV9TVVBQ T1JUU107CisKKyAgd2hpbGUgKHRva2VuICE9IE5VTEwpCisgICAgeworICAg ICAgLyogRG8gbm90IHByb2Nlc3MgImFyY2g9IiAgKi8KKyAgICAgIGlmIChz dHJuY21wICh0b2tlbiwgImFyY2g9IiwgNSkgPT0gMCkKKwl7CisJICB0b2tl biA9IHN0cnRvayAoTlVMTCwgIiwiKTsKKwkgIGNvbnRpbnVlOworCX0KKyAg ICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkVBVFVSRVM7ICsraSkKKwl7CisJ ICBpZiAoc3RyY21wICh0b2tlbiwgZmVhdHVyZV9saXN0W2ldKSA9PSAwKQor CSAgICB7CisJICAgICAgcHJlZGljYXRlX2FyZyA9IGJ1aWxkX3N0cmluZ19s aXRlcmFsICgKKwkJCQlzdHJsZW4gKGZlYXR1cmVfbGlzdFtpXSkgKyAxLAor CQkJCWZlYXR1cmVfbGlzdFtpXSk7CisJICAgICAgcHJlZGljYXRlX2NoYWlu ID0gdHJlZV9jb25zIChwcmVkaWNhdGVfZGVjbCwgcHJlZGljYXRlX2FyZywK KwkJCQkJICAgcHJlZGljYXRlX2NoYWluKTsKKwkgICAgICBicmVhazsKKwkg ICAgfQorCX0KKyAgICAgIGlmIChpID09IE5VTV9GRUFUVVJFUykKKwl7CisJ ICBlcnJvcl9hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKGRlY2wpLAorCQkg ICAgIk5vIGRpc3BhdGNoZXIgZm91bmQgZm9yICVzIiwgdG9rZW4pOworCSAg cmV0dXJuIE5VTEw7CisJfQorICAgICAgdG9rZW4gPSBzdHJ0b2sgKE5VTEws ICIsIik7CisgICAgfQorICBmcmVlICh0b2tfc3RyKTsKKworICBpZiAocHJl ZGljYXRlX2NoYWluID09IE5VTExfVFJFRSkKKyAgICB7CisgICAgICBlcnJv cl9hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKGRlY2wpLAorCSAgICAgICAg Ik5vIGRpc3BhdGNoZXIgZm91bmQgZm9yIHRoZSB2ZXJzaW9uaW5nIGF0dHJp YnV0ZXMgOiAlcyIsCisJICAgICAgICBhdHRyc19zdHIpOworICAgICAgcmV0 dXJuIE5VTEw7CisgICAgfQorCisgIHByZWRpY2F0ZV9jaGFpbiA9IG5yZXZl cnNlIChwcmVkaWNhdGVfY2hhaW4pOworICByZXR1cm4gcHJlZGljYXRlX2No YWluOyAKK30gCisKKy8qIFRoaXMgaXMgdGhlIHRhcmdldCBob29rIHRvIGdl bmVyYXRlIHRoZSBkaXNwYXRjaCBmdW5jdGlvbiBmb3IKKyAgIG11bHRpLXZl cnNpb25lZCBmdW5jdGlvbnMuICBESVNQQVRDSF9ERUNMIGlzIHRoZSBmdW5j dGlvbiB3aGljaCB3aWxsCisgICBjb250YWluIHRoZSBkaXNwYXRjaCBsb2dp Yy4gIEZOREVDTFMgYXJlIHRoZSBmdW5jdGlvbiBjaG9pY2VzIGZvcgorICAg ZGlzcGF0Y2gsIGFuZCBpcyBhIHRyZWUgY2hhaW4uICBFTVBUWV9CQiBpcyB0 aGUgYmFzaWMgYmxvY2sgcG9pbnRlcgorICAgaW4gRElTUEFUQ0hfREVDTCBp biB3aGljaCB0aGUgZGlzcGF0Y2ggY29kZSBpcyBnZW5lcmF0ZWQuICAqLwor CitzdGF0aWMgaW50CitpeDg2X2Rpc3BhdGNoX3ZlcnNpb24gKHRyZWUgZGlz cGF0Y2hfZGVjbCwKKwkJICAgICAgIHZvaWQgKmZuZGVjbHNfcCwKKwkJICAg ICAgIGJhc2ljX2Jsb2NrICplbXB0eV9iYikKK3sKKyAgdHJlZSBkZWZhdWx0 X2RlY2w7CisgIGdpbXBsZSBpZnVuY19jcHVfaW5pdF9zdG10OworICBnaW1w bGVfc2VxIGdzZXE7CisgIHRyZWUgb2xkX2N1cnJlbnRfZnVuY3Rpb25fZGVj bDsKKyAgaW50IGl4OworICB0cmVlIGVsZTsKKyAgVkVDICh0cmVlLCBoZWFw KSAqZm5kZWNsczsKKworICBnY2NfYXNzZXJ0IChkaXNwYXRjaF9kZWNsICE9 IE5VTEwKKwkgICAgICAmJiBmbmRlY2xzX3AgIT0gTlVMTAorCSAgICAgICYm IGVtcHR5X2JiICE9IE5VTEwpOworCisgIC8qZm5kZWNsc19wIGlzIGFjdHVh bGx5IGEgdmVjdG9yLiAgKi8KKyAgZm5kZWNscyA9IChWRUMgKHRyZWUsIGhl YXApICopZm5kZWNsc19wOworCisgIC8qIEF0bGVhc3Qgb25lIG1vcmUgdmVy c2lvbiBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LiAgKi8KKyAgZ2NjX2Fzc2Vy dCAoVkVDX2xlbmd0aCAodHJlZSwgZm5kZWNscykgPj0gMik7CisKKyAgLyog VGhlIGZpcnN0IHZlcnNpb24gaW4gdGhlIHZlY3RvciBpcyB0aGUgZGVmYXVs dCBkZWNsLiAgKi8KKyAgZGVmYXVsdF9kZWNsID0gVkVDX2luZGV4ICh0cmVl LCBmbmRlY2xzLCAwKTsKKworICBvbGRfY3VycmVudF9mdW5jdGlvbl9kZWNs ID0gY3VycmVudF9mdW5jdGlvbl9kZWNsOworICBwdXNoX2NmdW4gKERFQ0xf U1RSVUNUX0ZVTkNUSU9OIChkaXNwYXRjaF9kZWNsKSk7CisgIGN1cnJlbnRf ZnVuY3Rpb25fZGVjbCA9IGRpc3BhdGNoX2RlY2w7CisKKyAgZ3NlcSA9IGJi X3NlcSAoKmVtcHR5X2JiKTsKKyAgaWZ1bmNfY3B1X2luaXRfc3RtdCA9IGdp bXBsZV9idWlsZF9jYWxsX3ZlYyAoCisgICAgICAgICAgICAgICAgICAgICBp eDg2X2J1aWx0aW5zIFsoaW50KSBJWDg2X0JVSUxUSU5fQ1BVX0lOSVRdLCBO VUxMKTsKKyAgZ2ltcGxlX3NlcV9hZGRfc3RtdCAoJmdzZXEsIGlmdW5jX2Nw dV9pbml0X3N0bXQpOworICBnaW1wbGVfc2V0X2JiIChpZnVuY19jcHVfaW5p dF9zdG10LCAqZW1wdHlfYmIpOworICBzZXRfYmJfc2VxICgqZW1wdHlfYmIs IGdzZXEpOworCisgIHBvcF9jZnVuICgpOworICBjdXJyZW50X2Z1bmN0aW9u X2RlY2wgPSBvbGRfY3VycmVudF9mdW5jdGlvbl9kZWNsOworCisKKyAgZm9y IChpeCA9IDE7IFZFQ19pdGVyYXRlICh0cmVlLCBmbmRlY2xzLCBpeCwgZWxl KTsgKytpeCkKKyAgICB7CisgICAgICB0cmVlIHZlcnNpb25fZGVjbCA9IGVs ZTsKKyAgICAgIHRyZWUgcHJlZGljYXRlX2NoYWluID0gTlVMTF9UUkVFOwor ICAgICAgLyogR2V0IGF0dHJpYnV0ZSBzdHJpbmcsIHBhcnNlIGl0IGFuZCBm aW5kIHRoZSByaWdodCBwcmVkaWNhdGUgZGVjbC4KKyAgICAgICAgIFRoZSBw cmVkaWNhdGUgZnVuY3Rpb24gY291bGQgYmUgYSBsZW5ndGh5IGNvbWJpbmF0 aW9uIG9mIG1hbnkKKwkgZmVhdHVyZXMsIGxpa2UgYXJjaC10eXBlIGFuZCB2 YXJpb3VzIGlzYS12YXJpYW50cy4gICovCisgICAgICBwcmVkaWNhdGVfY2hh aW4gPSBnZXRfYnVpbHRpbl9jb2RlX2Zvcl92ZXJzaW9uICh2ZXJzaW9uX2Rl Y2wpOworCisgICAgICBpZiAocHJlZGljYXRlX2NoYWluID09IE5VTExfVFJF RSkKKwljb250aW51ZTsKKworICAgICAgKmVtcHR5X2JiID0gYWRkX2NvbmRp dGlvbl90b19iYiAoZGlzcGF0Y2hfZGVjbCwgdmVyc2lvbl9kZWNsLAorCQkJ CSAgICAgICBwcmVkaWNhdGVfY2hhaW4sICplbXB0eV9iYik7CisKKyAgICB9 CisgIC8qIGRpc3BhdGNoIGRlZmF1bHQgdmVyc2lvbiBhdCB0aGUgZW5kLiAg Ki8KKyAgKmVtcHR5X2JiID0gYWRkX2NvbmRpdGlvbl90b19iYiAoZGlzcGF0 Y2hfZGVjbCwgZGVmYXVsdF9kZWNsLAorCQkJCSAgIE5VTEwsICplbXB0eV9i Yik7CisgIHJldHVybiAwOworfQorCiAvKiBUaGlzIGJ1aWxkcyB0aGUgcHJv Y2Vzc29yX21vZGVsIHN0cnVjdCB0eXBlIGRlZmluZWQgaW4KICAgIGxpYmdj Yy9jb25maWcvaTM4Ni9pMzg2LWNwdWluZm8uYyAgKi8KIApAQCAtMzk0NjMs NiArMzk3ODMsOSBAQCBpeDg2X2F1dG92ZWN0b3JpemVfdmVjdG9yX3NpemVz ICh2b2lkKQogI3VuZGVmIFRBUkdFVF9GT0xEX0JVSUxUSU4KICNkZWZpbmUg VEFSR0VUX0ZPTERfQlVJTFRJTiBpeDg2X2ZvbGRfYnVpbHRpbgogCisjdW5k ZWYgVEFSR0VUX0RJU1BBVENIX1ZFUlNJT04KKyNkZWZpbmUgVEFSR0VUX0RJ U1BBVENIX1ZFUlNJT04gaXg4Nl9kaXNwYXRjaF92ZXJzaW9uCisKICN1bmRl ZiBUQVJHRVRfRU5VTV9WQV9MSVNUX1AKICNkZWZpbmUgVEFSR0VUX0VOVU1f VkFfTElTVF9QIGl4ODZfZW51bV92YV9saXN0CiAKSW5kZXg6IGdjYy90ZXN0 c3VpdGUvZysrLmRnL212MS5DCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t IGdjYy90ZXN0c3VpdGUvZysrLmRnL212MS5DCShyZXZpc2lvbiAwKQorKysg Z2NjL3Rlc3RzdWl0ZS9nKysuZGcvbXYxLkMJKHJldmlzaW9uIDApCkBAIC0w LDAgKzEsMjA0IEBACisvKiBUZXN0IGNhc2UgdG8gY2hlY2sgaWYgTXVsdGl2 ZXJzaW9uaW5nIHdvcmtzLiAgKi8KKy8qIHsgZGctZG8gcnVuIH0gKi8KKy8q IHsgZGctb3B0aW9ucyAiLU8yIC1mUElDIiB9ICovCisKKyNpbmNsdWRlIDxh c3NlcnQuaD4KKworLyogRGVmYXVsdCB2ZXJzaW9uLiAgKi8KK2ludCBmb28g KCk7CisvKiBDaGVjayBjb21iaW5hdGlvbiBvZiB0YXJnZXQgYXR0cmlidXRl cy4gICovCitpbnQgZm9vICgpIF9fYXR0cmlidXRlX18gKCh0YXJnZXQoImFy Y2g9Y29yZWk3LHNzZTQuMixwb3BjbnQiKSkpOworLyogVGhlIHRhcmdldCBv cGVyYW5kcyBpbiB0aGlzIGRlY2xhcmF0aW9uIGFuZCB0aGUgZGVmaW5pdGlv biBhcmUgcmUtb3JkZXJlZC4KKyAgIFRoaXMgc2hvdWxkIHN0aWxsIHdvcmsu ICAqLworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJzc3Nl MyxhdngyIikpKTsKKworLyogQ2hlY2sgZm9yIGFsbCB0YXJnZXQgYXR0cmli dXRlcyBmb3Igd2hpY2ggZGlzcGF0Y2hlcnMgYXJlIGF2YWlsYWJsZS4gICov CisvKiBDaGVjayBhcmNoPSAqLworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9f KCh0YXJnZXQoImFyY2g9Y29yZTIiKSkpOworaW50IGZvbyAoKSBfX2F0dHJp YnV0ZV9fKCh0YXJnZXQoImFyY2g9Y29yZWk3IikpKTsKK2ludCBmb28gKCkg X19hdHRyaWJ1dGVfXygodGFyZ2V0KCJhcmNoPWF0b20iKSkpOworaW50IGZv byAoKSBfX2F0dHJpYnV0ZV9fKCh0YXJnZXQoImFyY2g9YW1kZmFtMTAiKSkp OworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9fKCh0YXJnZXQoImFyY2g9YmR2 ZXIxIikpKTsKK2ludCBmb28gKCkgX19hdHRyaWJ1dGVfXygodGFyZ2V0KCJh cmNoPWJkdmVyMiIpKSk7CisvKiBDaGVjayBJU0EsIGxhdGVzdCBmZWF0dXJl cyBzaG91bGQgYmUgYWhlYWQuICAqLworaW50IGZvbyAoKSBfX2F0dHJpYnV0 ZV9fKCh0YXJnZXQoImF2eDIiKSkpOworaW50IGZvbyAoKSBfX2F0dHJpYnV0 ZV9fKCh0YXJnZXQoImF2eCIpKSk7CitpbnQgZm9vICgpIF9fYXR0cmlidXRl X18oKHRhcmdldCgicG9wY250IikpKTsKK2ludCBmb28gKCkgX19hdHRyaWJ1 dGVfXygodGFyZ2V0KCJzc2U0LjIiKSkpOworaW50IGZvbyAoKSBfX2F0dHJp YnV0ZV9fKCh0YXJnZXQoInNzZTQuMSIpKSk7CitpbnQgZm9vICgpIF9fYXR0 cmlidXRlX18oKHRhcmdldCgic3NzZTMiKSkpOworaW50IGZvbyAoKSBfX2F0 dHJpYnV0ZV9fKCh0YXJnZXQoIm1teCIpKSk7CitpbnQgZm9vICgpIF9fYXR0 cmlidXRlX18oKHRhcmdldCgic3NlMyIpKSk7CitpbnQgZm9vICgpIF9fYXR0 cmlidXRlX18oKHRhcmdldCgic3NlMiIpKSk7CitpbnQgZm9vICgpIF9fYXR0 cmlidXRlX18oKHRhcmdldCgic3NlIikpKTsKKworaW50ICgqcCkoKSA9ICZm b287CisKK2ludCBtYWluICgpCit7CisgIGludCB2YWwgPSBmb28gKCk7CisK KyAgLyogQ2hlY2sgaWYgY2FsbGluZyBmb28gdmlhIHB0ciBpcyB0aGUgc2Ft ZS4gICovCisgIGFzc2VydCAodmFsID09ICAoKnApKCkpOworCisgIGlmIChf X2J1aWx0aW5fY3B1X2lzICgiY29yZWk3IikKKyAgICAgICYmIF9fYnVpbHRp bl9jcHVfc3VwcG9ydHMgKCJzc2U0LjIiKQorICAgICAgJiYgX19idWlsdGlu X2NwdV9zdXBwb3J0cyAoInBvcGNudCIpKQorICAgIGFzc2VydCAodmFsID09 IDEpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgiYXZ4 MiIpCisJICAgJiYgX19idWlsdGluX2NwdV9zdXBwb3J0cyAoInNzc2UzIikp CisgICAgYXNzZXJ0ICh2YWwgPT0gMik7CisgIGVsc2UgaWYgKF9fYnVpbHRp bl9jcHVfaXMgKCJjb3JlMiIpKQorICAgIGFzc2VydCAodmFsID09IDMpOwor ICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X2lzICgiY29yZWk3IikpCisgICAg YXNzZXJ0ICh2YWwgPT0gNCk7CisgIGVsc2UgaWYgKF9fYnVpbHRpbl9jcHVf aXMgKCJhdG9tIikpCisgICAgYXNzZXJ0ICh2YWwgPT0gNSk7CisgIGVsc2Ug aWYgKF9fYnVpbHRpbl9jcHVfaXMgKCJhbWRmYW0xMGgiKSkKKyAgICBhc3Nl cnQgKHZhbCA9PSA2KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9pcyAo ImJkdmVyMSIpKQorICAgIGFzc2VydCAodmFsID09IDcpOworICBlbHNlIGlm IChfX2J1aWx0aW5fY3B1X2lzICgiYmR2ZXIyIikpCisgICAgYXNzZXJ0ICh2 YWwgPT0gOCk7CisgIGVsc2UgaWYgKF9fYnVpbHRpbl9jcHVfc3VwcG9ydHMg KCJhdngyIikpCisgICAgYXNzZXJ0ICh2YWwgPT0gLTEpOworICBlbHNlIGlm IChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgiYXZ4IikpCisgICAgYXNzZXJ0 ICh2YWwgPT0gLTIpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBv cnRzICgicG9wY250IikpCisgICAgYXNzZXJ0ICh2YWwgPT0gLTMpOworICBl bHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgic3NlNC4yIikpCisg ICAgYXNzZXJ0ICh2YWwgPT0gLTQpOworICBlbHNlIGlmIChfX2J1aWx0aW5f Y3B1X3N1cHBvcnRzICgic3NlNC4xIikpCisgICAgYXNzZXJ0ICh2YWwgPT0g LTUpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgic3Nz ZTMiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSAtNik7CisgIGVsc2UgaWYgKF9f YnVpbHRpbl9jcHVfc3VwcG9ydHMgKCJtbXgiKSkKKyAgICBhc3NlcnQgKHZh bCA9PSAtNyk7CisgIGVsc2UgaWYgKF9fYnVpbHRpbl9jcHVfc3VwcG9ydHMg KCJzc2UzIikpCisgICAgYXNzZXJ0ICh2YWwgPT0gLTgpOworICBlbHNlIGlm IChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgic3NlMiIpKQorICAgIGFzc2Vy dCAodmFsID09IC05KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9zdXBw b3J0cyAoInNzZSIpKQorICAgIGFzc2VydCAodmFsID09IC0xMCk7CisgIGVs c2UKKyAgICBhc3NlcnQgKHZhbCA9PSAwKTsKKworICByZXR1cm4gMDsKK30K KworaW50IGZvbyAoKQoreworICByZXR1cm4gMDsKK30KKworaW50IF9fYXR0 cmlidXRlX18gKCh0YXJnZXQoImFyY2g9Y29yZWk3LHNzZTQuMixwb3BjbnQi KSkpCitmb28gKCkKK3sKKyAgYXNzZXJ0IChfX2J1aWx0aW5fY3B1X2lzICgi Y29yZWk3IikKKwkgICYmIF9fYnVpbHRpbl9jcHVfc3VwcG9ydHMgKCJzc2U0 LjIiKQorCSAgJiYgX19idWlsdGluX2NwdV9zdXBwb3J0cyAoInBvcGNudCIp KTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFy Z2V0KCJhdngyLHNzc2UzIikpKQorZm9vICgpCit7CisgIGFzc2VydCAoX19i dWlsdGluX2NwdV9zdXBwb3J0cyAoImF2eDIiKQorCSAgJiYgX19idWlsdGlu X2NwdV9zdXBwb3J0cyAoInNzc2UzIikpOworICByZXR1cm4gMjsKK30KK2lu dCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWNvcmUyIikpKQorZm9v ICgpCit7CisgIHJldHVybiAzOworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAo KHRhcmdldCgiYXJjaD1jb3JlaTciKSkpCitmb28gKCkKK3sKKyAgcmV0dXJu IDQ7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWF0 b20iKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDU7Cit9CisKK2ludCBfX2F0 dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWFtZGZhbTEwIikpKQorZm9vICgp Cit7CisgIHJldHVybiA2OworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRh cmdldCgiYXJjaD1iZHZlcjEiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDc7 Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWJkdmVy MiIpKSkKK2ZvbyAoKQoreworICByZXR1cm4gODsKK30KKworaW50IF9fYXR0 cmlidXRlX18gKCh0YXJnZXQoImF2eDIiKSkpCitmb28gKCkKK3sKKyAgcmV0 dXJuIC0xOworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgiYXZ4 IikpKQorZm9vICgpCit7CisgIHJldHVybiAtMjsKK30KKworaW50IF9fYXR0 cmlidXRlX18gKCh0YXJnZXQoInBvcGNudCIpKSkKK2ZvbyAoKQoreworICBy ZXR1cm4gLTM7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJz c2U0LjIiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIC00OworfQorCitpbnQg X19hdHRyaWJ1dGVfXyAoKHRhcmdldCgic3NlNC4xIikpKQorZm9vICgpCit7 CisgIHJldHVybiAtNTsKK30KKworaW50IF9fYXR0cmlidXRlX18gKCh0YXJn ZXQoInNzc2UzIikpKQorZm9vICgpCit7CisgIHJldHVybiAtNjsKK30KKwor aW50IF9fYXR0cmlidXRlX18gKCh0YXJnZXQoIm1teCIpKSkKK2ZvbyAoKQor eworICByZXR1cm4gLTc7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFy Z2V0KCJzc2UzIikpKQorZm9vICgpCit7CisgIHJldHVybiAtODsKK30KKwor aW50IF9fYXR0cmlidXRlX18gKCh0YXJnZXQoInNzZTIiKSkpCitmb28gKCkK K3sKKyAgcmV0dXJuIC05OworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRh cmdldCgic3NlIikpKQorZm9vICgpCit7CisgIHJldHVybiAtMTA7Cit9Cg== --e89a8fb20170f9da2004bf04acb1--