From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x634.google.com (mail-ej1-x634.google.com [IPv6:2a00:1450:4864:20::634]) by sourceware.org (Postfix) with ESMTPS id 803143858402 for ; Wed, 9 Nov 2022 01:29:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 803143858402 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x634.google.com with SMTP id b2so43010393eja.6 for ; Tue, 08 Nov 2022 17:29:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=VGBxkMAESUe3CDcDRYPTuIHVxRlfI8kX/nMhRVZMZx0=; b=Z3UbUHBuEB0m8h5AsFtIvJC4eOVlHIu0nY4sdHrQe4zzH7uQ8Fbfmlf0o1DH/vRqOV cqGCasAa48eLtGDaWoF9cnl85nigSLQwKVyWH03cko6hUBVZPZ22b5HYVAPsS2U+743n db3aFyBkTNjdq7JD51Ap5+J8kHz0J6WirHGN3omr4qcrmz0p5oI9yGMGhIY2tNYSpG5l c7gr/3ofhJDptyzf4pPQjP3DWe76MMMcYq9SQfdTRYlYdSHiQpqvzTTAnWdeTe2MrfOs M0QkLJ9+eBKZOjU3Q3C9crGpMg46MZLIrgC1yLma3hu72vUV+JMDfzOTpA4z9fAiYG+S NKqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=VGBxkMAESUe3CDcDRYPTuIHVxRlfI8kX/nMhRVZMZx0=; b=Vfk7olF0l4XP9NR3pUgT/m5mGmR1SirGOHmyV1yyKm55stkz3L5rHMQqCHvLZsavL0 G6XWtcQAUsvSz3NIA6abOcW8Au/d0lrRZ5HjnseOcCP6hsa+d8Z/3Kbk5FB9Z+Qp1WGb BST+M3gB8GMItNqORtIEGzjGu/3CqKLeEnvGw97/T6CIsdfxudhjhEzbyv1BekCmePUZ Z43jA12E6hgHZWROCEYUX2fk9Ryc8NtO04pH4u5aVN0ZRz2PGQ4lFvS2hxJaatQNk07c QO7FjXqrXfhM+T8unRP85k90iAkXhsXK4nEei/q7kIRAuBkdrvTpCl/U03/5Pc9KtRmv x82g== X-Gm-Message-State: ACrzQf01f7goCMl85d9eKeC7vO1y17yUcrl2lUncNRhhIl+OYDO5vTvo ciL/OdXQ4jktnKHTs8vuRZAr8y3qN8Cyf75CSnk= X-Google-Smtp-Source: AMsMyM6OZVtnATv6Md+hZCnPW4MSJr4j517Jwm1wAqfefCFalK9k6k3EOE6Ypxir0AbjD8WA1RsFzIvQuchLMCSusIk= X-Received: by 2002:a17:907:7f25:b0:7aa:acf9:c07e with SMTP id qf37-20020a1709077f2500b007aaacf9c07emr55097599ejc.280.1667957377565; Tue, 08 Nov 2022 17:29:37 -0800 (PST) MIME-Version: 1.0 References: <20221102033728.99379-1-hongyu.wang@intel.com> In-Reply-To: From: Hongyu Wang Date: Wed, 9 Nov 2022 09:24:24 +0800 Message-ID: Subject: Re: [PATCH V2] Enable small loop unrolling for O2 To: Hongtao Liu Cc: Richard Biener , Hongyu Wang , gcc-patches@gcc.gnu.org, ubizjak@gmail.com, hongtao.liu@intel.com Content-Type: multipart/mixed; boundary="000000000000fdb46405ecff96fe" X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,GIT_PATCH_0,KAM_NUMSUBJECT,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000fdb46405ecff96fe Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable > Although ix86_small_unroll_insns is coming from issue_rate, it's tuned > for codesize. > Make it exact as issue_rate and using factor * issue_width / > loop->ninsns may increase code size too much. > So I prefer to add those 2 parameters to the cost table for core > tunings instead of 1. Yes, here is the updated patch that changes the cost table. Bootstrapped & regrtested on x86_64-pc-linux-gnu. Ok for trunk? Hongtao Liu via Gcc-patches =E4=BA=8E2022=E5=B9= =B411=E6=9C=888=E6=97=A5=E5=91=A8=E4=BA=8C 11:05=E5=86=99=E9=81=93=EF=BC=9A > > On Mon, Nov 7, 2022 at 10:25 PM Richard Biener via Gcc-patches > wrote: > > > > On Wed, Nov 2, 2022 at 4:37 AM Hongyu Wang wrot= e: > > > > > > Hi, this is the updated patch of > > > https://gcc.gnu.org/pipermail/gcc-patches/2022-October/604345.html, > > > which uses targetm.loop_unroll_adjust as gate to enable small loop un= roll. > > > > > > This patch does not change rs6000/s390 since I don't have machine to > > > test them, but I suppose the default behavior is the same since they > > > enable flag_unroll_loops at O2. > > > > > > Bootstrapped & regrtested on x86_64-pc-linux-gnu. > > > > > > Ok for trunk? > > > > > > ---------- Patch content -------- > > > > > > Modern processors has multiple way instruction decoders > > > For x86, icelake/zen3 has 5 uops, so for small loop with <=3D 4 > > > instructions (usually has 3 uops with a cmp/jmp pair that can be > > > macro-fused), the decoder would have 2 uops bubble for each iteration > > > and the pipeline could not be fully utilized. > > > > > > Therefore, this patch enables loop unrolling for small size loop at O= 2 > > > to fullfill the decoder as much as possible. It turns on rtl loop > > > unrolling when targetm.loop_unroll_adjust exists and O2 plus speed on= ly. > > > In x86 backend the default behavior is to unroll small loops with les= s > > > than 4 insns by 1 time. > > > > > > This improves 548.exchange2 by 9% on icelake and 7.4% on zen3 with > > > 0.9% codesize increment. For other benchmarks the variants are minor > > > and overall codesize increased by 0.2%. > > > > > > The kernel image size increased by 0.06%, and no impact on eembc. > > > > > > gcc/ChangeLog: > > > > > > * common/config/i386/i386-common.cc (ix86_optimization_table)= : > > > Enable small loop unroll at O2 by default. > > > * config/i386/i386.cc (ix86_loop_unroll_adjust): Adjust unrol= l > > > factor if -munroll-only-small-loops enabled and -funroll-loop= s/ > > > -funroll-all-loops are disabled. > > > * config/i386/i386.opt: Add -munroll-only-small-loops, > > > -param=3Dx86-small-unroll-ninsns=3D for loop insn limit, > > > -param=3Dx86-small-unroll-factor=3D for unroll factor. > > > * doc/invoke.texi: Document -munroll-only-small-loops, > > > x86-small-unroll-ninsns and x86-small-unroll-factor. > > > * loop-init.cc (pass_rtl_unroll_loops::gate): Enable rtl > > > loop unrolling for -O2-speed and above if target hook > > > loop_unroll_adjust exists. > > > > > > gcc/testsuite/ChangeLog: > > > > > > * gcc.dg/guality/loop-1.c: Add additional option > > > -mno-unroll-only-small-loops. > > > * gcc.target/i386/pr86270.c: Add -mno-unroll-only-small-loops= . > > > * gcc.target/i386/pr93002.c: Likewise. > > > --- > > > gcc/common/config/i386/i386-common.cc | 1 + > > > gcc/config/i386/i386.cc | 18 ++++++++++++++++++ > > > gcc/config/i386/i386.opt | 13 +++++++++++++ > > > gcc/doc/invoke.texi | 16 ++++++++++++++++ > > > gcc/loop-init.cc | 10 +++++++--- > > > gcc/testsuite/gcc.dg/guality/loop-1.c | 2 ++ > > > gcc/testsuite/gcc.target/i386/pr86270.c | 2 +- > > > gcc/testsuite/gcc.target/i386/pr93002.c | 2 +- > > > 8 files changed, 59 insertions(+), 5 deletions(-) > > > > > > diff --git a/gcc/common/config/i386/i386-common.cc b/gcc/common/confi= g/i386/i386-common.cc > > > index f66bdd5a2af..c6891486078 100644 > > > --- a/gcc/common/config/i386/i386-common.cc > > > +++ b/gcc/common/config/i386/i386-common.cc > > > @@ -1724,6 +1724,7 @@ static const struct default_options ix86_option= _optimization_table[] =3D > > > /* The STC algorithm produces the smallest code at -Os, for x86.= */ > > > { OPT_LEVELS_2_PLUS, OPT_freorder_blocks_algorithm_, NULL, > > > REORDER_BLOCKS_ALGORITHM_STC }, > > > + { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_munroll_only_small_loops, NU= LL, 1 }, > > > /* Turn off -fschedule-insns by default. It tends to make the > > > problem with not enough registers even worse. */ > > > { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 }, > > > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc > > > index c0f37149ed0..0f94a3b609e 100644 > > > --- a/gcc/config/i386/i386.cc > > > +++ b/gcc/config/i386/i386.cc > > > @@ -23827,6 +23827,24 @@ ix86_loop_unroll_adjust (unsigned nunroll, c= lass loop *loop) > > > unsigned i; > > > unsigned mem_count =3D 0; > > > > > > + /* Unroll small size loop when unroll factor is not explicitly > > > + specified. */ > > > + if (!(flag_unroll_loops > > > + || flag_unroll_all_loops > > > + || loop->unroll)) > > > + { > > > + nunroll =3D 1; > > > + > > > + /* Any explicit -f{no-}unroll-{all-}loops turns off > > > + -munroll-only-small-loops. */ > > > + if (ix86_unroll_only_small_loops > > > + && !OPTION_SET_P (flag_unroll_loops)) > > > + if (loop->ninsns <=3D (unsigned) ix86_small_unroll_ninsns) > > > > either add braces or combine the two if's > > > > Otherwise the middle-end changes look OK. The target maintainers need = to decide > > whether the two --params should be core tunings instead - I would assum= e that > > given your rationale the decode and issue widths of the core plays an i= mportant > > role here. That might also suggest a single parameter instead and unro= lling > > (factor * issue_width) / loop->ninsns times instead of a static unroll_= factor? > Although ix86_small_unroll_insns is coming from issue_rate, it's tuned > for codesize. > Make it exact as issue_rate and using factor * issue_width / > loop->ninsns may increase code size too much. > So I prefer to add those 2 parameters to the cost table for core > tunings instead of 1. > > > > Thanks, > > Richard. > > > > > + nunroll =3D (unsigned) ix86_small_unroll_factor; > > > + > > > + return nunroll; > > > + } > > > + > > > if (!TARGET_ADJUST_UNROLL) > > > return nunroll; > > > > > > diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt > > > index 53d534f6392..6da9c8d670d 100644 > > > --- a/gcc/config/i386/i386.opt > > > +++ b/gcc/config/i386/i386.opt > > > @@ -1224,3 +1224,16 @@ mavxvnniint8 > > > Target Mask(ISA2_AVXVNNIINT8) Var(ix86_isa_flags2) Save > > > Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and > > > AVXVNNIINT8 built-in functions and code generation. > > > + > > > +munroll-only-small-loops > > > +Target Var(ix86_unroll_only_small_loops) Init(0) Save > > > +Enable conservative small loop unrolling. > > > + > > > +-param=3Dx86-small-unroll-ninsns=3D > > > +Target Joined UInteger Var(ix86_small_unroll_ninsns) Init(4) Param > > > +Insturctions number limit for loop to be unrolled under > > > +-munroll-only-small-loops. > > > + > > > +-param=3Dx86-small-unroll-factor=3D > > > +Target Joined UInteger Var(ix86_small_unroll_factor) Init(2) Param > > > +Unroll factor for -munroll-only-small-loops. > > > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > > > index 550aec87809..487218bd0ce 100644 > > > --- a/gcc/doc/invoke.texi > > > +++ b/gcc/doc/invoke.texi > > > @@ -15821,6 +15821,14 @@ The following choices of @var{name} are avai= lable on i386 and x86_64 targets: > > > @item x86-stlf-window-ninsns > > > Instructions number above which STFL stall penalty can be compensate= d. > > > > > > +@item x86-small-unroll-ninsns > > > +If -munroll-only-small-loops is enabled, only unroll loops with inst= ruction > > > +count less than this parameter. The default value is 4. > > > + > > > +@item x86-small-unroll-factor > > > +If -munroll-only-small-loops is enabled, reset the unroll factor wit= h this > > > +value. The default value is 2 which means the loop will be unrolled = once. > > > + > > > @end table > > > > > > @end table > > > @@ -25232,6 +25240,14 @@ environments where no dynamic link is perfor= med, like firmwares, OS > > > kernels, executables linked with @option{-static} or @option{-static= -pie}. > > > @option{-mdirect-extern-access} is not compatible with @option{-fPIC= } or > > > @option{-fpic}. > > > + > > > +@item -munroll-only-small-loops > > > +@itemx -mno-unroll-only-small-loops > > > +@opindex munroll-only-small-loops > > > +Controls conservative small loop unrolling. It is default enbaled by > > > +O2, and unrolls loop with less than 4 insns by 1 time. Explicit > > > +-f[no-]unroll-[all-]loops would disable this flag to avoid any > > > +unintended unrolling behavior that user does not want. > > > @end table > > > > > > @node M32C Options > > > diff --git a/gcc/loop-init.cc b/gcc/loop-init.cc > > > index b9e07973dd6..9789efa1e11 100644 > > > --- a/gcc/loop-init.cc > > > +++ b/gcc/loop-init.cc > > > @@ -565,9 +565,12 @@ public: > > > {} > > > > > > /* opt_pass methods: */ > > > - bool gate (function *) final override > > > + bool gate (function *fun) final override > > > { > > > - return (flag_unroll_loops || flag_unroll_all_loops || cfun->ha= s_unroll); > > > + return (flag_unroll_loops || flag_unroll_all_loops || cfun->ha= s_unroll > > > + || (targetm.loop_unroll_adjust > > > + && optimize >=3D 2 > > > + && optimize_function_for_speed_p (fun))); > > > } > > > > > > unsigned int execute (function *) final override; > > > @@ -583,7 +586,8 @@ pass_rtl_unroll_loops::execute (function *fun) > > > if (dump_file) > > > df_dump (dump_file); > > > > > > - if (flag_unroll_loops) > > > + if (flag_unroll_loops > > > + || targetm.loop_unroll_adjust) > > > flags |=3D UAP_UNROLL; > > > if (flag_unroll_all_loops) > > > flags |=3D UAP_UNROLL_ALL; > > > diff --git a/gcc/testsuite/gcc.dg/guality/loop-1.c b/gcc/testsuite/gc= c.dg/guality/loop-1.c > > > index 1b1f6d32271..a32ea445a3f 100644 > > > --- a/gcc/testsuite/gcc.dg/guality/loop-1.c > > > +++ b/gcc/testsuite/gcc.dg/guality/loop-1.c > > > @@ -1,5 +1,7 @@ > > > /* { dg-do run } */ > > > /* { dg-options "-fno-tree-scev-cprop -fno-tree-vectorize -g" } */ > > > +/* { dg-additional-options "-mno-unroll-only-small-loops" { target i= a32 } } */ > > > + > > > > > > #include "../nop.h" > > > > > > diff --git a/gcc/testsuite/gcc.target/i386/pr86270.c b/gcc/testsuite/= gcc.target/i386/pr86270.c > > > index 81841ef5bd7..cbc9fbb0450 100644 > > > --- a/gcc/testsuite/gcc.target/i386/pr86270.c > > > +++ b/gcc/testsuite/gcc.target/i386/pr86270.c > > > @@ -1,5 +1,5 @@ > > > /* { dg-do compile } */ > > > -/* { dg-options "-O2" } */ > > > +/* { dg-options "-O2 -mno-unroll-only-small-loops" } */ > > > > > > int *a; > > > long len; > > > diff --git a/gcc/testsuite/gcc.target/i386/pr93002.c b/gcc/testsuite/= gcc.target/i386/pr93002.c > > > index 0248fcc00a5..f75a847f75d 100644 > > > --- a/gcc/testsuite/gcc.target/i386/pr93002.c > > > +++ b/gcc/testsuite/gcc.target/i386/pr93002.c > > > @@ -1,6 +1,6 @@ > > > /* PR target/93002 */ > > > /* { dg-do compile } */ > > > -/* { dg-options "-O2" } */ > > > +/* { dg-options "-O2 -mno-unroll-only-small-loops" } */ > > > /* { dg-final { scan-assembler-not "cmp\[^\n\r]*-1" } } */ > > > > > > volatile int sink; > > > -- > > > 2.18.1 > > > > > > > -- > BR, > Hongtao --000000000000fdb46405ecff96fe Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Enable-small-loop-unrolling-for-O2.patch" Content-Disposition: attachment; filename="0001-Enable-small-loop-unrolling-for-O2.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_la8yiahy0 RnJvbSBlN2NkMjBiY2M5NzQ4MWMwNWMwMTVhNDE5N2U1NzRlZjljNzQ2MDg3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIb25neXUgV2FuZyA8aG9uZ3l1LndhbmdAaW50ZWwuY29tPgpE YXRlOiBUaHUsIDggU2VwIDIwMjIgMTY6NTI6MDIgKzA4MDAKU3ViamVjdDogW1BBVENIXSBFbmFi bGUgc21hbGwgbG9vcCB1bnJvbGxpbmcgZm9yIE8yCgpNb2Rlcm4gcHJvY2Vzc29ycyBoYXMgbXVs dGlwbGUgd2F5IGluc3RydWN0aW9uIGRlY29kZXJzCkZvciB4ODYsIGljZWxha2UvemVuMyBoYXMg NSB1b3BzLCBzbyBmb3Igc21hbGwgbG9vcCB3aXRoIDw9IDQKaW5zdHJ1Y3Rpb25zICh1c3VhbGx5 IGhhcyAzIHVvcHMgd2l0aCBhIGNtcC9qbXAgcGFpciB0aGF0IGNhbiBiZQptYWNyby1mdXNlZCks IHRoZSBkZWNvZGVyIHdvdWxkIGhhdmUgMiB1b3BzIGJ1YmJsZSBmb3IgZWFjaCBpdGVyYXRpb24K YW5kIHRoZSBwaXBlbGluZSBjb3VsZCBub3QgYmUgZnVsbHkgdXRpbGl6ZWQuCgpUaGVyZWZvcmUs IHRoaXMgcGF0Y2ggZW5hYmxlcyBsb29wIHVucm9sbGluZyBmb3Igc21hbGwgc2l6ZSBsb29wIGF0 IE8yCnRvIGZ1bGxmaWxsIHRoZSBkZWNvZGVyIGFzIG11Y2ggYXMgcG9zc2libGUuIEl0IHR1cm5z IG9uIHJ0bCBsb29wCnVucm9sbGluZyB3aGVuIHRhcmdldG0ubG9vcF91bnJvbGxfYWRqdXN0IGV4 aXN0cyBhbmQgTzIgcGx1cyBzcGVlZCBvbmx5LgpJbiB4ODYgYmFja2VuZCB0aGUgZGVmYXVsdCBi ZWhhdmlvciBpcyB0byB1bnJvbGwgc21hbGwgbG9vcHMgd2l0aCBsZXNzCnRoYW4gNCBpbnNucyBi eSAxIHRpbWUuCgpUaGlzIGltcHJvdmVzIDU0OC5leGNoYW5nZTIgYnkgOSUgb24gaWNlbGFrZSBh bmQgNy40JSBvbiB6ZW4zIHdpdGgKMC45JSBjb2Rlc2l6ZSBpbmNyZW1lbnQuIEZvciBvdGhlciBi ZW5jaG1hcmtzIHRoZSB2YXJpYW50cyBhcmUgbWlub3IKYW5kIG92ZXJhbGwgY29kZXNpemUgaW5j cmVhc2VkIGJ5IDAuMiUuCgpUaGUga2VybmVsIGltYWdlIHNpemUgaW5jcmVhc2VkIGJ5IDAuMDYl LCBhbmQgbm8gaW1wYWN0IG9uIGVlbWJjLgoKZ2NjL0NoYW5nZUxvZzoKCgkqIGNvbW1vbi9jb25m aWcvaTM4Ni9pMzg2LWNvbW1vbi5jYyAoaXg4Nl9vcHRpbWl6YXRpb25fdGFibGUpOgoJRW5hYmxl IHNtYWxsIGxvb3AgdW5yb2xsIGF0IE8yIGJ5IGRlZmF1bHQuCgkqIGNvbmZpZy9pMzg2L2kzODYu Y2MgKGl4ODZfbG9vcF91bnJvbGxfYWRqdXN0KTogQWRqdXN0IHVucm9sbAoJZmFjdG9yIGlmIC1t dW5yb2xsLW9ubHktc21hbGwtbG9vcHMgZW5hYmxlZCBhbmQgLWZ1bnJvbGwtbG9vcHMvCgktZnVu cm9sbC1hbGwtbG9vcHMgYXJlIGRpc2FibGVkLgoJKiBjb25maWcvaTM4Ni9pMzg2LmggKHN0cnVj dCBwcm9jZXNzb3JfY29zdHMpOiBBZGQgMiBmaWVsZAoJc21hbGxfdW5yb2xsX25pbnNucyBhbmQg c21hbGxfdW5yb2xsX2ZhY3Rvci4KCSogY29uZmlnL2kzODYvaTM4Ni5vcHQ6IEFkZCAtbXVucm9s bC1vbmx5LXNtYWxsLWxvb3BzLgoJKiBkb2MvaW52b2tlLnRleGk6IERvY3VtZW50IC1tdW5yb2xs LW9ubHktc21hbGwtbG9vcHMuCgkqIGxvb3AtaW5pdC5jYyAocGFzc19ydGxfdW5yb2xsX2xvb3Bz OjpnYXRlKTogRW5hYmxlIHJ0bAoJbG9vcCB1bnJvbGxpbmcgZm9yIC1PMi1zcGVlZCBhbmQgYWJv dmUgaWYgdGFyZ2V0IGhvb2sKCWxvb3BfdW5yb2xsX2FkanVzdCBleGlzdHMuCgkocGFzc19ydGxf dW5yb2xsX2xvb3BzOjpleGVjdXRlKTogU2V0IFVBUF9VTlJPTEwgZmxhZwoJd2hlbiB0YXJnZXQg aG9vayBsb29wX3Vucm9sbF9hZGp1c3QgZXhpc3RzLgoJKiBjb25maWcvaTM4Ni94ODYtdHVuZS1j b3N0cy5oOiBVcGRhdGUgYWxsIHByb2Nlc3NvciBjb3N0cwoJd2l0aCBzbWFsbF91bnJvbGxfbmlu c25zID0gNCBhbmQgc21hbGxfdW5yb2xsX2ZhY3RvciA9IDIuCgpnY2MvdGVzdHN1aXRlL0NoYW5n ZUxvZzoKCgkqIGdjYy5kZy9ndWFsaXR5L2xvb3AtMS5jOiBBZGQgYWRkaXRpb25hbCBvcHRpb24K CSAgLW1uby11bnJvbGwtb25seS1zbWFsbC1sb29wcy4KCSogZ2NjLnRhcmdldC9pMzg2L3ByODYy NzAuYzogQWRkIC1tbm8tdW5yb2xsLW9ubHktc21hbGwtbG9vcHMuCgkqIGdjYy50YXJnZXQvaTM4 Ni9wcjkzMDAyLmM6IExpa2V3aXNlLgotLS0KIGdjYy9jb21tb24vY29uZmlnL2kzODYvaTM4Ni1j b21tb24uY2MgICB8ICAxICsKIGdjYy9jb25maWcvaTM4Ni9pMzg2LmNjICAgICAgICAgICAgICAg ICB8IDE4ICsrKysrKysrCiBnY2MvY29uZmlnL2kzODYvaTM4Ni5oICAgICAgICAgICAgICAgICAg fCAgNSArKysKIGdjYy9jb25maWcvaTM4Ni9pMzg2Lm9wdCAgICAgICAgICAgICAgICB8ICA0ICsr CiBnY2MvY29uZmlnL2kzODYveDg2LXR1bmUtY29zdHMuaCAgICAgICAgfCA2MCArKysrKysrKysr KysrKysrKysrKysrKysrCiBnY2MvZG9jL2ludm9rZS50ZXhpICAgICAgICAgICAgICAgICAgICAg fCAgOCArKysrCiBnY2MvbG9vcC1pbml0LmNjICAgICAgICAgICAgICAgICAgICAgICAgfCAxMCAr KystLQogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZ3VhbGl0eS9sb29wLTEuYyAgIHwgIDIgKwogZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4NjI3MC5jIHwgIDIgKy0KIGdjYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9pMzg2L3ByOTMwMDIuYyB8ICAyICstCiAxMCBmaWxlcyBjaGFuZ2VkLCAx MDcgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9nY2MvY29tbW9u L2NvbmZpZy9pMzg2L2kzODYtY29tbW9uLmNjIGIvZ2NjL2NvbW1vbi9jb25maWcvaTM4Ni9pMzg2 LWNvbW1vbi5jYwppbmRleCA0MzFmZDBkM2FkMS4uMmY0OTFiMmY4NGIgMTAwNjQ0Ci0tLSBhL2dj Yy9jb21tb24vY29uZmlnL2kzODYvaTM4Ni1jb21tb24uY2MKKysrIGIvZ2NjL2NvbW1vbi9jb25m aWcvaTM4Ni9pMzg2LWNvbW1vbi5jYwpAQCAtMTgwMyw2ICsxODAzLDcgQEAgc3RhdGljIGNvbnN0 IHN0cnVjdCBkZWZhdWx0X29wdGlvbnMgaXg4Nl9vcHRpb25fb3B0aW1pemF0aW9uX3RhYmxlW10g PQogICAgIC8qIFRoZSBTVEMgYWxnb3JpdGhtIHByb2R1Y2VzIHRoZSBzbWFsbGVzdCBjb2RlIGF0 IC1PcywgZm9yIHg4Ni4gICovCiAgICAgeyBPUFRfTEVWRUxTXzJfUExVUywgT1BUX2ZyZW9yZGVy X2Jsb2Nrc19hbGdvcml0aG1fLCBOVUxMLAogICAgICAgUkVPUkRFUl9CTE9DS1NfQUxHT1JJVEhN X1NUQyB9LAorICAgIHsgT1BUX0xFVkVMU18yX1BMVVNfU1BFRURfT05MWSwgT1BUX211bnJvbGxf b25seV9zbWFsbF9sb29wcywgTlVMTCwgMSB9LAogICAgIC8qIFR1cm4gb2ZmIC1mc2NoZWR1bGUt aW5zbnMgYnkgZGVmYXVsdC4gIEl0IHRlbmRzIHRvIG1ha2UgdGhlCiAgICAgICAgcHJvYmxlbSB3 aXRoIG5vdCBlbm91Z2ggcmVnaXN0ZXJzIGV2ZW4gd29yc2UuICAqLwogICAgIHsgT1BUX0xFVkVM U19BTEwsIE9QVF9mc2NoZWR1bGVfaW5zbnMsIE5VTEwsIDAgfSwKZGlmZiAtLWdpdCBhL2djYy9j b25maWcvaTM4Ni9pMzg2LmNjIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYuY2MKaW5kZXggZjg1ODY0 OTljZDEuLjI5MmIzMmM1ZTk5IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5jYwor KysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5jYwpAQCAtMjM4MjcsNiArMjM4MjcsMjQgQEAgaXg4 Nl9sb29wX3Vucm9sbF9hZGp1c3QgKHVuc2lnbmVkIG51bnJvbGwsIGNsYXNzIGxvb3AgKmxvb3Ap CiAgIHVuc2lnbmVkIGk7CiAgIHVuc2lnbmVkIG1lbV9jb3VudCA9IDA7CiAKKyAgLyogVW5yb2xs IHNtYWxsIHNpemUgbG9vcCB3aGVuIHVucm9sbCBmYWN0b3IgaXMgbm90IGV4cGxpY2l0bHkKKyAg ICAgc3BlY2lmaWVkLiAgKi8KKyAgaWYgKCEoZmxhZ191bnJvbGxfbG9vcHMKKwl8fCBmbGFnX3Vu cm9sbF9hbGxfbG9vcHMKKwl8fCBsb29wLT51bnJvbGwpKQorICAgIHsKKyAgICAgIG51bnJvbGwg PSAxOworCisgICAgICAvKiBBbnkgZXhwbGljaXQgLWZ7bm8tfXVucm9sbC17YWxsLX1sb29wcyB0 dXJucyBvZmYKKwkgLW11bnJvbGwtb25seS1zbWFsbC1sb29wcy4gICovCisgICAgICBpZiAoaXg4 Nl91bnJvbGxfb25seV9zbWFsbF9sb29wcworCSAgJiYgIU9QVElPTl9TRVRfUCAoZmxhZ191bnJv bGxfbG9vcHMpCisJICAmJiBsb29wLT5uaW5zbnMgPD0gaXg4Nl9jb3N0LT5zbWFsbF91bnJvbGxf bmluc25zKQorCW51bnJvbGwgPSBpeDg2X2Nvc3QtPnNtYWxsX3Vucm9sbF9mYWN0b3I7CisKKyAg ICAgIHJldHVybiBudW5yb2xsOworICAgIH0KKwogICBpZiAoIVRBUkdFVF9BREpVU1RfVU5ST0xM KQogICAgICByZXR1cm4gbnVucm9sbDsKIApkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kz ODYuaCBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmgKaW5kZXggYjMyZGI4ZGExMDkuLmI3MzcxZDBm MWE1IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5oCisrKyBiL2djYy9jb25maWcv aTM4Ni9pMzg2LmgKQEAgLTIxOSw2ICsyMTksMTEgQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0cyB7 CiAgIGNvbnN0IGNoYXIgKmNvbnN0IGFsaWduX2p1bXA7CQkvKiBKdW1wIGFsaWdubWVudC4gICov CiAgIGNvbnN0IGNoYXIgKmNvbnN0IGFsaWduX2xhYmVsOwkvKiBMYWJlbCBhbGlnbm1lbnQuICAq LwogICBjb25zdCBjaGFyICpjb25zdCBhbGlnbl9mdW5jOwkJLyogRnVuY3Rpb24gYWxpZ25tZW50 LiAgKi8KKworICBjb25zdCB1bnNpZ25lZCBzbWFsbF91bnJvbGxfbmluc25zOwkvKiBJbnNuIGNv dW50IGxpbWl0IGZvciBzbWFsbCBsb29wCisJCQkJCSAgIHRvIGJlIHVucm9sbGVkLiAgKi8KKyAg Y29uc3QgdW5zaWduZWQgc21hbGxfdW5yb2xsX2ZhY3RvcjsgICAvKiBVbnJvbGwgZmFjdG9yIGZv ciBzbWFsbCBsb29wIHRvCisJCQkJCSAgIGJlIHVucm9sbGVkLiAgKi8KIH07CiAKIGV4dGVybiBj b25zdCBzdHJ1Y3QgcHJvY2Vzc29yX2Nvc3RzICppeDg2X2Nvc3Q7CmRpZmYgLS1naXQgYS9nY2Mv Y29uZmlnL2kzODYvaTM4Ni5vcHQgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5vcHQKaW5kZXggNDE1 YzUyZTFiYjQuLmQ2YjgwZWZhMDRkIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5v cHQKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYub3B0CkBAIC0xMjQ2LDMgKzEyNDYsNyBAQCBT dXBwb3J0IFBSRUZFVENISSBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIGNvZGUgZ2VuZXJhdGlvbi4K IG1yYW9pbnQKIFRhcmdldCBNYXNrKElTQTJfUkFPSU5UKSBWYXIoaXg4Nl9pc2FfZmxhZ3MyKSBT YXZlCiBTdXBwb3J0IFJBT0lOVCBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIGNvZGUgZ2VuZXJhdGlv bi4KKworbXVucm9sbC1vbmx5LXNtYWxsLWxvb3BzCitUYXJnZXQgVmFyKGl4ODZfdW5yb2xsX29u bHlfc21hbGxfbG9vcHMpIEluaXQoMCkgU2F2ZQorRW5hYmxlIGNvbnNlcnZhdGl2ZSBzbWFsbCBs b29wIHVucm9sbGluZy4KZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni94ODYtdHVuZS1jb3N0 cy5oIGIvZ2NjL2NvbmZpZy9pMzg2L3g4Ni10dW5lLWNvc3RzLmgKaW5kZXggYWVhYTdlYjAwOGUu LmYwMWI4ZWU5ZWVmIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYveDg2LXR1bmUtY29zdHMu aAorKysgYi9nY2MvY29uZmlnL2kzODYveDg2LXR1bmUtY29zdHMuaApAQCAtMTM1LDYgKzEzNSw4 IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgaXg4Nl9zaXplX2Nvc3QgPSB7LyogY29zdHMgZm9y IHR1bmluZyBmb3Igc2l6ZSAqLwogICBOVUxMLAkJCQkJLyogSnVtcCBhbGlnbm1lbnQuICAqLwog ICBOVUxMLAkJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgTlVMTCwJCQkJCS8qIEZ1bmMg YWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisgIDIs CQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIC8qIFByb2Nlc3NvciBjb3N0 cyAocmVsYXRpdmUgdG8gYW4gYWRkKSAqLwpAQCAtMjQ0LDYgKzI0Niw4IEBAIHN0cnVjdCBwcm9j ZXNzb3JfY29zdHMgaTM4Nl9jb3N0ID0gewkvKiAzODYgc3BlY2lmaWMgY29zdHMgKi8KICAgIjQi LAkJCQkJLyogSnVtcCBhbGlnbm1lbnQuICAqLwogICBOVUxMLAkJCQkJLyogTGFiZWwgYWxpZ25t ZW50LiAgKi8KICAgIjQiLAkJCQkJLyogRnVuYyBhbGlnbm1lbnQuICAqLworICA0LAkJCQkJLyog U21hbGwgdW5yb2xsIGxpbWl0LiAgKi8KKyAgMiwJCQkJCS8qIFNtYWxsIHVucm9sbCBmYWN0b3Iu ICAqLwogfTsKIAogc3RhdGljIHN0cmluZ29wX2FsZ3MgaTQ4Nl9tZW1jcHlbMl0gPSB7CkBAIC0z NTQsNiArMzU4LDggQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0cyBpNDg2X2Nvc3QgPSB7CS8qIDQ4 NiBzcGVjaWZpYyBjb3N0cyAqLwogICAiMTYiLAkJCQkJLyogSnVtcCBhbGlnbm1lbnQuICAqLwog ICAiMDowOjgiLAkJCQkvKiBMYWJlbCBhbGlnbm1lbnQuICAqLwogICAiMTYiLAkJCQkJLyogRnVu YyBhbGlnbm1lbnQuICAqLworICA0LAkJCQkJLyogU21hbGwgdW5yb2xsIGxpbWl0LiAgKi8KKyAg MiwJCQkJCS8qIFNtYWxsIHVucm9sbCBmYWN0b3IuICAqLwogfTsKIAogc3RhdGljIHN0cmluZ29w X2FsZ3MgcGVudGl1bV9tZW1jcHlbMl0gPSB7CkBAIC00NjIsNiArNDY4LDggQEAgc3RydWN0IHBy b2Nlc3Nvcl9jb3N0cyBwZW50aXVtX2Nvc3QgPSB7CiAgICIxNjo4OjgiLAkJCQkvKiBKdW1wIGFs aWdubWVudC4gICovCiAgICIwOjA6OCIsCQkJCS8qIExhYmVsIGFsaWdubWVudC4gICovCiAgICIx NiIsCQkJCQkvKiBGdW5jIGFsaWdubWVudC4gICovCisgIDQsCQkJCQkvKiBTbWFsbCB1bnJvbGwg bGltaXQuICAqLworICAyLAkJCQkJLyogU21hbGwgdW5yb2xsIGZhY3Rvci4gICovCiB9OwogCiBz dGF0aWMgY29uc3QKQEAgLTU2Myw2ICs1NzEsOCBAQCBzdHJ1Y3QgcHJvY2Vzc29yX2Nvc3RzIGxh a2Vtb250X2Nvc3QgPSB7CiAgICIxNjo4OjgiLAkJCQkvKiBKdW1wIGFsaWdubWVudC4gICovCiAg ICIwOjA6OCIsCQkJCS8qIExhYmVsIGFsaWdubWVudC4gICovCiAgICIxNiIsCQkJCQkvKiBGdW5j IGFsaWdubWVudC4gICovCisgIDQsCQkJCQkvKiBTbWFsbCB1bnJvbGwgbGltaXQuICAqLworICAy LAkJCQkJLyogU21hbGwgdW5yb2xsIGZhY3Rvci4gICovCiB9OwogCiAvKiBQZW50aXVtUHJvIGhh cyBvcHRpbWl6ZWQgcmVwIGluc3RydWN0aW9ucyBmb3IgYmxvY2tzIGFsaWduZWQgYnkgOCBieXRl cwpAQCAtNjc5LDYgKzY4OSw4IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgcGVudGl1bXByb19j b3N0ID0gewogICAiMTY6MTE6OCIsCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8KICAgIjA6MDo4 IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjE2IiwJCQkJCS8qIEZ1bmMgYWxpZ25t ZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisgIDIsCQkJCQkv KiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIHN0YXRpYyBzdHJpbmdvcF9hbGdzIGdl b2RlX21lbWNweVsyXSA9IHsKQEAgLTc4Niw2ICs3OTgsOCBAQCBzdHJ1Y3QgcHJvY2Vzc29yX2Nv c3RzIGdlb2RlX2Nvc3QgPSB7CiAgIE5VTEwsCQkJCQkvKiBKdW1wIGFsaWdubWVudC4gICovCiAg IE5VTEwsCQkJCQkvKiBMYWJlbCBhbGlnbm1lbnQuICAqLwogICBOVUxMLAkJCQkJLyogRnVuYyBh bGlnbm1lbnQuICAqLworICA0LAkJCQkJLyogU21hbGwgdW5yb2xsIGxpbWl0LiAgKi8KKyAgMiwJ CQkJCS8qIFNtYWxsIHVucm9sbCBmYWN0b3IuICAqLwogfTsKIAogc3RhdGljIHN0cmluZ29wX2Fs Z3MgazZfbWVtY3B5WzJdID0gewpAQCAtODk2LDYgKzkxMCw4IEBAIHN0cnVjdCBwcm9jZXNzb3Jf Y29zdHMgazZfY29zdCA9IHsKICAgIjMyOjg6OCIsCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8K ICAgIjA6MDo4IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjMyIiwJCQkJCS8qIEZ1 bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisg IDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIC8qIEZvciBzb21lIHJl YXNvbiwgQXRobG9uIGRlYWxzIGJldHRlciB3aXRoIFJFUCBwcmVmaXggKHJlbGF0aXZlIHRvIGxv b3BzKQpAQCAtMTAwNyw2ICsxMDIzLDggQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0cyBhdGhsb25f Y29zdCA9IHsKICAgIjE2Ojg6OCIsCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8KICAgIjA6MDo4 IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjE2IiwJCQkJCS8qIEZ1bmMgYWxpZ25t ZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisgIDIsCQkJCQkv KiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIC8qIEs4IGhhcyBvcHRpbWl6ZWQgUkVQ IGluc3RydWN0aW9uIGZvciBtZWRpdW0gc2l6ZWQgYmxvY2tzLCBidXQgZm9yIHZlcnkKQEAgLTEx MjcsNiArMTE0NSw4IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgazhfY29zdCA9IHsKICAgIjE2 Ojg6OCIsCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8KICAgIjA6MDo4IiwJCQkJLyogTGFiZWwg YWxpZ25tZW50LiAgKi8KICAgIjE2IiwJCQkJCS8qIEZ1bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJ CQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisgIDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwg ZmFjdG9yLiAgKi8KIH07CiAKIC8qIEFNREZBTTEwIGhhcyBvcHRpbWl6ZWQgUkVQIGluc3RydWN0 aW9uIGZvciBtZWRpdW0gc2l6ZWQgYmxvY2tzLCBidXQgZm9yCkBAIC0xMjU1LDYgKzEyNzUsOCBA QCBzdHJ1Y3QgcHJvY2Vzc29yX2Nvc3RzIGFtZGZhbTEwX2Nvc3QgPSB7CiAgICIzMjo4OjgiLAkJ CQkvKiBKdW1wIGFsaWdubWVudC4gICovCiAgICIwOjA6OCIsCQkJCS8qIExhYmVsIGFsaWdubWVu dC4gICovCiAgICIzMiIsCQkJCQkvKiBGdW5jIGFsaWdubWVudC4gICovCisgIDQsCQkJCQkvKiBT bWFsbCB1bnJvbGwgbGltaXQuICAqLworICAyLAkJCQkJLyogU21hbGwgdW5yb2xsIGZhY3Rvci4g ICovCiB9OwogCiAvKiAgQkRWRVIgaGFzIG9wdGltaXplZCBSRVAgaW5zdHJ1Y3Rpb24gZm9yIG1l ZGl1bSBzaXplZCBibG9ja3MsIGJ1dCBmb3IKQEAgLTEzNzYsNiArMTM5OCw4IEBAIGNvbnN0IHN0 cnVjdCBwcm9jZXNzb3JfY29zdHMgYmR2ZXJfY29zdCA9IHsKICAgIjE2Ojg6OCIsCQkJCS8qIEp1 bXAgYWxpZ25tZW50LiAgKi8KICAgIjA6MDo4IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8K ICAgIjExIiwJCQkJCS8qIEZ1bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVu cm9sbCBsaW1pdC4gICovCisgIDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07 CiAKIApAQCAtMTUyOSw2ICsxNTUzLDggQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0cyB6bnZlcjFf Y29zdCA9IHsKICAgIjE2IiwJCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8KICAgIjA6MDo4IiwJ CQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjE2IiwJCQkJCS8qIEZ1bmMgYWxpZ25tZW50 LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisgIDIsCQkJCQkvKiBT bWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIC8qICBaTlZFUjIgaGFzIG9wdGltaXplZCBS RVAgaW5zdHJ1Y3Rpb24gZm9yIG1lZGl1bSBzaXplZCBibG9ja3MsIGJ1dCBmb3IKQEAgLTE2ODYs NiArMTcxMiw4IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgem52ZXIyX2Nvc3QgPSB7CiAgICIx NiIsCQkJCQkvKiBKdW1wIGFsaWdubWVudC4gICovCiAgICIwOjA6OCIsCQkJCS8qIExhYmVsIGFs aWdubWVudC4gICovCiAgICIxNiIsCQkJCQkvKiBGdW5jIGFsaWdubWVudC4gICovCisgIDQsCQkJ CQkvKiBTbWFsbCB1bnJvbGwgbGltaXQuICAqLworICAyLAkJCQkJLyogU21hbGwgdW5yb2xsIGZh Y3Rvci4gICovCiB9OwogCiBzdHJ1Y3QgcHJvY2Vzc29yX2Nvc3RzIHpudmVyM19jb3N0ID0gewpA QCAtMTgxOCw2ICsxODQ2LDggQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0cyB6bnZlcjNfY29zdCA9 IHsKICAgIjE2IiwJCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8KICAgIjA6MDo4IiwJCQkJLyog TGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjE2IiwJCQkJCS8qIEZ1bmMgYWxpZ25tZW50LiAgKi8K KyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisgIDIsCQkJCQkvKiBTbWFsbCB1 bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIC8qIFRoaXMgdGFibGUgY3VycmVudGx5IHJlcGxpY2F0 ZXMgem52ZXIzX2Nvc3QgdGFibGUuICovCkBAIC0xOTUxLDYgKzE5ODEsOCBAQCBzdHJ1Y3QgcHJv Y2Vzc29yX2Nvc3RzIHpudmVyNF9jb3N0ID0gewogICAiMTYiLAkJCQkJLyogSnVtcCBhbGlnbm1l bnQuICAqLwogICAiMDowOjgiLAkJCQkvKiBMYWJlbCBhbGlnbm1lbnQuICAqLwogICAiMTYiLAkJ CQkJLyogRnVuYyBhbGlnbm1lbnQuICAqLworICA0LAkJCQkJLyogU21hbGwgdW5yb2xsIGxpbWl0 LiAgKi8KKyAgMiwJCQkJCS8qIFNtYWxsIHVucm9sbCBmYWN0b3IuICAqLwogfTsKIAogLyogc2t5 bGFrZV9jb3N0IHNob3VsZCBwcm9kdWNlIGNvZGUgdHVuZWQgZm9yIFNreWxha2UgZmFtaWxseSBv ZiBDUFVzLiAgKi8KQEAgLTIwNzUsNiArMjEwNyw4IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMg c2t5bGFrZV9jb3N0ID0gewogICAiMTY6MTE6OCIsCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8K ICAgIjA6MDo4IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjE2IiwJCQkJCS8qIEZ1 bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisg IDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIC8qIGljZWxha2VfY29z dCBzaG91bGQgcHJvZHVjZSBjb2RlIHR1bmVkIGZvciBJY2VsYWtlIGZhbWlseSBvZiBDUFVzLgpA QCAtMjIwMSw2ICsyMjM1LDggQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0cyBpY2VsYWtlX2Nvc3Qg PSB7CiAgICIxNjoxMTo4IiwJCQkJLyogSnVtcCBhbGlnbm1lbnQuICAqLwogICAiMDowOjgiLAkJ CQkvKiBMYWJlbCBhbGlnbm1lbnQuICAqLwogICAiMTYiLAkJCQkJLyogRnVuYyBhbGlnbm1lbnQu ICAqLworICA0LAkJCQkJLyogU21hbGwgdW5yb2xsIGxpbWl0LiAgKi8KKyAgMiwJCQkJCS8qIFNt YWxsIHVucm9sbCBmYWN0b3IuICAqLwogfTsKIAogLyogYWxkZXJsYWtlX2Nvc3Qgc2hvdWxkIHBy b2R1Y2UgY29kZSB0dW5lZCBmb3IgYWxkZXJsYWtlIGZhbWlseSBvZiBDUFVzLiAgKi8KQEAgLTIz MjEsNiArMjM1Nyw4IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgYWxkZXJsYWtlX2Nvc3QgPSB7 CiAgICIxNjoxMTo4IiwJCQkJLyogSnVtcCBhbGlnbm1lbnQuICAqLwogICAiMDowOjgiLAkJCQkv KiBMYWJlbCBhbGlnbm1lbnQuICAqLwogICAiMTYiLAkJCQkJLyogRnVuYyBhbGlnbm1lbnQuICAq LworICA0LAkJCQkJLyogU21hbGwgdW5yb2xsIGxpbWl0LiAgKi8KKyAgMiwJCQkJCS8qIFNtYWxs IHVucm9sbCBmYWN0b3IuICAqLwogfTsKIAogICAvKiBCVFZFUjEgaGFzIG9wdGltaXplZCBSRVAg aW5zdHJ1Y3Rpb24gZm9yIG1lZGl1bSBzaXplZCBibG9ja3MsIGJ1dCBmb3IKQEAgLTI0MzQsNiAr MjQ3Miw4IEBAIGNvbnN0IHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgYnR2ZXIxX2Nvc3QgPSB7CiAg ICIxNjo4OjgiLAkJCQkvKiBKdW1wIGFsaWdubWVudC4gICovCiAgICIwOjA6OCIsCQkJCS8qIExh YmVsIGFsaWdubWVudC4gICovCiAgICIxMSIsCQkJCQkvKiBGdW5jIGFsaWdubWVudC4gICovCisg IDQsCQkJCQkvKiBTbWFsbCB1bnJvbGwgbGltaXQuICAqLworICAyLAkJCQkJLyogU21hbGwgdW5y b2xsIGZhY3Rvci4gICovCiB9OwogCiBzdGF0aWMgc3RyaW5nb3BfYWxncyBidHZlcjJfbWVtY3B5 WzJdID0gewpAQCAtMjU0NCw2ICsyNTg0LDggQEAgY29uc3Qgc3RydWN0IHByb2Nlc3Nvcl9jb3N0 cyBidHZlcjJfY29zdCA9IHsKICAgIjE2Ojg6OCIsCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8K ICAgIjA6MDo4IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjExIiwJCQkJCS8qIEZ1 bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisg IDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIHN0YXRpYyBzdHJpbmdv cF9hbGdzIHBlbnRpdW00X21lbWNweVsyXSA9IHsKQEAgLTI2NTMsNiArMjY5NSw4IEBAIHN0cnVj dCBwcm9jZXNzb3JfY29zdHMgcGVudGl1bTRfY29zdCA9IHsKICAgTlVMTCwJCQkJCS8qIEp1bXAg YWxpZ25tZW50LiAgKi8KICAgTlVMTCwJCQkJCS8qIExhYmVsIGFsaWdubWVudC4gICovCiAgIE5V TEwsCQkJCQkvKiBGdW5jIGFsaWdubWVudC4gICovCisgIDQsCQkJCQkvKiBTbWFsbCB1bnJvbGwg bGltaXQuICAqLworICAyLAkJCQkJLyogU21hbGwgdW5yb2xsIGZhY3Rvci4gICovCiB9OwogCiBz dGF0aWMgc3RyaW5nb3BfYWxncyBub2NvbmFfbWVtY3B5WzJdID0gewpAQCAtMjc2NSw2ICsyODA5 LDggQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0cyBub2NvbmFfY29zdCA9IHsKICAgTlVMTCwJCQkJ CS8qIEp1bXAgYWxpZ25tZW50LiAgKi8KICAgTlVMTCwJCQkJCS8qIExhYmVsIGFsaWdubWVudC4g ICovCiAgIE5VTEwsCQkJCQkvKiBGdW5jIGFsaWdubWVudC4gICovCisgIDQsCQkJCQkvKiBTbWFs bCB1bnJvbGwgbGltaXQuICAqLworICAyLAkJCQkJLyogU21hbGwgdW5yb2xsIGZhY3Rvci4gICov CiB9OwogCiBzdGF0aWMgc3RyaW5nb3BfYWxncyBhdG9tX21lbWNweVsyXSA9IHsKQEAgLTI4NzUs NiArMjkyMSw4IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgYXRvbV9jb3N0ID0gewogICAiMTY6 ODo4IiwJCQkJLyogSnVtcCBhbGlnbm1lbnQuICAqLwogICAiMDowOjgiLAkJCQkvKiBMYWJlbCBh bGlnbm1lbnQuICAqLwogICAiMTYiLAkJCQkJLyogRnVuYyBhbGlnbm1lbnQuICAqLworICA0LAkJ CQkJLyogU21hbGwgdW5yb2xsIGxpbWl0LiAgKi8KKyAgMiwJCQkJCS8qIFNtYWxsIHVucm9sbCBm YWN0b3IuICAqLwogfTsKIAogc3RhdGljIHN0cmluZ29wX2FsZ3Mgc2xtX21lbWNweVsyXSA9IHsK QEAgLTI5ODUsNiArMzAzMyw4IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgc2xtX2Nvc3QgPSB7 CiAgICIxNjo4OjgiLAkJCQkvKiBKdW1wIGFsaWdubWVudC4gICovCiAgICIwOjA6OCIsCQkJCS8q IExhYmVsIGFsaWdubWVudC4gICovCiAgICIxNiIsCQkJCQkvKiBGdW5jIGFsaWdubWVudC4gICov CisgIDQsCQkJCQkvKiBTbWFsbCB1bnJvbGwgbGltaXQuICAqLworICAyLAkJCQkJLyogU21hbGwg dW5yb2xsIGZhY3Rvci4gICovCiB9OwogCiBzdGF0aWMgc3RyaW5nb3BfYWxncyB0cmVtb250X21l bWNweVsyXSA9IHsKQEAgLTMxMDksNiArMzE1OSw4IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMg dHJlbW9udF9jb3N0ID0gewogICAiMTY6MTE6OCIsCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8K ICAgIjA6MDo4IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjE2IiwJCQkJCS8qIEZ1 bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisg IDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIHN0YXRpYyBzdHJpbmdv cF9hbGdzIGludGVsX21lbWNweVsyXSA9IHsKQEAgLTMyMTksNiArMzI3MSw4IEBAIHN0cnVjdCBw cm9jZXNzb3JfY29zdHMgaW50ZWxfY29zdCA9IHsKICAgIjE2Ojg6OCIsCQkJCS8qIEp1bXAgYWxp Z25tZW50LiAgKi8KICAgIjA6MDo4IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjE2 IiwJCQkJCS8qIEZ1bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBs aW1pdC4gICovCisgIDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIC8q IGx1amlhenVpX2Nvc3Qgc2hvdWxkIHByb2R1Y2UgY29kZSB0dW5lZCBmb3IgWkhBT1hJTiBsdWpp YXp1aSBDUFUuICAqLwpAQCAtMzMzNCw2ICszMzg4LDggQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0 cyBsdWppYXp1aV9jb3N0ID0gewogICAiMTY6MTE6OCIsCQkJCS8qIEp1bXAgYWxpZ25tZW50LiAg Ki8KICAgIjA6MDo4IiwJCQkJLyogTGFiZWwgYWxpZ25tZW50LiAgKi8KICAgIjE2IiwJCQkJCS8q IEZ1bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8qIFNtYWxsIHVucm9sbCBsaW1pdC4gICov CisgIDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9yLiAgKi8KIH07CiAKIC8qIEdlbmVyaWMg c2hvdWxkIHByb2R1Y2UgY29kZSB0dW5lZCBmb3IgQ29yZS1pNyAoYW5kIG5ld2VyIGNoaXBzKQpA QCAtMzQ1Myw2ICszNTA5LDggQEAgc3RydWN0IHByb2Nlc3Nvcl9jb3N0cyBnZW5lcmljX2Nvc3Qg PSB7CiAgICIxNjoxMTo4IiwJCQkJLyogSnVtcCBhbGlnbm1lbnQuICAqLwogICAiMDowOjgiLAkJ CQkvKiBMYWJlbCBhbGlnbm1lbnQuICAqLwogICAiMTYiLAkJCQkJLyogRnVuYyBhbGlnbm1lbnQu ICAqLworICA0LAkJCQkJLyogU21hbGwgdW5yb2xsIGxpbWl0LiAgKi8KKyAgMiwJCQkJCS8qIFNt YWxsIHVucm9sbCBmYWN0b3IuICAqLwogfTsKIAogLyogY29yZV9jb3N0IHNob3VsZCBwcm9kdWNl IGNvZGUgdHVuZWQgZm9yIENvcmUgZmFtaWxseSBvZiBDUFVzLiAgKi8KQEAgLTM1NzksNSArMzYz Nyw3IEBAIHN0cnVjdCBwcm9jZXNzb3JfY29zdHMgY29yZV9jb3N0ID0gewogICAiMTY6MTE6OCIs CQkJCS8qIEp1bXAgYWxpZ25tZW50LiAgKi8KICAgIjA6MDo4IiwJCQkJLyogTGFiZWwgYWxpZ25t ZW50LiAgKi8KICAgIjE2IiwJCQkJCS8qIEZ1bmMgYWxpZ25tZW50LiAgKi8KKyAgNCwJCQkJCS8q IFNtYWxsIHVucm9sbCBsaW1pdC4gICovCisgIDIsCQkJCQkvKiBTbWFsbCB1bnJvbGwgZmFjdG9y LiAgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2djYy9kb2MvaW52b2tlLnRleGkgYi9nY2MvZG9jL2lu dm9rZS50ZXhpCmluZGV4IDk3NWVlNjQxMDNmLi5kOTQwMjhlNGEyNSAxMDA2NDQKLS0tIGEvZ2Nj L2RvYy9pbnZva2UudGV4aQorKysgYi9nY2MvZG9jL2ludm9rZS50ZXhpCkBAIC0yNTI2Miw2ICsy NTI2MiwxNCBAQCBlbnZpcm9ubWVudHMgd2hlcmUgbm8gZHluYW1pYyBsaW5rIGlzIHBlcmZvcm1l ZCwgbGlrZSBmaXJtd2FyZXMsIE9TCiBrZXJuZWxzLCBleGVjdXRhYmxlcyBsaW5rZWQgd2l0aCBA b3B0aW9uey1zdGF0aWN9IG9yIEBvcHRpb257LXN0YXRpYy1waWV9LgogQG9wdGlvbnstbWRpcmVj dC1leHRlcm4tYWNjZXNzfSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEBvcHRpb257LWZQSUN9IG9y CiBAb3B0aW9uey1mcGljfS4KKworQGl0ZW0gLW11bnJvbGwtb25seS1zbWFsbC1sb29wcworQGl0 ZW14IC1tbm8tdW5yb2xsLW9ubHktc21hbGwtbG9vcHMKK0BvcGluZGV4IG11bnJvbGwtb25seS1z bWFsbC1sb29wcworQ29udHJvbHMgY29uc2VydmF0aXZlIHNtYWxsIGxvb3AgdW5yb2xsaW5nLiBJ dCBpcyBkZWZhdWx0IGVuYmFsZWQgYnkKK08yLCBhbmQgdW5yb2xscyBsb29wIHdpdGggbGVzcyB0 aGFuIDQgaW5zbnMgYnkgMSB0aW1lLiBFeHBsaWNpdAorLWZbbm8tXXVucm9sbC1bYWxsLV1sb29w cyB3b3VsZCBkaXNhYmxlIHRoaXMgZmxhZyB0byBhdm9pZCBhbnkKK3VuaW50ZW5kZWQgdW5yb2xs aW5nIGJlaGF2aW9yIHRoYXQgdXNlciBkb2VzIG5vdCB3YW50LgogQGVuZCB0YWJsZQogCiBAbm9k ZSBNMzJDIE9wdGlvbnMKZGlmZiAtLWdpdCBhL2djYy9sb29wLWluaXQuY2MgYi9nY2MvbG9vcC1p bml0LmNjCmluZGV4IGI5ZTA3OTczZGQ2Li45Nzg5ZWZhMWUxMSAxMDA2NDQKLS0tIGEvZ2NjL2xv b3AtaW5pdC5jYworKysgYi9nY2MvbG9vcC1pbml0LmNjCkBAIC01NjUsOSArNTY1LDEyIEBAIHB1 YmxpYzoKICAge30KIAogICAvKiBvcHRfcGFzcyBtZXRob2RzOiAqLwotICBib29sIGdhdGUgKGZ1 bmN0aW9uICopIGZpbmFsIG92ZXJyaWRlCisgIGJvb2wgZ2F0ZSAoZnVuY3Rpb24gKmZ1bikgZmlu YWwgb3ZlcnJpZGUKICAgICB7Ci0gICAgICByZXR1cm4gKGZsYWdfdW5yb2xsX2xvb3BzIHx8IGZs YWdfdW5yb2xsX2FsbF9sb29wcyB8fCBjZnVuLT5oYXNfdW5yb2xsKTsKKyAgICAgIHJldHVybiAo ZmxhZ191bnJvbGxfbG9vcHMgfHwgZmxhZ191bnJvbGxfYWxsX2xvb3BzIHx8IGNmdW4tPmhhc191 bnJvbGwKKwkgICAgICB8fCAodGFyZ2V0bS5sb29wX3Vucm9sbF9hZGp1c3QKKwkJICAmJiBvcHRp bWl6ZSA+PSAyCisJCSAgJiYgb3B0aW1pemVfZnVuY3Rpb25fZm9yX3NwZWVkX3AgKGZ1bikpKTsK ICAgICB9CiAKICAgdW5zaWduZWQgaW50IGV4ZWN1dGUgKGZ1bmN0aW9uICopIGZpbmFsIG92ZXJy aWRlOwpAQCAtNTgzLDcgKzU4Niw4IEBAIHBhc3NfcnRsX3Vucm9sbF9sb29wczo6ZXhlY3V0ZSAo ZnVuY3Rpb24gKmZ1bikKICAgICAgIGlmIChkdW1wX2ZpbGUpCiAJZGZfZHVtcCAoZHVtcF9maWxl KTsKIAotICAgICAgaWYgKGZsYWdfdW5yb2xsX2xvb3BzKQorICAgICAgaWYgKGZsYWdfdW5yb2xs X2xvb3BzCisJICB8fCB0YXJnZXRtLmxvb3BfdW5yb2xsX2FkanVzdCkKIAlmbGFncyB8PSBVQVBf VU5ST0xMOwogICAgICAgaWYgKGZsYWdfdW5yb2xsX2FsbF9sb29wcykKIAlmbGFncyB8PSBVQVBf VU5ST0xMX0FMTDsKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2d1YWxpdHkvbG9v cC0xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9ndWFsaXR5L2xvb3AtMS5jCmluZGV4IDFiMWY2 ZDMyMjcxLi5hMzJlYTQ0NWEzZiAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZ3Vh bGl0eS9sb29wLTEuYworKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9ndWFsaXR5L2xvb3AtMS5j CkBAIC0xLDUgKzEsNyBAQAogLyogeyBkZy1kbyBydW4gfSAqLwogLyogeyBkZy1vcHRpb25zICIt Zm5vLXRyZWUtc2Nldi1jcHJvcCAtZm5vLXRyZWUtdmVjdG9yaXplIC1nIiB9ICovCisvKiB7IGRn LWFkZGl0aW9uYWwtb3B0aW9ucyAiLW1uby11bnJvbGwtb25seS1zbWFsbC1sb29wcyIgeyB0YXJn ZXQgaWEzMiB9IH0gKi8KKwogCiAjaW5jbHVkZSAiLi4vbm9wLmgiCiAKZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODYyNzAuYyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9pMzg2L3ByODYyNzAuYwppbmRleCA4MTg0MWVmNWJkNy4uY2JjOWZiYjA0NTAgMTAw NjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODYyNzAuYworKysgYi9n Y2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg2MjcwLmMKQEAgLTEsNSArMSw1IEBACiAv KiB7IGRnLWRvIGNvbXBpbGUgfSAqLwotLyogeyBkZy1vcHRpb25zICItTzIiIH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1tbm8tdW5yb2xsLW9ubHktc21hbGwtbG9vcHMiIH0gKi8KIAogaW50 ICphOwogbG9uZyBsZW47CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4 Ni9wcjkzMDAyLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjkzMDAyLmMKaW5k ZXggMDI0OGZjYzAwYTUuLmY3NWE4NDdmNzVkIDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjkzMDAyLmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvcHI5MzAwMi5jCkBAIC0xLDYgKzEsNiBAQAogLyogUFIgdGFyZ2V0LzkzMDAyICovCiAvKiB7 IGRnLWRvIGNvbXBpbGUgfSAqLwotLyogeyBkZy1vcHRpb25zICItTzIiIH0gKi8KKy8qIHsgZGct b3B0aW9ucyAiLU8yIC1tbm8tdW5yb2xsLW9ubHktc21hbGwtbG9vcHMiIH0gKi8KIC8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgImNtcFxbXlxuXHJdKi0xIiB9IH0gKi8KIAogdm9s YXRpbGUgaW50IHNpbms7Ci0tIAoyLjE4LjEKCg== --000000000000fdb46405ecff96fe--